From 5884909b25bf9e870d7957447ecf45186b7733c0 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Wed, 10 May 2023 16:13:21 +0200 Subject: [PATCH] Add target aarch64_musl_* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I have to mention that adding a new cross compiled target never seems so simple. --- kiwixbuild/dependencies/__init__.py | 1 + kiwixbuild/dependencies/arm_musl.py | 14 ++++ kiwixbuild/platforms/__init__.py | 1 + kiwixbuild/platforms/arm_musl.py | 114 ++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 kiwixbuild/dependencies/arm_musl.py create mode 100644 kiwixbuild/platforms/arm_musl.py diff --git a/kiwixbuild/dependencies/__init__.py b/kiwixbuild/dependencies/__init__.py index 70d5de8..24f68c9 100644 --- a/kiwixbuild/dependencies/__init__.py +++ b/kiwixbuild/dependencies/__init__.py @@ -5,6 +5,7 @@ from . import ( android_ndk, aria2, armhf, + arm_musl, docoptcpp, emsdk, flatpak, diff --git a/kiwixbuild/dependencies/arm_musl.py b/kiwixbuild/dependencies/arm_musl.py new file mode 100644 index 0000000..c7066ae --- /dev/null +++ b/kiwixbuild/dependencies/arm_musl.py @@ -0,0 +1,14 @@ +from .base import Dependency, ReleaseDownload, NoopBuilder +from kiwixbuild.utils import Remotefile + +class aarch64_musl_toolchain(Dependency): + dont_skip = True + neutral = True + name = "aarch64_musl" + + class Source(ReleaseDownload): + archive = Remotefile('aarch64-linux-musl-cross.tgz', + 'c909817856d6ceda86aa510894fa3527eac7989f0ef6e87b5721c58737a06c38', + 'https://musl.cc/aarch64-linux-musl-cross.tgz') + + Builder = NoopBuilder diff --git a/kiwixbuild/platforms/__init__.py b/kiwixbuild/platforms/__init__.py index b73ddbc..5222bd0 100644 --- a/kiwixbuild/platforms/__init__.py +++ b/kiwixbuild/platforms/__init__.py @@ -4,6 +4,7 @@ from .base import * from . import ( android, armhf, + arm_musl, flatpak, i586, ios, diff --git a/kiwixbuild/platforms/arm_musl.py b/kiwixbuild/platforms/arm_musl.py new file mode 100644 index 0000000..dc8ea10 --- /dev/null +++ b/kiwixbuild/platforms/arm_musl.py @@ -0,0 +1,114 @@ +from .base import PlatformInfo, MixedMixin + +from kiwixbuild.utils import pj +from kiwixbuild._global import get_target_step + + +class Aarch64MuslPlatformInfo(PlatformInfo): + build = 'aarch64_musl' + arch_full = 'aarch64-linux-musl' + toolchain_names = ['aarch64_musl'] + compatible_hosts = ['fedora', 'debian'] + libdir = "lib/aarch64-linux-musl" + + def get_cross_config(self): + return { + 'binaries': self.binaries, + 'exe_wrapper_def': '', + 'root_path': self.root_path, + 'extra_libs': [], + 'extra_cflags': ['-I{}'.format(include_dir) for include_dir in self.get_include_dirs()], + 'host_machine': { + 'system': 'linux', + 'lsystem': 'linux', + 'cpu_family': 'arm', + 'cpu': 'armhf', + 'endian': 'little', + 'abi': '' + } + } + + @property + def tlc_source(self): + return get_target_step(self.build, 'source') + + @property + def root_path(self): + return self.tlc_source.source_path + + @property + def binaries(self): + binaries = ((k,'{}-{}'.format(self.arch_full, v)) + for k, v in (('CC', 'gcc'), + ('CXX', 'g++'), + ('AR', 'ar'), + ('STRIP', 'strip'), + ('WINDRES', 'windres'), + ('RANLIB', 'ranlib'), + ('LD', 'ld'), + ('LDSHARED', 'g++ -shared') + ) + ) + binaries = {k:pj(self.root_path, 'bin', v) + for k,v in binaries} + binaries['PKGCONFIG'] = 'pkg-config' + return binaries + + @property + def exe_wrapper_def(self): + try: + which('qemu-arm') + except subprocess.CalledProcessError: + return "" + else: + return "exe_wrapper = 'qemu-arm'" + + @property + def configure_option(self): + return '--host={}'.format(self.arch_full) + + def get_bin_dir(self): + return [pj(self.root_path, 'bin')] + + def get_env(self): + env = super().get_env() + env['LD_LIBRARY_PATH'] = ':'.join([ + pj(self.root_path, self.arch_full, 'lib64'), + pj(self.root_path, 'lib'), + env['LD_LIBRARY_PATH'] + ]) + env['PKG_CONFIG_LIBDIR'] = pj(self.root_path, 'lib', 'pkgconfig') + env['QEMU_LD_PREFIX'] = pj(self.root_path, self.arch_full, "libc") + env['QEMU_SET_ENV'] = "LD_LIBRARY_PATH={}".format( + ':'.join([ + pj(self.root_path, self.arch_full, "lib"), + env['LD_LIBRARY_PATH'] + ])) + return env + + def set_comp_flags(self, env): + super().set_comp_flags(env) + env['CFLAGS'] = " -fPIC -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4 "+env['CFLAGS'] + env['CXXFLAGS'] = " -fPIC -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4 "+env['CXXFLAGS'] + + def set_compiler(self, env): + for k, v in self.binaries.items(): + env[k] = v + + def finalize_setup(self): + super().finalize_setup() + self.buildEnv.cmake_crossfile = self._gen_crossfile('cmake_cross_file.txt') + self.buildEnv.meson_crossfile = self._gen_crossfile('meson_cross_file.txt') + + +class Aarch64MuslDyn(Aarch64MuslPlatformInfo): + name = 'aarch64_musl_dyn' + static = False + +class Aarch64MuslStatic(Aarch64MuslPlatformInfo): + name = 'aarch64_musl_static' + static = True + +class Aarch64MuslMixed(MixedMixin('aarch64_musl_static'), Aarch64MuslPlatformInfo): + name = 'aarch64_musl_mixed' + static = False