from pathlib import Path from .base import ConfigInfo from kiwixbuild._global import get_target_step class WasmConfigInfo(ConfigInfo): name = "wasm" static = True build = "wasm" arch_full = "wasm64-emscripten" libdir = "lib" # arch_full = 'wasm64-linux' toolchain_names = ["emsdk"] compatible_hosts = ["fedora", "debian"] exe_wrapper_def = "" def get_cross_config(self): return { "binaries": self.binaries, "exe_wrapper_def": "", "root_path": self.root_path, "extra_libs": [], "extra_cflags": [], "host_machine": { "system": "emscripten", "lsystem": "emscripten", "cpu_family": "wasm64", "cpu": "wasm64", "endian": "little", "abi": "", }, } @property def wasm_sdk(self): return get_target_step("emsdk", self.name) @property def install_path(self) -> Path: return self.wasm_sdk.install_path @property def root_path(self) -> Path: return self.install_path @property def binaries(self): binaries = ( ("CC", "emcc"), ("CXX", "em++"), ("AR", "emar"), ("STRIP", "emstrip"), ("WINDRES", "windres"), ("RANLIB", "emranlib"), ("LD", "wasm-ld"), ) binaries = { k: self.install_path / "upstream" / "emscripten" / v for k, v in binaries } binaries["PKGCONFIG"] = "pkg-config" return binaries @property def configure_options(self): # return "" return [f"--host={self.arch_full}"] @property def configure_wrapper(self): yield "emconfigure" @property def make_wrapper(self): return "emmake" def get_bin_dir(self): return [self.install_path / "bin"] def get_env(self): env = super().get_env() env["PATH"].extend( [ self.install_path, self.install_path / "upstream" / "emscripten", self.install_path / "node" / "14.18.2_64bit" / "bin", ] ) env["EMSDK"] = self.install_path env["EMSDK_NODE"] = ( self.install_path / "node" / "14.18.2_64bit" / "bin" / "node" ) return env def set_comp_flags(self, env): super().set_comp_flags(env) env["CFLAGS"] = ( " -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4 " + env["CFLAGS"] ) env["CXXFLAGS"] = ( " -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")