81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
from pythonforandroid.recipe import CompiledComponentsPythonRecipe, Recipe
|
|
from multiprocessing import cpu_count
|
|
from os.path import join
|
|
from os import environ
|
|
from pythonforandroid.util import build_platform
|
|
|
|
|
|
def arch_to_toolchain(arch):
|
|
if 'arm' in arch.arch:
|
|
return arch.command_prefix
|
|
return arch.arch
|
|
|
|
|
|
class ScipyRecipe(CompiledComponentsPythonRecipe):
|
|
|
|
version = '1.8.1'
|
|
url = f'https://github.com/scipy/scipy/releases/download/v{version}/scipy-{version}.zip'
|
|
site_packages_name = 'scipy'
|
|
depends = ['setuptools', 'cython', 'numpy', 'lapack', 'pybind11']
|
|
call_hostpython_via_targetpython = False
|
|
need_stl_shared = True
|
|
|
|
def build_compiled_components(self, arch):
|
|
self.setup_extra_args = ['-j', str(cpu_count())]
|
|
super().build_compiled_components(arch)
|
|
self.setup_extra_args = []
|
|
|
|
def rebuild_compiled_components(self, arch, env):
|
|
self.setup_extra_args = ['-j', str(cpu_count())]
|
|
super().rebuild_compiled_components(arch, env)
|
|
self.setup_extra_args = []
|
|
|
|
def get_recipe_env(self, arch):
|
|
env = super().get_recipe_env(arch)
|
|
arch_env = arch.get_env()
|
|
|
|
env['LDFLAGS'] = arch_env['LDFLAGS']
|
|
env['LDFLAGS'] += ' -L{} -lpython{}'.format(
|
|
self.ctx.python_recipe.link_root(arch.arch),
|
|
self.ctx.python_recipe.link_version,
|
|
)
|
|
|
|
ndk_dir = environ["LEGACY_NDK"]
|
|
GCC_VER = '4.9'
|
|
HOST = build_platform
|
|
suffix = '64' if '64' in arch.arch else ''
|
|
|
|
prefix = arch.command_prefix
|
|
CLANG_BIN = f'{ndk_dir}/toolchains/llvm/prebuilt/{HOST}/bin/'
|
|
GCC = f'{ndk_dir}/toolchains/{arch_to_toolchain(arch)}-{GCC_VER}/prebuilt/{HOST}'
|
|
libgfortran = f'{GCC}/{prefix}/lib{suffix}'
|
|
numpylib = self.ctx.get_python_install_dir(arch.arch) + '/numpy'
|
|
arch_cflags = ' '.join(arch.arch_cflags)
|
|
LDSHARED_opts = f'-target {arch.target} {arch_cflags} ' + ' '.join(arch.common_ldshared)
|
|
|
|
# TODO: add pythran support
|
|
env['SCIPY_USE_PYTHRAN'] = '0'
|
|
|
|
lapack_dir = join(Recipe.get_recipe('lapack', self.ctx).get_build_dir(arch.arch), 'build', 'install')
|
|
env['LAPACK'] = f'{lapack_dir}/lib'
|
|
env['BLAS'] = env['LAPACK']
|
|
|
|
# compilers
|
|
env['F77'] = f'{GCC}/bin/{prefix}-gfortran'
|
|
env['F90'] = f'{GCC}/bin/{prefix}-gfortran'
|
|
env['CC'] = f'{CLANG_BIN}clang -target {arch.target} {arch_cflags}'
|
|
env['CXX'] = f'{CLANG_BIN}clang++ -target {arch.target} {arch_cflags}'
|
|
|
|
# scipy expects ldshared to be a single executable without options
|
|
env['LDSHARED'] = f'{CLANG_BIN}/clang'
|
|
|
|
# erase the default NDK C++ include options
|
|
env['CPPFLAGS'] = '-DANDROID'
|
|
|
|
# configure linker
|
|
env['LDFLAGS'] += f' {LDSHARED_opts} -L{libgfortran} -L{numpylib}/core/lib -L{numpylib}/random/lib'
|
|
env['LDFLAGS'] += f' -l{self.stl_lib_name}'
|
|
return env
|
|
|
|
|
|
recipe = ScipyRecipe()
|