lbry-android-sdk/p4a/pythonforandroid/recipes/icu/__init__.py
2022-12-02 15:15:34 -05:00

127 lines
4.8 KiB
Python

import sh
import os
import platform
from os.path import join, isdir, exists
from multiprocessing import cpu_count
from pythonforandroid.recipe import Recipe
from pythonforandroid.toolchain import shprint
from pythonforandroid.util import current_directory, ensure_dir
class ICURecipe(Recipe):
name = 'icu4c'
version = '57.1'
major_version = version.split('.')[0]
url = (
"https://github.com/unicode-org/icu/releases/download/"
"release-{version_hyphen}/icu4c-{version_underscore}-src.tgz"
)
depends = ['hostpython3'] # installs in python
patches = ['disable-libs-version.patch']
built_libraries = {
'libicui18n{}.so'.format(major_version): 'build_icu_android/lib',
'libicuuc{}.so'.format(major_version): 'build_icu_android/lib',
'libicudata{}.so'.format(major_version): 'build_icu_android/lib',
'libicule{}.so'.format(major_version): 'build_icu_android/lib',
'libicuio{}.so'.format(major_version): 'build_icu_android/lib',
'libicutu{}.so'.format(major_version): 'build_icu_android/lib',
'libiculx{}.so'.format(major_version): 'build_icu_android/lib',
}
@property
def versioned_url(self):
if self.url is None:
return None
return self.url.format(
version=self.version,
version_underscore=self.version.replace('.', '_'),
version_hyphen=self.version.replace('.', '-'))
def get_recipe_dir(self):
"""
.. note:: We need to overwrite `Recipe.get_recipe_dir` due to the
mismatch name between the recipe's folder (icu) and the value
of `ICURecipe.name` (icu4c).
"""
if self.ctx.local_recipes is not None:
local_recipe_dir = join(self.ctx.local_recipes, 'icu')
if exists(local_recipe_dir):
return local_recipe_dir
return join(self.ctx.root_dir, 'recipes', 'icu')
def build_arch(self, arch):
env = self.get_recipe_env(arch).copy()
build_root = self.get_build_dir(arch.arch)
def make_build_dest(dest):
build_dest = join(build_root, dest)
if not isdir(build_dest):
ensure_dir(build_dest)
return build_dest, False
return build_dest, True
icu_build = join(build_root, "icu_build")
build_host, exists = make_build_dest("build_icu_host")
host_env = os.environ.copy()
# reduce the function set
host_env["CPPFLAGS"] = (
"-O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=1 -fno-short-enums "
"-DU_HAVE_NL_LANGINFO_CODESET=0 -D__STDC_INT64__ -DU_TIMEZONE=0 "
"-DUCONFIG_NO_LEGACY_CONVERSION=1 "
"-DUCONFIG_NO_TRANSLITERATION=0 ")
if not exists:
icu4c_host_platform = platform.system()
if icu4c_host_platform == "Darwin":
icu4c_host_platform = "MacOSX"
configure = sh.Command(
join(build_root, "source", "runConfigureICU"))
with current_directory(build_host):
shprint(
configure,
icu4c_host_platform,
"--prefix="+icu_build,
"--enable-extras=no",
"--enable-strict=no",
"--enable-static=no",
"--enable-tests=no",
"--enable-samples=no",
_env=host_env)
shprint(sh.make, "-j", str(cpu_count()), _env=host_env)
shprint(sh.make, "install", _env=host_env)
build_android, exists = make_build_dest("build_icu_android")
if not exists:
configure = sh.Command(join(build_root, "source", "configure"))
with current_directory(build_android):
shprint(
configure,
"--with-cross-build="+build_host,
"--enable-extras=no",
"--enable-strict=no",
"--enable-static=no",
"--enable-tests=no",
"--enable-samples=no",
"--host="+arch.command_prefix,
"--prefix="+icu_build,
_env=env)
shprint(sh.make, "-j", str(cpu_count()), _env=env)
shprint(sh.make, "install", _env=env)
def install_libraries(self, arch):
super().install_libraries(arch)
src_include = join(
self.get_build_dir(arch.arch), "icu_build", "include")
dst_include = join(
self.ctx.get_python_install_dir(arch.arch), "include", "icu")
ensure_dir(dst_include)
shprint(sh.cp, "-r", join(src_include, "layout"), dst_include)
shprint(sh.cp, "-r", join(src_include, "unicode"), dst_include)
recipe = ICURecipe()