72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
|
from pythonforandroid.recipe import Recipe
|
||
|
from pythonforandroid.logger import shprint
|
||
|
from pythonforandroid.util import current_directory
|
||
|
from os.path import exists, join
|
||
|
import sh
|
||
|
import glob
|
||
|
|
||
|
|
||
|
class LibffiRecipe(Recipe):
|
||
|
name = 'libffi'
|
||
|
version = 'v3.2.1'
|
||
|
url = 'https://github.com/atgreen/libffi/archive/{version}.zip'
|
||
|
|
||
|
patches = ['remove-version-info.patch']
|
||
|
|
||
|
def get_host(self, arch):
|
||
|
with current_directory(self.get_build_dir(arch.arch)):
|
||
|
host = None
|
||
|
with open('Makefile') as f:
|
||
|
for line in f:
|
||
|
if line.startswith('host = '):
|
||
|
host = line.strip()[7:]
|
||
|
break
|
||
|
|
||
|
if not host or not exists(host):
|
||
|
raise RuntimeError('failed to find build output! ({})'
|
||
|
.format(host))
|
||
|
|
||
|
return host
|
||
|
|
||
|
def should_build(self, arch):
|
||
|
# return not bool(glob.glob(join(self.ctx.get_libs_dir(arch.arch),
|
||
|
# 'libffi.so*')))
|
||
|
return not exists(join(self.ctx.get_libs_dir(arch.arch), 'libffi.so'))
|
||
|
# return not exists(join(self.ctx.get_python_install_dir(), 'lib',
|
||
|
# 'libffi.so'))
|
||
|
|
||
|
def build_arch(self, 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)
|
||
|
shprint(sh.Command('./configure'), '--host=' + arch.toolchain_prefix,
|
||
|
'--prefix=' + self.ctx.get_python_install_dir(),
|
||
|
'--enable-shared', _env=env)
|
||
|
shprint(sh.make, '-j5', 'libffi.la', _env=env)
|
||
|
|
||
|
|
||
|
# dlname = None
|
||
|
# with open(join(host, 'libffi.la')) as f:
|
||
|
# for line in f:
|
||
|
# if line.startswith('dlname='):
|
||
|
# dlname = line.strip()[8:-1]
|
||
|
# break
|
||
|
#
|
||
|
# if not dlname or not exists(join(host, '.libs', dlname)):
|
||
|
# raise RuntimeError('failed to locate shared object! ({})'
|
||
|
# .format(dlname))
|
||
|
|
||
|
# shprint(sh.sed, '-i', 's/^dlname=.*$/dlname=\'libffi.so\'/', join(host, 'libffi.la'))
|
||
|
|
||
|
shprint(sh.cp, '-t', self.ctx.get_libs_dir(arch.arch),
|
||
|
join(self.get_host(arch), '.libs', 'libffi.so')) #,
|
||
|
# join(host, 'libffi.la'))
|
||
|
|
||
|
def get_include_dirs(self, arch):
|
||
|
return [join(self.get_build_dir(arch.arch), self.get_host(arch), 'include')]
|
||
|
|
||
|
|
||
|
recipe = LibffiRecipe()
|