Build icu4c using meson on Windows.

This commit is contained in:
Matthieu Gautier 2023-11-29 14:42:03 +01:00
parent 765f2fa2d7
commit a2f659895e
1 changed files with 80 additions and 63 deletions

View File

@ -1,27 +1,32 @@
from .base import Dependency, ReleaseDownload, MakeBuilder from .base import (
Dependency,
ReleaseDownload,
MakeBuilder, MesonBuilder
)
from kiwixbuild.utils import pj, SkipCommand, Remotefile, extract_archive from kiwixbuild.utils import pj, SkipCommand, Remotefile, extract_archive
from kiwixbuild._global import get_target_step, neutralEnv from kiwixbuild._global import get_target_step, neutralEnv
import os, shutil import os, shutil
import fileinput import fileinput
import platform
class Icu(Dependency): class Icu(Dependency):
name = "icu4c" name = "icu4c"
class Source(ReleaseDownload): class Source(ReleaseDownload):
archive_src = Remotefile( archive_src = Remotefile('icu4c-73_2-src.tgz',
"icu4c-73_2-src.tgz", '818a80712ed3caacd9b652305e01afc7fa167e6f2e94996da44b90c2ab604ce1',
"818a80712ed3caacd9b652305e01afc7fa167e6f2e94996da44b90c2ab604ce1", 'https://github.com/unicode-org/icu/releases/download/release-73-2/icu4c-73_2-src.tgz')
"https://github.com/unicode-org/icu/releases/download/release-73-2/icu4c-73_2-src.tgz", archive_data = Remotefile('icu4c-73_2-data.zip',
) 'ca1ee076163b438461e484421a7679fc33a64cd0a54f9d4b401893fa1eb42701',
archive_data = Remotefile( 'https://github.com/unicode-org/icu/releases/download/release-73-2/icu4c-73_2-data.zip')
"icu4c-73_2-data.zip", meson_patch = Remotefile('icu_73.2-2_patch.zip',
"ca1ee076163b438461e484421a7679fc33a64cd0a54f9d4b401893fa1eb42701", '',
"https://github.com/unicode-org/icu/releases/download/release-73-2/icu4c-73_2-data.zip", 'https://wrapdb.mesonbuild.com/v2/icu_73.2-2/get_patch')
)
archives = [archive_src, archive_data]
archives = [archive_src, archive_data, meson_patch]
def _extract(self, context): def _extract(self, context):
context.try_skip(self.extract_path) context.try_skip(self.extract_path)
@ -42,56 +47,68 @@ class Icu(Dependency):
topdir="data", topdir="data",
name="data", name="data",
) )
extract_archive(
patches = [ pj(neutralEnv('archive_dir'), self.meson_patch.name),
"icu4c_fix_static_lib_name_mingw.patch", neutralEnv('source_dir'),
# "icu4c_android_elf64_st_info.patch", topdir='icu',
# "icu4c_custom_data.patch", name= self.source_dir
# "icu4c_noxlocale.patch",
"icu4c_rpath.patch",
# "icu4c_build_config.patch",
"icu4c_wasm.patch",
]
class Builder(MakeBuilder):
subsource_dir = "source"
make_install_targets = ["install"]
@classmethod
def get_dependencies(cls, configInfo, allDeps):
plt = "native_static" if configInfo.static else "native_dyn"
return [(plt, "icu4c")]
@property
def configure_options(self):
yield "--disable-samples"
yield "--disable-tests"
yield "--disable-extras"
yield "--disable-dyload"
yield "--enable-rpath"
yield "--disable-icuio"
yield "--disable-layoutex"
configInfo = self.buildEnv.configInfo
if configInfo.build != "native":
icu_native_builder = get_target_step(
"icu4c", "native_static" if configInfo.static else "native_dyn"
)
yield f"--with-cross-build={icu_native_builder.build_path}"
yield "--disable-tools"
if configInfo.build in ("android", "wasm"):
yield "--with-data-packaging=archive"
def set_env(self, env):
env["ICU_DATA_FILTER_FILE"] = pj(
os.path.dirname(os.path.realpath(__file__)), "icu4c_data_filter.json"
) )
def _post_configure_script(self, context): patches = [
if self.buildEnv.configInfo.build != "wasm": "icu4c_fix_static_lib_name_mingw.patch",
context.skip() # "icu4c_android_elf64_st_info.patch",
context.try_skip(self.build_path) # "icu4c_custom_data.patch",
for line in fileinput.input(pj(self.build_path, "Makefile"), inplace=True): # "icu4c_noxlocale.patch",
if line == "#DATASUBDIR = data\n": "icu4c_rpath.patch",
print("DATASUBDIR = data") # "icu4c_build_config.patch",
else: "icu4c_wasm.patch",
print(line, end="") ]
if platform.system() == 'Windows':
class Builder(MesonBuilder):
def set_env(self, env):
env['ICU_DATA_FILTER_FILE'] = pj(os.path.dirname(os.path.realpath(__file__)), "icu4c_data_filter.json")
else:
class Builder(MakeBuilder):
subsource_dir = "source"
make_install_targets = ["install"]
@classmethod
def get_dependencies(cls, configInfo, allDeps):
plt = "native_static" if configInfo.static else "native_dyn"
return [(plt, "icu4c")]
@property
def configure_options(self):
yield "--disable-samples"
yield "--disable-tests"
yield "--disable-extras"
yield "--disable-dyload"
yield "--enable-rpath"
yield "--disable-icuio"
yield "--disable-layoutex"
configInfo = self.buildEnv.configInfo
if configInfo.build != "native":
icu_native_builder = get_target_step(
"icu4c", "native_static" if configInfo.static else "native_dyn"
)
yield f"--with-cross-build={icu_native_builder.build_path}"
yield "--disable-tools"
if configInfo.build in ("android", "wasm"):
yield "--with-data-packaging=archive"
def set_env(self, env):
env["ICU_DATA_FILTER_FILE"] = pj(
os.path.dirname(os.path.realpath(__file__)), "icu4c_data_filter.json"
)
def _post_configure_script(self, context):
if self.buildEnv.configInfo.build != "wasm":
context.skip()
context.try_skip(self.build_path)
for line in fileinput.input(pj(self.build_path, "Makefile"), inplace=True):
if line == "#DATASUBDIR = data\n":
print("DATASUBDIR = data")
else:
print(line, end="")