def build(self, _out_dir, dist_dir, args): temp_dir = tempfile.mkdtemp() try: path = build_support.android_path('prebuilts/ndk/platform/sysroot') install_path = os.path.join(temp_dir, 'sysroot') shutil.copytree(path, install_path) if args.system != 'linux': # linux/netfilter has some headers with names that differ only # by case, which can't be extracted to a case-insensitive # filesystem, which are the defaults for Darwin and Windows :( # # There isn't really a good way to decide which of these to # keep and which to remove. The capitalized versions expose # different APIs, but we can't keep both. So far no one has # filed bugs about needing either API, so let's just dedup them # consistently and we can change that if we hear otherwise. remove_paths = [ 'usr/include/linux/netfilter_ipv4/ipt_ECN.h', 'usr/include/linux/netfilter_ipv4/ipt_TTL.h', 'usr/include/linux/netfilter_ipv6/ip6t_HL.h', 'usr/include/linux/netfilter/xt_CONNMARK.h', 'usr/include/linux/netfilter/xt_DSCP.h', 'usr/include/linux/netfilter/xt_MARK.h', 'usr/include/linux/netfilter/xt_RATEEST.h', 'usr/include/linux/netfilter/xt_TCPMSS.h', ] for remove_path in remove_paths: os.remove(os.path.join(install_path, remove_path)) build_support.make_package('sysroot', install_path, dist_dir) finally: shutil.rmtree(temp_dir)
def install_arch(self, out_dir, host, arch): version = '4.9' toolchain = build_support.arch_to_toolchain(arch) host_tag = build_support.host_to_tag(host) install_path = self.get_install_path(out_dir, host, arch) toolchain_name = toolchain + '-' + version prebuilt_path = get_gcc_prebuilt_path(host_tag) toolchain_path = os.path.join(prebuilt_path, toolchain_name) ndk.builds.install_directory(toolchain_path, install_path) if not host.startswith('windows'): so = '.so' if host == 'darwin': so = '.dylib' clang_libs = build_support.android_path( 'prebuilts/ndk/current/toolchains', host_tag, 'llvm/lib64') llvmgold = os.path.join(clang_libs, 'LLVMgold' + so) libcxx = os.path.join(clang_libs, 'libc++' + so) libllvm = os.path.join(clang_libs, 'libLLVM' + so) bfd_plugins = os.path.join(install_path, 'lib/bfd-plugins') os.makedirs(bfd_plugins) shutil.copy2(llvmgold, bfd_plugins) # The rpath on LLVMgold.so is ../lib64, so we have to install to # lib/lib64 to have it be in the right place :( lib_dir = os.path.join(install_path, 'lib/lib64') os.makedirs(lib_dir) shutil.copy2(libcxx, lib_dir) shutil.copy2(libllvm, lib_dir)
def get_gcc_prebuilt_path(host): rel_prebuilt_path = 'prebuilts/ndk/current/toolchains/{}'.format(host) prebuilt_path = build_support.android_path(rel_prebuilt_path) if not os.path.isdir(prebuilt_path): raise RuntimeError( 'Could not find prebuilt GCC at {}'.format(prebuilt_path)) return prebuilt_path
def build(self, _build_dir, dist_dir, _args): # Stage the files in a temporary directory to make things easier. temp_dir = tempfile.mkdtemp() try: path = os.path.join(temp_dir, 'python-packages') shutil.copytree( build_support.android_path('development/python-packages'), path) build_support.make_package('python-packages', path, dist_dir) finally: shutil.rmtree(temp_dir)
def get_prebuilt_path(self, host): # The 32-bit Windows Clang is a part of the 64-bit Clang package in # prebuilts/clang. platform_host_tag = host + '-x86' if platform_host_tag.startswith('windows'): platform_host_tag = 'windows-x86' rel_prebuilt_path = 'prebuilts/clang/host/{}'.format(platform_host_tag) prebuilt_path = os.path.join(build_support.android_path(), rel_prebuilt_path, self.version) if not os.path.isdir(prebuilt_path): raise RuntimeError( 'Could not find prebuilt LLVM at {}'.format(prebuilt_path)) return prebuilt_path
def package_host_tools(out_dir, dist_dir, host): packages = [ 'gdb-multiarch-7.11', 'ndk-depends', 'ndk-make', 'ndk-python', 'ndk-stack', 'ndk-yasm', ] files = [ 'ndk-gdb', 'ndk-gdb.py', 'ndk-which', ] if host in ('windows', 'windows64'): packages.append('toolbox') files.append('ndk-gdb.cmd') host_tag = build_support.host_to_tag(host) package_names = [p + '-' + host_tag + '.tar.bz2' for p in packages] for package_name in package_names: package_path = os.path.join(out_dir, package_name) subprocess.check_call(['tar', 'xf', package_path, '-C', out_dir]) for f in files: shutil.copy2(f, os.path.join(out_dir, 'host-tools/bin')) build_support.merge_license_files( os.path.join(out_dir, 'host-tools/NOTICE'), [ build_support.android_path('toolchain/gdb/gdb-7.11/COPYING'), build_support.ndk_path('sources/host-tools/ndk-depends/NOTICE'), build_support.ndk_path('sources/host-tools/make-3.81/COPYING'), build_support.android_path( 'toolchain/python/Python-2.7.5/LICENSE'), build_support.ndk_path('sources/host-tools/ndk-stack/NOTICE'), build_support.ndk_path('sources/host-tools/toolbox/NOTICE'), build_support.android_path('toolchain/yasm/COPYING'), build_support.android_path('toolchain/yasm/BSD.txt'), build_support.android_path('toolchain/yasm/Artistic.txt'), build_support.android_path('toolchain/yasm/GNU_GPL-2.0'), build_support.android_path('toolchain/yasm/GNU_LGPL-2.0'), ]) package_name = 'host-tools-' + host_tag path = os.path.join(out_dir, 'host-tools') build_support.make_package(package_name, path, dist_dir)
def build(self, out_dir, dist_dir, _args): print('Building simpleperf...') install_dir = os.path.join(out_dir, 'simpleperf') if os.path.exists(install_dir): shutil.rmtree(install_dir) os.makedirs(install_dir) simpleperf_path = build_support.android_path('prebuilts/simpleperf') shutil.copytree(os.path.join(simpleperf_path, 'bin'), os.path.join(install_dir, 'bin')) for item in os.listdir(simpleperf_path): should_copy = False if item.endswith('.py') and item != 'update.py': should_copy = True elif item.endswith('.config'): should_copy = True if should_copy: shutil.copy2(os.path.join(simpleperf_path, item), install_dir) shutil.copy2(os.path.join(simpleperf_path, 'README.md'), install_dir) shutil.copy2(os.path.join(simpleperf_path, 'NOTICE'), install_dir) build_support.make_package('simpleperf', install_dir, dist_dir)
class Libcxxabi(ndk.builds.PackageModule): name = 'libc++abi' path = 'sources/cxx-stl/llvm-libc++abi' src = build_support.android_path('external/libcxxabi') create_repo_prop = True
def build(self, out_dir, dist_dir, args): print('Constructing Vulkan validation layer source...') vulkan_root_dir = build_support.android_path( 'external/vulkan-validation-layers') copies = [ { 'source_dir': vulkan_root_dir, 'dest_dir': 'vulkan/src', 'files': [ 'vk-generate.py', 'vk_helper.py', 'generator.py', 'lvl_genvk.py', 'threading_generator.py', 'parameter_validation_generator.py', 'unique_objects_generator.py', 'reg.py', 'source_line_info.py', 'vulkan.py', 'vk.xml' ], 'dirs': [ 'layers', 'include', 'tests', 'common', 'libs' ], }, { 'source_dir': vulkan_root_dir + '/loader', 'dest_dir': 'vulkan/src/loader', 'files': [ 'vk_loader_platform.h', 'vk_loader_layer.h' ], 'dirs': [], } ] default_ignore_patterns = shutil.ignore_patterns( "*CMakeLists.txt", "*test.cc", "linux", "windows") base_vulkan_path = os.path.join(out_dir, 'vulkan') vulkan_path = os.path.join(base_vulkan_path, 'src') for properties in copies: source_dir = properties['source_dir'] dest_dir = os.path.join(out_dir, properties['dest_dir']) for d in properties['dirs']: src = os.path.join(source_dir, d) dst = os.path.join(dest_dir, d) shutil.rmtree(dst, True) shutil.copytree(src, dst, ignore=default_ignore_patterns) for f in properties['files']: install_file(f, source_dir, dest_dir) # Copy Android build components print('Copying Vulkan build components...') src = os.path.join(vulkan_root_dir, 'build-android') dst = os.path.join(vulkan_path, 'build-android') shutil.rmtree(dst, True) shutil.copytree(src, dst, ignore=default_ignore_patterns) print('Copying finished') # Copy binary validation layer libraries print('Copying Vulkan binary validation layers...') src = build_support.android_path( 'prebuilts/ndk/vulkan-validation-layers') dst = os.path.join(vulkan_path, 'build-android/jniLibs') shutil.rmtree(dst, True) shutil.copytree(src, dst, ignore=default_ignore_patterns) print('Copying finished') build_support.merge_license_files( os.path.join(base_vulkan_path, 'NOTICE'), [os.path.join(vulkan_root_dir, 'LICENSE.txt')]) build_cmd = [ 'bash', vulkan_path + '/build-android/android-generate.sh' ] print('Generating generated layers...') subprocess.check_call(build_cmd) print('Generation finished') build_args = common_build_args(out_dir, dist_dir, args) if args.arch is not None: build_args.append('--arch={}'.format(args.arch)) build_args.append('--no-symbols') # TODO: Verify source packaged properly print('Packaging Vulkan source...') src = os.path.join(out_dir, 'vulkan') build_support.make_package('vulkan', src, dist_dir) print('Packaging Vulkan source finished')
def build(self, _build_dir, dist_dir, _args): shaderc_root_dir = build_support.android_path('external/shaderc') copies = [ { 'source_dir': os.path.join(shaderc_root_dir, 'shaderc'), 'dest_dir': 'shaderc', 'files': [ 'Android.mk', 'libshaderc/Android.mk', 'libshaderc_util/Android.mk', 'third_party/Android.mk', 'utils/update_build_version.py', 'CHANGES', ], 'dirs': [ 'libshaderc/include', 'libshaderc/src', 'libshaderc_util/include', 'libshaderc_util/src', ], }, { 'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'), 'dest_dir': 'shaderc/third_party/spirv-tools', 'files': [ 'utils/generate_grammar_tables.py', 'utils/generate_registry_tables.py', 'utils/update_build_version.py', 'CHANGES', ], 'dirs': ['include', 'source'], }, { 'source_dir': os.path.join(shaderc_root_dir, 'spirv-headers'), 'dest_dir': 'shaderc/third_party/spirv-tools/external/spirv-headers', 'dirs': ['include'], 'files': [ 'include/spirv/1.0/spirv.py', 'include/spirv/1.1/spirv.py' ], }, { 'source_dir': os.path.join(shaderc_root_dir, 'glslang'), 'dest_dir': 'shaderc/third_party/glslang', 'files': ['glslang/OSDependent/osinclude.h'], 'dirs': [ 'SPIRV', 'OGLCompilersDLL', 'glslang/GenericCodeGen', 'hlsl', 'glslang/Include', 'glslang/MachineIndependent', 'glslang/OSDependent/Unix', 'glslang/Public', ], }, ] default_ignore_patterns = shutil.ignore_patterns( "*CMakeLists.txt", "*.py", "*test.h", "*test.cc") temp_dir = tempfile.mkdtemp() shaderc_path = os.path.join(temp_dir, 'shaderc') try: for properties in copies: source_dir = properties['source_dir'] dest_dir = os.path.join(temp_dir, properties['dest_dir']) for d in properties['dirs']: src = os.path.join(source_dir, d) dst = os.path.join(dest_dir, d) print(src, " -> ", dst) shutil.copytree(src, dst, ignore=default_ignore_patterns) for f in properties['files']: print(source_dir, ':', dest_dir, ":", f) # Only copy if the source file exists. That way # we can update this script in anticipation of # source files yet-to-come. if os.path.exists(os.path.join(source_dir, f)): install_file(f, source_dir, dest_dir) else: print(source_dir, ':', dest_dir, ":", f, "SKIPPED") shaderc_shaderc_dir = os.path.join(shaderc_root_dir, 'shaderc') build_support.merge_license_files( os.path.join(shaderc_path, 'NOTICE'), [ os.path.join(shaderc_shaderc_dir, 'LICENSE'), os.path.join(shaderc_shaderc_dir, 'third_party', 'LICENSE.spirv-tools'), os.path.join(shaderc_shaderc_dir, 'third_party', 'LICENSE.glslang')]) build_support.make_package('libshaderc', shaderc_path, dist_dir) finally: shutil.rmtree(temp_dir)