def run_distribute(self): info_main('# Creating Android project from build and {} bootstrap'.format( self.name)) info('This currently just copies the build stuff straight from the build dir.') shprint(sh.rm, '-rf', self.dist_dir) shprint(sh.cp, '-r', self.build_dir, self.dist_dir) with current_directory(self.dist_dir): with open('local.properties', 'w') as fileh: fileh.write('sdk.dir={}'.format(self.ctx.sdk_dir)) arch = self.ctx.archs[0] if len(self.ctx.archs) > 1: raise ValueError('built for more than one arch, but bootstrap cannot handle that yet') info('Bootstrap running with arch {}'.format(arch)) with current_directory(self.dist_dir): info('Copying python distribution') self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_aars(arch) self.distribute_javaclasses(self.ctx.javaclass_dir) python_bundle_dir = join('_python_bundle', '_python_bundle') ensure_dir(python_bundle_dir) site_packages_dir = self.ctx.python_recipe.create_python_bundle( join(self.dist_dir, python_bundle_dir), arch) if 'sqlite3' not in self.ctx.recipe_build_order: with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(ServiceOnlyBootstrap, self).run_distribute()
def run_distribute(self): info_main('# Creating Android project from build and {} bootstrap'.format( self.name)) shprint(sh.rm, '-rf', self.dist_dir) shprint(sh.cp, '-r', self.build_dir, self.dist_dir) with current_directory(self.dist_dir): with open('local.properties', 'w') as fileh: fileh.write('sdk.dir={}'.format(self.ctx.sdk_dir)) arch = self.ctx.archs[0] if len(self.ctx.archs) > 1: raise ValueError('built for more than one arch, but bootstrap cannot handle that yet') info('Bootstrap running with arch {}'.format(arch)) with current_directory(self.dist_dir): info('Copying python distribution') self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_aars(arch) self.distribute_javaclasses(self.ctx.javaclass_dir) python_bundle_dir = join('_python_bundle', '_python_bundle') ensure_dir(python_bundle_dir) site_packages_dir = self.ctx.python_recipe.create_python_bundle( join(self.dist_dir, python_bundle_dir), arch) if 'sqlite3' not in self.ctx.recipe_build_order: with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(WebViewBootstrap, self).run_distribute()
def run_distribute(self): info_main("# Creating Android project ({})".format(self.name)) arch = self.ctx.archs[0] python_install_dir = self.ctx.get_python_install_dir() from_crystax = self.ctx.python_recipe.from_crystax if len(self.ctx.archs) > 1: raise ValueError("SDL2/gradle support only one arch") info("Copying SDL2/gradle build for {}".format(arch)) shprint(sh.rm, "-rf", self.dist_dir) shprint(sh.cp, "-r", self.build_dir, self.dist_dir) # either the build use environment variable (ANDROID_HOME) # or the local.properties if exists with current_directory(self.dist_dir): with open('local.properties', 'w') as fileh: fileh.write('sdk.dir={}'.format(self.ctx.sdk_dir)) with current_directory(self.dist_dir): info("Copying Python distribution") hostpython = sh.Command(self.ctx.hostpython) if self.ctx.python_recipe.name == 'python2': try: shprint(hostpython, '-OO', '-m', 'compileall', python_install_dir, _tail=10, _filterout="^Listing") except sh.ErrorReturnCode: pass if 'python2' in self.ctx.recipe_build_order and not exists('python-install'): shprint( sh.cp, '-a', python_install_dir, './python-install') self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_javaclasses(self.ctx.javaclass_dir, dest_dir=join("src", "main", "java")) python_bundle_dir = join('_python_bundle', '_python_bundle') if 'python2' in self.ctx.recipe_build_order: # Python 2 is a special case with its own packaging location python_bundle_dir = 'private' ensure_dir(python_bundle_dir) site_packages_dir = self.ctx.python_recipe.create_python_bundle( join(self.dist_dir, python_bundle_dir), arch) if 'sqlite3' not in self.ctx.recipe_build_order: with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(SDL2GradleBootstrap, self).run_distribute()
def create_python_bundle(self, dirn, arch): ndk_dir = self.ctx.ndk_dir # Bundle compiled python modules to a folder modules_dir = join(dirn, 'modules') ensure_dir(modules_dir) modules_build_dir = join( self.get_build_dir(arch.arch), 'android-build', 'build', 'lib.linux-arm-3.7') module_filens = (glob.glob(join(modules_build_dir, '*.so')) + glob.glob(join(modules_build_dir, '*.py'))) for filen in module_filens: shprint(sh.cp, filen, modules_dir) # zip up the standard library stdlib_zip = join(dirn, 'stdlib.zip') with current_directory(join(self.get_build_dir(arch.arch), 'Lib')): stdlib_filens = walk_valid_filens( '.', STDLIB_DIR_BLACKLIST, STDLIB_FILEN_BLACKLIST) shprint(sh.zip, stdlib_zip, *stdlib_filens) # copy the site-packages into place ensure_dir(join(dirn, 'site-packages')) # TODO: Improve the API around walking and copying the files with current_directory(self.ctx.get_python_install_dir()): filens = list(walk_valid_filens( '.', SITE_PACKAGES_DIR_BLACKLIST, SITE_PACKAGES_FILEN_BLACKLIST)) for filen in filens: ensure_dir(join(dirn, 'site-packages', dirname(filen))) sh.cp(filen, join(dirn, 'site-packages', filen)) # copy the python .so files into place python_build_dir = join(self.get_build_dir(arch.arch), 'android-build') shprint(sh.cp, join(python_build_dir, 'libpython{}m.so'.format(self.major_minor_version_string)), 'libs/{}'.format(arch.arch)) shprint(sh.cp, join(python_build_dir, 'libpython{}m.so.1.0'.format(self.major_minor_version_string)), 'libs/{}'.format(arch.arch)) info('Renaming .so files to reflect cross-compile') self.reduce_object_file_names(join(dirn, 'site-packages')) return join(dirn, 'site-packages')
def build_arch(self, arch): super(Libxml2Recipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): if not exists('configure'): shprint(sh.Command('./autogen.sh'), _env=env) shprint(sh.Command('autoreconf'), '-vif', _env=env) build_arch = shprint( sh.gcc, '-dumpmachine').stdout.decode('utf-8').split('\n')[0] shprint(sh.Command('./configure'), '--build=' + build_arch, '--host=' + arch.command_prefix, '--target=' + arch.command_prefix, '--without-modules', '--without-legacy', '--without-history', '--without-debug', '--without-docbook', '--without-python', '--without-threads', '--without-iconv', '--disable-shared', '--enable-static', _env=env) # Ensure we only build libxml2.la as if we do everything # we'll need the glob dependency which is a big headache shprint(sh.make, "libxml2.la", _env=env) shutil.copyfile('.libs/libxml2.a', join(self.ctx.libs_dir, 'libxml2.a'))
def build_armeabi(self): # AND: Should use an i386 recipe system warning('Running hostpython build. Arch is armeabi! ' 'This is naughty, need to fix the Arch system!') # AND: Fix armeabi again with current_directory(self.get_build_dir('armeabi')): if exists('hostpython'): info('hostpython already exists, skipping build') self.ctx.hostpython = join(self.get_build_dir('armeabi'), 'hostpython') self.ctx.hostpgen = join(self.get_build_dir('armeabi'), 'hostpgen') return configure = sh.Command('./configure') shprint(configure) shprint(sh.make, '-j5') shprint(sh.mv, join('Parser', 'pgen'), 'hostpgen') if exists('python.exe'): shprint(sh.mv, 'python.exe', 'hostpython') elif exists('python'): shprint(sh.mv, 'python', 'hostpython') else: warning('Unable to find the python executable after ' 'hostpython build! Exiting.') exit(1) self.ctx.hostpython = join(self.get_build_dir('armeabi'), 'hostpython') self.ctx.hostpgen = join(self.get_build_dir('armeabi'), 'hostpgen')
def build_compiled_components(self, arch): info('Building compiled components in {}'.format(self.name)) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # Build M2Crypto hostpython = sh.Command(self.hostpython_location) if self.install_in_hostpython: shprint(hostpython, 'setup.py', 'clean', '--all', _env=env) shprint(hostpython, 'setup.py', self.build_cmd, '-p' + arch.arch, '-c' + 'unix', '-o' + env['OPENSSL_BUILD_PATH'], '-L' + env['OPENSSL_BUILD_PATH'], _env=env, *self.setup_extra_args) build_dir = glob.glob('build/lib.*')[0] shprint(sh.find, build_dir, '-name', '"*.o"', '-exec', env['STRIP'], '{}', ';', _env=env)
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') buildarch = self.select_build_arch(arch) # XXX if we don't have no-asm, using clang and ndk-15c, i got: # crypto/aes/bsaes-armv7.S:1372:14: error: immediate operand must be in the range [0,4095] # add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 # ^ # crypto/aes/bsaes-armv7.S:1434:14: error: immediate operand must be in the range [0,4095] # sub r6, r8, #.LREVM0SR-.LSR @ pass constants shprint(perl, 'Configure', 'shared', 'no-dso', 'no-asm', buildarch, _env=env) self.apply_patch('disable-sover.patch', arch.arch) # check_ssl = partial(self.check_symbol, env, 'libssl' + self.version + '.so') check_crypto = partial(self.check_symbol, env, 'libcrypto' + self.lib_version + '.so') while True: shprint(sh.make, 'build_libs', _env=env) if all(map(check_crypto, ('MD5_Transform', 'MD4_Init'))): break import time time.sleep(3) shprint(sh.make, 'clean', _env=env) self.install_libs(arch, 'libssl' + self.lib_version + '.so', 'libcrypto' + self.lib_version + '.so')
def build_arch(self, arch): super(LibxsltRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # If the build is done with /bin/sh things blow up, # try really hard to use bash env['CC'] += " -I%s" % self.get_build_dir(arch.arch) libxml = dirname(dirname(self.get_build_container_dir( arch.arch))) + "/libxml2/%s/libxml2" % arch.arch shprint(sh.Command('./configure'), '--build=i686-pc-linux-gnu', '--host=arm-linux-eabi', '--without-plugins', '--without-debug', '--without-python', '--without-crypto', '--with-libxml-src=%s' % libxml, _env=env) shprint(sh.make, "V=1", _env=env) shutil.copyfile( 'libxslt/.libs/libxslt.a', join(self.ctx.get_libs_dir(arch.arch), 'libxslt.a')) shutil.copyfile( 'libexslt/.libs/libexslt.a', join(self.ctx.get_libs_dir(arch.arch), 'libexslt.a'))
def build_arch(self, arch): super(C_iGraphRecipe, self).build_arch(arch) jobs = self.get_recipe_env(arch).get('MAKE_JOBS', 1) with current_directory(self.get_build_dir(arch.arch)): shprint(sh.bash, './configure', '--prefix={}/python-install'.format(self.get_build_container_dir(arch.arch)), '--host=arm-linux-eabi') shprint(sh.make, '-j{}'.format(jobs)) shprint(sh.make, '-j{}'.format(jobs), 'install')
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') buildarch = self.select_build_arch(arch) # XXX if we don't have no-asm, using clang and ndk-15c, i got: # crypto/aes/bsaes-armv7.S:1372:14: error: immediate operand must be in the range [0,4095] # add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 # ^ # crypto/aes/bsaes-armv7.S:1434:14: error: immediate operand must be in the range [0,4095] # sub r6, r8, #.LREVM0SR-.LSR @ pass constants config_args = ['shared', 'no-dso', 'no-asm'] if self.use_legacy: config_args.append('no-krb5') config_args.append(buildarch) if not self.use_legacy: config_args.append('-D__ANDROID_API__={}'.format(self.ctx.ndk_api)) shprint(perl, 'Configure', *config_args, _env=env) self.apply_patch( 'disable-sover{}.patch'.format( '-legacy' if self.use_legacy else ''), arch.arch) if self.use_legacy: self.apply_patch('rename-shared-lib.patch', arch.arch) shprint(sh.make, 'build_libs', _env=env) self.install_libs(arch, 'libssl' + self.version + '.so', 'libcrypto' + self.version + '.so')
def build_arch(self, arch): super(LibZMQRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) # # libsodium_recipe = Recipe.get_recipe('libsodium', self.ctx) # libsodium_dir = libsodium_recipe.get_build_dir(arch.arch) # env['sodium_CFLAGS'] = '-I{}'.format(join( # libsodium_dir, 'src')) # env['sodium_LDLAGS'] = '-L{}'.format(join( # libsodium_dir, 'src', 'libsodium', '.libs')) curdir = self.get_build_dir(arch.arch) prefix = join(curdir, "install") with current_directory(curdir): bash = sh.Command('sh') shprint(bash, './configure', '--host=arm-linux-androideabi', '--without-documentation', '--prefix={}'.format(prefix), '--with-libsodium=no', _env=env) shprint(sh.make, _env=env) shprint(sh.make, 'install', _env=env) shutil.copyfile( '.libs/libzmq.so', join(self.ctx.get_libs_dir(arch.arch), 'libzmq.so')) bootstrap_obj_dir = join(self.ctx.bootstrap.build_dir, 'obj', 'local', arch.arch) ensure_dir(bootstrap_obj_dir) shutil.copyfile( '{}/sources/cxx-stl/gnu-libstdc++/4.8/libs/{}/libgnustl_shared.so' .format(self.ctx.ndk_dir, arch), join(bootstrap_obj_dir, 'libgnustl_shared.so'))
def build_arch(self, arch): # build_compiled_components(self, arch) info("Building compiled components for my_lib") env = self.get_recipe_env(arch) info(json.dumps(env, indent=2)) target = self.get_target(arch) platform = self.ctx.android_api build_dir = self.get_build_dir(arch.arch) lib_dir = join(build_dir, "target", target, "debug") with current_directory(build_dir): cargo = sh.Command("cargo") shprint( cargo, "ndk", "--platform", str(platform), "--target", target, "build", # "--release", _env=env, ) shutil.copyfile( join(lib_dir, "libmy_lib.so"), join(self.ctx.get_site_packages_dir(arch.arch), "my_lib.so"), )
def build_arch(self, arch): super(LibxsltRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) build_dir = self.get_build_dir(arch.arch) with current_directory(build_dir): # If the build is done with /bin/sh things blow up, # try really hard to use bash libxml2_recipe = Recipe.get_recipe('libxml2', self.ctx) libxml2_build_dir = libxml2_recipe.get_build_dir(arch.arch) build_arch = shprint( sh.gcc, '-dumpmachine').stdout.decode('utf-8').split('\n')[0] if not exists('configure'): shprint(sh.Command('./autogen.sh'), _env=env) shprint(sh.Command('autoreconf'), '-vif', _env=env) shprint(sh.Command('./configure'), '--build=' + build_arch, '--host=' + arch.command_prefix, '--target=' + arch.command_prefix, '--without-plugins', '--without-debug', '--without-python', '--without-crypto', '--with-libxml-src=' + libxml2_build_dir, '--disable-shared', _env=env) shprint(sh.make, "V=1", _env=env) shutil.copyfile('libxslt/.libs/libxslt.a', join(self.ctx.libs_dir, 'libxslt.a')) shutil.copyfile('libexslt/.libs/libexslt.a', join(self.ctx.libs_dir, 'libexslt.a'))
def build(target_python, requirements): """ Builds an APK given a target Python and a set of requirements. """ if not requirements: return testapp = 'setup_testapp_python2.py' android_sdk_home = os.environ['ANDROID_SDK_HOME'] android_ndk_home = os.environ['ANDROID_NDK_HOME'] crystax_ndk_home = os.environ['CRYSTAX_NDK_HOME'] if target_python == TargetPython.python3crystax: android_ndk_home = crystax_ndk_home testapp = 'setup_testapp_python3.py' requirements.add(target_python.name) requirements = ','.join(requirements) print('requirements:', requirements) with current_directory('testapps/'): try: for line in sh.python( testapp, 'apk', '--sdk-dir', android_sdk_home, '--ndk-dir', android_ndk_home, '--bootstrap', 'sdl2', '--requirements', requirements, _err_to_out=True, _iter=True): print(line) except sh.ErrorReturnCode as e: raise
def build_arch(self, arch): super(Libxml2Recipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): if not exists('configure'): shprint(sh.Command('./autogen.sh'), _env=env) shprint(sh.Command('autoreconf'), '-vif', _env=env) build_arch = shprint( sh.gcc, '-dumpmachine').stdout.decode('utf-8').split('\n')[0] shprint(sh.Command('./configure'), '--build=' + build_arch, '--host=' + arch.command_prefix, '--target=' + arch.command_prefix, '--without-modules', '--without-legacy', '--without-history', '--without-debug', '--without-docbook', '--without-python', '--without-threads', '--without-iconv', '--without-lzma', '--disable-shared', '--enable-static', _env=env) # Ensure we only build libxml2.la as if we do everything # we'll need the glob dependency which is a big headache shprint(sh.make, "libxml2.la", _env=env) shutil.copyfile('.libs/libxml2.a', join(self.ctx.libs_dir, 'libxml2.a'))
def build_arch(self, arch): super(LibZMQRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) # # libsodium_recipe = Recipe.get_recipe('libsodium', self.ctx) # libsodium_dir = libsodium_recipe.get_build_dir(arch.arch) # env['sodium_CFLAGS'] = '-I{}'.format(join( # libsodium_dir, 'src')) # env['sodium_LDLAGS'] = '-L{}'.format(join( # libsodium_dir, 'src', 'libsodium', '.libs')) curdir = self.get_build_dir(arch.arch) prefix = join(curdir, "install") with current_directory(curdir): bash = sh.Command('sh') shprint( bash, './configure', '--host=arm-linux-androideabi', '--without-documentation', '--prefix={}'.format(prefix), '--with-libsodium=no', _env=env) shprint(sh.make, _env=env) shprint(sh.make, 'install', _env=env) shutil.copyfile('.libs/libzmq.so', join( self.ctx.get_libs_dir(arch.arch), 'libzmq.so')) bootstrap_obj_dir = join(self.ctx.bootstrap.build_dir, 'obj', 'local', arch.arch) ensure_dir(bootstrap_obj_dir) shutil.copyfile( '{}/sources/cxx-stl/gnu-libstdc++/{}/libs/{}/libgnustl_shared.so'.format( self.ctx.ndk_dir, self.ctx.toolchain_version, arch), join(bootstrap_obj_dir, 'libgnustl_shared.so'))
def build_arch(self, arch): super(LibZBarRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): shprint(sh.Command('autoreconf'), '-vif', _env=env) shprint( sh.Command('./configure'), '--host=' + arch.toolchain_prefix, '--target=' + arch.toolchain_prefix, '--prefix=' + self.ctx.get_python_install_dir(), # Python bindings are compiled in a separated recipe '--with-python=no', '--with-gtk=no', '--with-qt=no', '--with-x=no', '--with-jpeg=no', '--with-imagemagick=no', '--enable-pthread=no', '--enable-video=no', '--enable-shared=yes', '--enable-static=no', _env=env) shprint(sh.make, '-j' + str(cpu_count()), _env=env) libs = ['zbar/.libs/libzbar.so'] self.install_libs(arch, *libs)
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') buildarch = self.select_build_arch(arch) config_args = ['shared', 'no-dso', 'no-asm'] config_args.append(buildarch) shprint(perl, 'Configure', *config_args, _env=env) self.apply_patch('disable-sover.patch', arch.arch) makefile = join(self.get_build_dir(arch.arch), 'Makefile') sh.sed('-i', 's/CROSS_COMPILE=arm-linux-androideabi-/CROSS_COMPILE=/g', makefile) sh.sed('-i', 's/CROSS_COMPILE=aarch64-linux-android-/CROSS_COMPILE=/g', makefile) shprint(sh.make, 'build_libs', _env=env) self.install_libs(arch, 'libssl.a', 'libssl' + self.version + '.so', 'libcrypto.a', 'libcrypto' + self.version + '.so')
def build_arch(self, arch): super(Libxml2Recipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): env["CC"] += " -I%s" % self.get_build_dir(arch.arch) shprint( sh.Command("./configure"), "--host=arm-linux-eabi", "--without-modules", "--without-legacy", "--without-history", "--without-debug", "--without-docbook", "--without-python", "--without-threads", "--without-iconv", _env=env, ) # Ensure we only build libxml2.la as if we do everything # we'll need the glob dependency which is a big headache shprint(sh.make, "libxml2.la", _env=env) shutil.copyfile( ".libs/libxml2.a", join(self.ctx.get_libs_dir(arch.arch), "libxml2.a") )
def build_arch(self, arch): """simple shared compile""" env = self.get_recipe_env(arch, with_flags_in_cc=False) for path in ( self.get_build_dir(arch.arch), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Lib'), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include')): if not exists(path): info("creating {}".format(path)) shprint(sh.mkdir, '-p', path) cli = env['CC'].split()[0] # makes sure first CC command is the compiler rather than ccache, refs: # https://github.com/kivy/python-for-android/issues/1399 if 'ccache' in cli: cli = env['CC'].split()[1] cc = sh.Command(cli) with current_directory(self.get_build_dir(arch.arch)): cflags = env['CFLAGS'].split() cflags.extend(['-I.', '-c', '-l.', 'glob.c', '-I.']) shprint(cc, *cflags, _env=env) cflags = env['CFLAGS'].split() cflags.extend(['-shared', '-I.', 'glob.o', '-o', 'libglob.so']) cflags.extend(env['LDFLAGS'].split()) shprint(cc, *cflags, _env=env)
def build_arch(self, arch): super(LibxsltRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) build_dir = self.get_build_dir(arch.arch) with current_directory(build_dir): # If the build is done with /bin/sh things blow up, # try really hard to use bash libxml2_recipe = Recipe.get_recipe('libxml2', self.ctx) libxml2_build_dir = libxml2_recipe.get_build_dir(arch.arch) build_arch = shprint(sh.gcc, '-dumpmachine').stdout.decode( 'utf-8').split('\n')[0] if not exists('configure'): shprint(sh.Command('./autogen.sh'), _env=env) shprint(sh.Command('autoreconf'), '-vif', _env=env) shprint(sh.Command('./configure'), '--build=' + build_arch, '--host=' + arch.command_prefix, '--target=' + arch.command_prefix, '--without-plugins', '--without-debug', '--without-python', '--without-crypto', '--with-libxml-src=' + libxml2_build_dir, '--disable-shared', _env=env) shprint(sh.make, "V=1", _env=env) shutil.copyfile('libxslt/.libs/libxslt.a', join(self.ctx.libs_dir, 'libxslt.a')) shutil.copyfile('libexslt/.libs/libexslt.a', join(self.ctx.libs_dir, 'libexslt.a'))
def prebuild_arch(self, arch): super(PygameJNIComponentsRecipe, self).postbuild_arch(arch) info('Unpacking pygame bootstrap JNI dir components') with current_directory(self.get_build_container_dir(arch)): if exists('sdl'): info('sdl dir exists, so it looks like the JNI components' + 'are already unpacked. Skipping.') return for dirn in glob.glob( join(self.get_build_dir(arch), 'pygame_bootstrap_jni', '*')): shprint(sh.mv, dirn, './') info('Unpacking was successful, deleting original container dir') shprint(sh.rm, '-rf', self.get_build_dir(arch)) info('Applying jpeg assembler patch') ndk_15_plus_patch = join(self.get_recipe_dir(), 'jpeg-ndk15-plus.patch') shprint(sh.patch, '-t', '-d', join(self.get_build_container_dir(arch), 'jpeg'), '-p1', '-i', ndk_15_plus_patch, _tail=10)
def build_arch(self, arch): super(LibxsltRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # If the build is done with /bin/sh things blow up, # try really hard to use bash env["CC"] += " -I%s" % self.get_build_dir(arch.arch) libxml = Recipe.get_recipe( 'libxml2', self.ctx).get_build_dir(arch.arch) shprint( sh.Command("./configure"), "--build=i686-pc-linux-gnu", "--host=arm-linux-eabi", "--without-plugins", "--without-debug", "--without-python", "--without-crypto", "--with-libxml-src=%s" % libxml, _env=env, ) shprint(sh.make, "V=1", _env=env) shutil.copyfile( "libxslt/.libs/libxslt.a", join(self.ctx.get_libs_dir(arch.arch), "libxslt.a"), ) shutil.copyfile( "libexslt/.libs/libexslt.a", join(self.ctx.get_libs_dir(arch.arch), "libexslt.a"), )
def build_arch(self, arch): super(LibGMPRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) if env['ARCH'].endswith('arm64'): _HOST = 'aarch64-linux-android' MPN_PATH = 'arm64 generic' else: _HOST = 'arm-linux-androideabi' MPN_PATH = 'arm/v6t2 arm/v6 arm/v5 arm generic' with current_directory(self.get_build_dir(arch.arch)): dst_dir = join(self.get_build_dir(arch.arch), 'dist') shprint(sh.Command('./configure'), '--host={}'.format(_HOST), '--disable-shared', '--prefix={}'.format(dst_dir), 'MPN_PATH={}'.format(MPN_PATH), _env=env) shprint(sh.sed, '-i.bak', '/HAVE_LOCALECONV 1/d', './config.h', _env=env) shprint(sh.make, '-j%s' % cpu_count(), _env=env) shprint(sh.make, 'install', _env=env) libs = ['dist/lib/libgmp.a'] self.install_libs(arch, *libs)
def build_arch(self, arch): """simple shared compile""" env = self.get_recipe_env(arch, with_flags_in_cc=False) for path in ( self.get_build_dir(arch.arch), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Lib'), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include')): if not exists(path): info("creating {}".format(path)) shprint(sh.mkdir, '-p', path) cli = env['CC'].split()[0] # makes sure first CC command is the compiler rather than ccache, refs: # https://github.com/kivy/python-for-android/issues/1399 if 'ccache' in cli: cli = env['CC'].split()[1] cc = sh.Command(cli) with current_directory(self.get_build_dir(arch.arch)): cflags = env['CFLAGS'].split() cflags.extend(['-I.', '-c', '-l.', 'glob.c', '-I.']) shprint(cc, *cflags, _env=env) cflags = env['CFLAGS'].split() cflags.extend(['-shared', '-I.', 'glob.o', '-o', 'libglob.so']) cflags.extend(env['LDFLAGS'].split()) shprint(cc, *cflags, _env=env) shprint(sh.cp, 'libglob.so', join(self.ctx.libs_dir, arch.arch))
def build_armeabi(self): # AND: I'm going to ignore any extra pythonrecipe or cythonrecipe behaviour for now arch = ArchAndroid(self.ctx) env = self.get_recipe_env(arch) env['CFLAGS'] = env['CFLAGS'] + ' -I{jni_path}/png -I{jni_path}/jpeg'.format( jni_path=join(self.ctx.bootstrap.build_dir, 'jni')) env['CFLAGS'] = env['CFLAGS'] + ' -I{jni_path}/sdl/include -I{jni_path}/sdl_mixer'.format( jni_path=join(self.ctx.bootstrap.build_dir, 'jni')) env['CFLAGS'] = env['CFLAGS'] + ' -I{jni_path}/sdl_ttf -I{jni_path}/sdl_image'.format( jni_path=join(self.ctx.bootstrap.build_dir, 'jni')) debug('pygame cflags', env['CFLAGS']) env['LDFLAGS'] = env['LDFLAGS'] + ' -L{libs_path} -L{src_path}/obj/local/{arch} -lm -lz'.format( libs_path=self.ctx.libs_dir, src_path=self.ctx.bootstrap.build_dir, arch=env['ARCH']) env['LDSHARED'] = join(self.ctx.root_dir, 'tools', 'liblink') with current_directory(self.get_build_dir('armeabi')): info('hostpython is ' + self.ctx.hostpython) hostpython = sh.Command(self.ctx.hostpython) shprint(hostpython, 'setup.py', 'install', '-O2', _env=env) info('strip is ' + env['STRIP']) build_lib = glob.glob('./build/lib*') assert len(build_lib) == 1 print('stripping pygame') shprint(sh.find, build_lib[0], '-name', '*.o', '-exec', env['STRIP'], '{}', ';') python_install_path = join(self.ctx.build_dir, 'python-install') # AND: Should do some deleting here! print('Should remove pygame tests etc. here, but skipping for now')
def build_arch(self, arch): """simple shared compile""" env = self.get_recipe_env(arch, with_flags_in_cc=False) for path in ( self.get_build_dir(arch.arch), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Lib'), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include')): if not exists(path): info("creating {}".format(path)) shprint(sh.mkdir, '-p', path) cli = env['CC'].split() cc = sh.Command(cli[0]) with current_directory(self.get_build_dir(arch.arch)): cflags = env['CFLAGS'].split() cflags.extend(['-I.', '-c', '-l.', 'ifaddrs.c', '-I.']) shprint(cc, *cflags, _env=env) cflags = env['CFLAGS'].split() cflags.extend(['-shared', '-I.', 'ifaddrs.o', '-o', 'libifaddrs.so']) cflags.extend(env['LDFLAGS'].split()) shprint(cc, *cflags, _env=env) shprint(sh.cp, 'libifaddrs.so', self.ctx.get_libs_dir(arch.arch)) shprint(sh.cp, "libifaddrs.so", join(self.ctx.get_python_install_dir(), 'lib')) # drop header in to the Python include directory python_version = self.ctx.python_recipe.version[0:3] shprint(sh.cp, "ifaddrs.h", join( self.ctx.get_python_install_dir(), 'include/python{}'.format(python_version)) ) include_path = join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include') shprint(sh.cp, "ifaddrs.h", include_path)
def build(target_python, requirements): """ Builds an APK given a target Python and a set of requirements. """ if not requirements: return testapp = 'setup_testapp_python2.py' android_sdk_home = os.environ['ANDROID_SDK_HOME'] android_ndk_home = os.environ['ANDROID_NDK_HOME'] crystax_ndk_home = os.environ['CRYSTAX_NDK_HOME'] if target_python == TargetPython.python3crystax: android_ndk_home = crystax_ndk_home testapp = 'setup_testapp_python3.py' requirements.add(target_python.name) requirements = ','.join(requirements) print('requirements:', requirements) with current_directory('testapps/'): try: for line in sh.python(testapp, 'apk', '--sdk-dir', android_sdk_home, '--ndk-dir', android_ndk_home, '--bootstrap', 'sdl2', '--requirements', requirements, _err_to_out=True, _iter=True): print(line) except sh.ErrorReturnCode as e: raise
def build_arch(self, arch): """simple shared compile""" env = self.get_recipe_env(arch, with_flags_in_cc=False) for path in (self.get_build_dir(arch.arch), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Lib'), join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include'), ): if not exists(path): info("creating {}".format(path)) shprint(sh.mkdir, '-p', path) cli = env['CC'].split() cc = sh.Command(cli[0]) with current_directory(self.get_build_dir(arch.arch)): cflags = env['CFLAGS'].split() cflags.extend(['-I.', '-c', '-l.', 'ifaddrs.c', '-I.']) shprint(cc, *cflags, _env=env) cflags = env['CFLAGS'].split() cflags.extend(['-shared', '-I.', 'ifaddrs.o', '-o', 'libifaddrs.so']) cflags.extend(env['LDFLAGS'].split()) shprint(cc, *cflags, _env=env) shprint(sh.cp, 'libifaddrs.so', self.ctx.get_libs_dir(arch.arch)) shprint(sh.cp, "libifaddrs.so", join(self.ctx.get_python_install_dir(), 'lib')) # drop header in to the Python include directory shprint(sh.cp, "ifaddrs.h", join(self.ctx.get_python_install_dir(), 'include/python{}'.format( self.ctx.python_recipe.version[0:3] ) ) ) include_path = join(self.ctx.python_recipe.get_build_dir(arch.arch), 'Include') shprint(sh.cp, "ifaddrs.h", include_path)
def build_arch(self, arch): # AND: Should use an i386 recipe system warning("Running hostpython build. Arch is armeabi! " "This is naughty, need to fix the Arch system!") # AND: Fix armeabi again with current_directory(self.get_build_dir(arch.arch)): if exists("hostpython"): info("hostpython already exists, skipping build") self.ctx.hostpython = join(self.get_build_dir("armeabi"), "hostpython") self.ctx.hostpgen = join(self.get_build_dir("armeabi"), "hostpgen") return configure = sh.Command("./configure") shprint(configure) shprint(sh.make, "-j5", "BUILDPYTHON=hostpython", "hostpython", "PGEN=Parser/hostpgen", "Parser/hostpgen") shprint(sh.mv, join("Parser", "hostpgen"), "hostpgen") # if exists('python.exe'): # shprint(sh.mv, 'python.exe', 'hostpython') # elif exists('python'): # shprint(sh.mv, 'python', 'hostpython') if exists("hostpython"): pass # The above commands should automatically create # the hostpython binary, unlike with python2 else: warning("Unable to find the python executable after " "hostpython build! Exiting.") exit(1) self.ctx.hostpython = join(self.get_build_dir(arch.arch), "hostpython") self.ctx.hostpgen = join(self.get_build_dir(arch.arch), "hostpgen")
def build_arch(self, arch): with current_directory(self.get_build_dir(arch.arch)): env = self.get_recipe_env(arch) cvsrc = self.get_build_dir(arch.arch) lib_dir = os.path.join(self.ctx.get_python_install_dir(), "lib") shprint( sh.cmake, '-DP4A=ON', '-DANDROID_ABI={}'.format(arch.arch), '-DCMAKE_TOOLCHAIN_FILE={}/platforms/android/android.toolchain.cmake' .format(cvsrc), '-DPYTHON_INCLUDE_PATH={}/include/python2.7'.format( env['PYTHON_ROOT']), '-DPYTHON_LIBRARY={}/lib/libpython2.7.so'.format( env['PYTHON_ROOT']), '-DPYTHON_NUMPY_INCLUDE_DIR={}/numpy/core/include'.format( env['SITEPACKAGES_PATH']), '-DANDROID_EXECUTABLE={}/tools/android'.format( env['ANDROID_SDK']), '-DBUILD_TESTS=OFF', '-DBUILD_PERF_TESTS=OFF', '-DBUILD_EXAMPLES=OFF', '-DBUILD_ANDROID_EXAMPLES=OFF', '-DPYTHON_PACKAGES_PATH={}'.format(env['SITEPACKAGES_PATH']), cvsrc, _env=env) shprint(sh.make, '-j', str(cpu_count()), 'opencv_python') shprint(sh.cmake, '-DCOMPONENT=python', '-P', './cmake_install.cmake') sh.cp('-a', sh.glob('./lib/{}/lib*.so'.format(arch.arch)), lib_dir)
def build_cython_components(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): info('hostpython is ' + self.ctx.hostpython) hostpython = sh.Command(self.ctx.hostpython) app_mk = join(self.get_build_dir(arch.arch), 'Application.mk') if not exists(app_mk): shprint(sh.cp, join(self.get_recipe_dir(), 'Application.mk'), app_mk) app_setup = join(self.get_build_dir(arch.arch), 'setup.py') if not exists(app_setup): shprint(sh.cp, join(self.get_recipe_dir(), 'setup.py'), app_setup) # This first attempt *will* fail, because cython isn't # installed in the hostpython try: shprint(hostpython, 'setup.py', 'build_ext', _env=env) except sh.ErrorReturnCode_1: pass # ...so we manually run cython from the user's system shprint(sh.find, self.get_build_dir('armeabi'), '-iname', '*.pyx', '-exec', self.ctx.cython, '{}', ';', _env=env) # now cython has already been run so the build works shprint(hostpython, 'setup.py', 'build_ext', '-v', _env=env) # stripping debug symbols lowers the file size a lot build_lib = glob.glob('./build/lib*') shprint(sh.find, build_lib[0], '-name', '*.o', '-exec', env['STRIP'], '{}', ';', _env=env)
def build_arch(self, arch): with current_directory(self.get_build_dir()): if exists('hostpython'): info('hostpython already exists, skipping build') self.ctx.hostpython = join(self.get_build_dir(), 'hostpython') self.ctx.hostpgen = join(self.get_build_dir(), 'hostpgen') return configure = sh.Command('./configure') shprint(configure) shprint(sh.make, '-j5') shprint(sh.mv, join('Parser', 'pgen'), 'hostpgen') if exists('python.exe'): shprint(sh.mv, 'python.exe', 'hostpython') elif exists('python'): shprint(sh.mv, 'python', 'hostpython') else: warning('Unable to find the python executable after ' 'hostpython build! Exiting.') exit(1) self.ctx.hostpython = join(self.get_build_dir(), 'hostpython') self.ctx.hostpgen = join(self.get_build_dir(), 'hostpgen')
def build_arch(self, arch): super(LibtorrentRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(join(self.get_build_dir(arch.arch), 'bindings/python')): # Compile libtorrent with boost libraries and python bindings b2 = sh.Command(join(env['BOOST_ROOT'], 'b2')) shprint(b2, '-q', '-j5', 'toolset=gcc-' + env['ARCH'], 'target-os=android', 'threading=multi', 'link=shared', 'boost-link=shared', 'boost=source', 'encryption=openssl' if 'openssl' in recipe.ctx.recipe_build_order else '', '--prefix=' + env['CROSSHOME'], 'release', _env=env) # Common build directories build_subdirs = 'gcc-arm/release/boost-link-shared/boost-source' if 'openssl' in recipe.ctx.recipe_build_order: build_subdirs += '/encryption-openssl' build_subdirs += '/libtorrent-python-pic-on/target-os-android/threading-multi/visibility-hidden' # Copy the shared libraries into the libs folder shutil.copyfile(join(env['BOOST_BUILD_PATH'], 'bin.v2/libs/python/build', build_subdirs, 'libboost_python.so'), join(self.ctx.get_libs_dir(arch.arch), 'libboost_python.so')) shutil.copyfile(join(env['BOOST_BUILD_PATH'], 'bin.v2/libs/system/build', build_subdirs, 'libboost_system.so'), join(self.ctx.get_libs_dir(arch.arch), 'libboost_system.so')) if 'openssl' in recipe.ctx.recipe_build_order: shutil.copyfile(join(env['BOOST_BUILD_PATH'], 'bin.v2/libs/date_time/build', build_subdirs, 'libboost_date_time.so'), join(self.ctx.get_libs_dir(arch.arch), 'libboost_date_time.so')) shutil.copyfile(join(self.get_build_dir(arch.arch), 'bin', build_subdirs, 'libtorrent_rasterbar.so'), join(self.ctx.get_libs_dir(arch.arch), 'libtorrent_rasterbar.so')) shutil.copyfile(join(self.get_build_dir(arch.arch), 'bindings/python/bin', build_subdirs, 'libtorrent.so'), join(self.ctx.get_site_packages_dir(arch.arch), 'libtorrent.so'))
def build(target_python, requirements): """ Builds an APK given a target Python and a set of requirements. """ if not requirements: return testapp = 'setup_testapp_python2.py' android_sdk_home = os.environ['ANDROID_SDK_HOME'] android_ndk_home = os.environ['ANDROID_NDK_HOME'] if target_python == TargetPython.python3: testapp = 'setup_testapp_python3_sqlite_openssl.py' requirements.add(target_python.name) requirements = ','.join(requirements) logger.info('requirements: {}'.format(requirements)) with current_directory('testapps/'): # iterates to stream the output for line in sh.python(testapp, 'apk', '--sdk-dir', android_sdk_home, '--ndk-dir', android_ndk_home, '--requirements', requirements, _err_to_out=True, _iter=True): print(line)
def build_arch(self, arch): super(VlcRecipe, self).build_arch(arch) build_dir = self.get_build_dir(arch.arch) port_dir = join(build_dir, 'vlc-port-android') aar = self.aars[arch] if not exists(aar): with current_directory(port_dir): env = dict(environ) env.update({ 'ANDROID_ABI': arch.arch, 'ANDROID_NDK': self.ctx.ndk_dir, 'ANDROID_SDK': self.ctx.sdk_dir, }) info("compiling vlc from sources") debug("environment: {}".format(env)) if not exists(join('bin', 'VLC-debug.apk')): shprint(sh.Command('./compile.sh'), _env=env, _tail=50, _critical=True) shprint(sh.Command('./compile-libvlc.sh'), _env=env, _tail=50, _critical=True) shprint(sh.cp, '-a', aar, self.ctx.aars_dir)
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') buildarch = self.select_build_arch(arch) shprint(perl, 'Configure', 'shared', 'no-dso', 'no-krb5', buildarch, _env=env) self.apply_patch('disable-sover.patch', arch.arch) check_crypto = partial(self.check_symbol, env, 'libcrypto.so') # check_ssl = partial(self.check_symbol, env, 'libssl.so') while True: shprint(sh.make, 'build_libs', _env=env) if all( map(check_crypto, ('SSLeay', 'MD5_Transform', 'MD4_Init'))): break shprint(sh.make, 'clean', _env=env) self.install_libs(arch, 'libssl.so', 'libcrypto.so')
def prebuild_arch(self, arch): super().prebuild_arch(arch) with current_directory(self.get_build_dir(arch.arch)): setup_template = open(join("buildconfig", "Setup.Android.SDL2.in")).read() env = self.get_recipe_env(arch) env['ANDROID_ROOT'] = join(self.ctx.ndk_platform, 'usr') ndk_lib_dir = join(self.ctx.ndk_platform, 'usr', 'lib') png = self.get_recipe('png', self.ctx) png_lib_dir = join(png.get_build_dir(arch.arch), '.libs') png_inc_dir = png.get_build_dir(arch) jpeg = self.get_recipe('jpeg', self.ctx) jpeg_inc_dir = jpeg_lib_dir = jpeg.get_build_dir(arch.arch) setup_file = setup_template.format( sdl_includes=(" -I" + join(self.ctx.bootstrap.build_dir, 'jni', 'SDL', 'include') + " -L" + join(self.ctx.bootstrap.build_dir, "libs", str(arch)) + " -L" + png_lib_dir + " -L" + jpeg_lib_dir + " -L" + ndk_lib_dir), sdl_ttf_includes="-I" + join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'), sdl_image_includes="-I" + join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_image'), sdl_mixer_includes="-I" + join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_mixer'), jpeg_includes="-I" + jpeg_inc_dir, png_includes="-I" + png_inc_dir, freetype_includes="") open("Setup", "w").write(setup_file)
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') buildarch = self.select_build_arch(arch) # XXX if we don't have no-asm, using clang and ndk-15c, i got: # crypto/aes/bsaes-armv7.S:1372:14: error: immediate operand must be in the range [0,4095] # add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 # ^ # crypto/aes/bsaes-armv7.S:1434:14: error: immediate operand must be in the range [0,4095] # sub r6, r8, #.LREVM0SR-.LSR @ pass constants config_args = ['shared', 'no-dso', 'no-asm'] if self.use_legacy: config_args.append('no-krb5') config_args.append(buildarch) if not self.use_legacy: config_args.append('-D__ANDROID_API__={}'.format( self.ctx.ndk_api)) shprint(perl, 'Configure', *config_args, _env=env) self.apply_patch( 'disable-sover{}.patch'.format( '-legacy' if self.use_legacy else ''), arch.arch) if self.use_legacy: self.apply_patch('rename-shared-lib.patch', arch.arch) shprint(sh.make, 'build_libs', _env=env) self.install_libs(arch, 'libssl' + self.version + '.so', 'libcrypto' + self.version + '.so')
def run_distribute(self): info_main('# Creating Android project from build and {} bootstrap'.format( self.name)) # src_path = join(self.ctx.root_dir, 'bootstrap_templates', # self.name) src_path = join(self.bootstrap_dir, 'build') arch = self.ctx.archs[0] if len(self.ctx.archs) > 1: raise ValueError('built for more than one arch, but bootstrap cannot handle that yet') info('Bootstrap running with arch {}'.format(arch)) with current_directory(self.dist_dir): info('Creating initial layout') for dirname in ('assets', 'bin', 'private', 'res', 'templates'): if not exists(dirname): shprint(sh.mkdir, dirname) info('Copying default files') shprint(sh.cp, '-a', join(self.build_dir, 'project.properties'), '.') shprint(sh.cp, '-a', join(src_path, 'build.py'), '.') shprint(sh.cp, '-a', join(src_path, 'buildlib'), '.') shprint(sh.cp, '-a', join(src_path, 'src'), '.') shprint(sh.cp, '-a', join(src_path, 'templates'), '.') shprint(sh.cp, '-a', join(src_path, 'res'), '.') shprint(sh.cp, '-a', join(src_path, 'blacklist.txt'), '.') shprint(sh.cp, '-a', join(src_path, 'whitelist.txt'), '.') with open('local.properties', 'w') as fileh: fileh.write('sdk.dir={}'.format(self.ctx.sdk_dir)) info('Copying python distribution') python_bundle_dir = join('_python_bundle', '_python_bundle') if 'python2legacy' in self.ctx.recipe_build_order: # a special case with its own packaging location python_bundle_dir = 'private' # And also must had an install directory, make sure of that self.ctx.python_recipe.create_python_install(self.dist_dir) self.distribute_libs( arch, [join(self.build_dir, 'libs', arch.arch), self.ctx.get_libs_dir(arch.arch)]) self.distribute_aars(arch) self.distribute_javaclasses(self.ctx.javaclass_dir) ensure_dir(python_bundle_dir) site_packages_dir = self.ctx.python_recipe.create_python_bundle( join(self.dist_dir, python_bundle_dir), arch) if 'sqlite3' not in self.ctx.recipe_build_order: with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(PygameBootstrap, self).run_distribute()
def prebuild_arch(self, arch): libdir = self.ctx.get_libs_dir(arch.arch) with current_directory(self.get_build_dir(arch.arch)): # pg_config_helper will return the system installed libpq, but we # need the one we just cross-compiled shprint(sh.sed, '-i', "s|pg_config_helper.query(.libdir.)|'{}'|".format(libdir), 'setup.py')
def build_arch(self, arch): super(FFMpegRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) build_dir = self.get_build_dir(arch.arch) with current_directory(build_dir): bash = sh.Command('bash') shprint(bash, 'init_update_libs.sh') shprint(bash, 'android_build.sh', _env=env)
def prebuild_arch(self, arch): with current_directory(self.get_build_dir(arch.arch)): # Cross compiling for 32 bits in 64 bit ubuntu before precise is # failing. See # https://bugs.launchpad.net/ubuntu/+source/python2.7/+bug/873007 shprint(sh.sed, '-i', "s|BUILD_CEXTENSIONS = True|BUILD_CEXTENSIONS = False|", 'setup.py')
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command('perl') shprint(perl, 'Configure', 'no-dso', 'no-krb5', 'linux-armv4', _env=env) shprint(sh.make, 'build_libs', _env=env)
def prebuild_arch(self, arch): super().prebuild_arch(arch) with current_directory(self.get_build_dir(arch.arch)): sh.rm( '-rf', 'src/zope/interface/tests', 'src/zope/interface/common/tests', )
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # sh fails with code 255 trying to execute ./Configure # so instead we manually run perl passing in Configure perl = sh.Command("perl") shprint(perl, "Configure", "no-dso", "no-krb5", "linux-armv4", _env=env) shprint(sh.make, "build_libs", _env=env)
def build_arch(self, arch): super(LibsodiumRecipe, self).build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): bash = sh.Command('bash') shprint(bash, 'configure', '--disable-soname-versions', '--host=arm-linux-androideabi', '--enable-shared', _env=env) shprint(sh.make, _env=env) shutil.copyfile('src/libsodium/.libs/libsodium.so', join(self.ctx.get_libs_dir(arch.arch), 'libsodium.so'))
def run_distribute(self): info_main("# Creating Android project ({})".format(self.name)) arch = self.ctx.archs[0] python_install_dir = self.ctx.get_python_install_dir() from_crystax = self.ctx.python_recipe.from_crystax if len(self.ctx.archs) > 1: raise ValueError("SDL2/gradle support only one arch") info("Copying SDL2/gradle build for {}".format(arch)) shprint(sh.rm, "-rf", self.dist_dir) shprint(sh.cp, "-r", self.build_dir, self.dist_dir) # either the build use environment variable (ANDROID_HOME) # or the local.properties if exists with current_directory(self.dist_dir): with open('local.properties', 'w') as fileh: fileh.write('sdk.dir={}'.format(self.ctx.sdk_dir)) with current_directory(self.dist_dir): info("Copying Python distribution") python_bundle_dir = join('_python_bundle', '_python_bundle') if 'python2legacy' in self.ctx.recipe_build_order: # a special case with its own packaging location python_bundle_dir = 'private' # And also must had an install directory, make sure of that self.ctx.python_recipe.create_python_install(self.dist_dir) self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_javaclasses(self.ctx.javaclass_dir, dest_dir=join("src", "main", "java")) ensure_dir(python_bundle_dir) site_packages_dir = self.ctx.python_recipe.create_python_bundle( join(self.dist_dir, python_bundle_dir), arch) if 'sqlite3' not in self.ctx.recipe_build_order: with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(SDL2GradleBootstrap, self).run_distribute()
def build_arch(self, arch): env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # Remove source in this pypi package sh.rm('-rf', 'leveldb', 'leveldb.egg-info', 'snappy') # Use source from leveldb recipe sh.ln('-s', self.get_recipe('leveldb', self.ctx).get_build_dir(arch.arch), 'leveldb') # Build and install python bindings super(PyLevelDBRecipe, self).build_arch(arch)
def build_compiled_components(self, arch): info('Configuring compiled components in {}'.format(self.name)) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): configure = sh.Command('./configure') shprint(configure, '--host=arm-eabi', '--prefix={}'.format(self.ctx.get_python_install_dir()), '--enable-shared', _env=env) super(PyCryptoRecipe, self).build_compiled_components(arch)