diff options
| author | ruki <[email protected]> | 2022-09-16 09:48:49 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-09-16 09:48:49 +0800 |
| commit | 777c93e76da1b5dd3820080dfe634cdf9b5054a9 (patch) | |
| tree | 51f576a48cf351a7b643deb2367ebf153b5a5957 | |
| parent | 1fb310ac5b3eb8100281021429994c53de30ccfd (diff) | |
| parent | 5febbdf508db8463f765ca51c6901eb44c63eeca (diff) | |
Merge pull request #2824 from xmake-io/meson
pass cross file to meson
| -rw-r--r-- | xmake/modules/package/tools/meson.lua | 179 |
1 files changed, 148 insertions, 31 deletions
diff --git a/xmake/modules/package/tools/meson.lua b/xmake/modules/package/tools/meson.lua index f76604735..6a0463492 100644 --- a/xmake/modules/package/tools/meson.lua +++ b/xmake/modules/package/tools/meson.lua @@ -47,6 +47,149 @@ function _map_linkflags(package, targetkind, sourcekinds, name, values) return linker.map_flags(targetkind, sourcekinds, name, values, {target = package}) end +-- is cross compilation? +function _is_cross_compilation(package) + if not package:is_plat(os.subhost()) then + return true + end + if package:is_plat("macosx") and not package:is_arch(os.subarch()) then + return true + end + return false +end + +-- get pkg-config +function _get_pkgconfig(package) + if package:is_plat("windows") then + local pkgconf = find_tool("pkgconf") + if pkgconf then + return pkgconf.program + end + end + local pkgconfig = find_tool("pkg-config") + if pkgconfig then + return pkgconfig.program + end +end + +-- get cross file +function _get_cross_file(package, opt) + opt = opt or {} + local crossfile = path.join(_get_buildir(package, opt), "cross_file.txt") + if not os.isfile(crossfile) then + local file = io.open(crossfile, "w") + -- binaries + file:print("[binaries]") + local cc = package:build_getenv("cc") + if cc then + file:print("c='%s'", cc) + end + local cxx = package:build_getenv("cxx") + if cxx then + file:print("cpp='%s'", cxx) + end + local ld = package:build_getenv("ld") + if ld then + file:print("ld='%s'", ld) + end + local ar = package:build_getenv("ar") + if ar then + file:print("ar='%s'", ar) + end + local strip = package:build_getenv("strip") + if strip then + file:print("strip='%s'", strip) + end + local ranlib = package:build_getenv("ranlib") + if ranlib then + file:print("ranlib='%s'", ranlib) + end + local cmake = find_tool("cmake") + if cmake then + file:print("cmake='%s'", cmake.program) + end + local pkgconfig = _get_pkgconfig(package) + if pkgconfig then + file:print("pkgconfig='%s'", pkgconfig) + end + file:print("") + + -- properties + file:print("[properties]") + file:print("skip_sanity_check = true") + local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) + local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) + local asflags = table.wrap(package:build_getenv("asflags")) + local arflags = table.wrap(package:build_getenv("arflags")) + local ldflags = table.wrap(package:build_getenv("ldflags")) + local shflags = table.wrap(package:build_getenv("shflags")) + table.join2(cflags, opt.cflags) + table.join2(cflags, opt.cxflags) + table.join2(cxxflags, opt.cxxflags) + table.join2(cxxflags, opt.cxflags) + table.join2(asflags, opt.asflags) + table.join2(ldflags, opt.ldflags) + table.join2(shflags, opt.shflags) + table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) + table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) + table.join2(shflags, _get_ldflags_from_packagedeps(package, opt)) + if #cflags > 0 then + file:print("c_args=['%s']", table.concat(cflags, "', '")) + end + if #cxxflags > 0 then + file:print("cpp_args=['%s']", table.concat(cxxflags, "', '")) + end + local linkflags = table.join(ldflags or {}, shflags) + if #linkflags > 0 then + file:print("c_link_args=['%s']", table.concat(linkflags, "', '")) + file:print("cpp_link_args=['%s']", table.concat(linkflags, "', '")) + end + file:print("") + + -- host machine + file:print("[host_machine]") + if opt.host_machine then + file:print("%s", opt.host_machine) + elseif package:is_plat("iphoneos", "macosx") then + -- TODO + elseif package:is_plat("android") then + -- TODO + elseif package:is_plat("mingw") then + local cpu + local cpu_family + if package:is_arch("x64", "x86_64") then + cpu = "x86_64" + cpu_family = "x86_64" + elseif package:is_arch("x86", "i386") then + cpu = "i686" + cpu_family = "x86" + else + raise("unsupported arch(%s)", package:arch()) + end + file:print("system = 'windows'") + file:print("cpu_family = '%s'", cpu_family) + file:print("cpu = '%s'", cpu) + file:print("endian = 'little'") + elseif package:is_plat("cross") and package:targetos() then + local cpu = package:arch() + if package:is_arch("arm64") then + cpu = "aarch64" + elseif package:is_arch("arm.*") then + cpu = "arm" + end + local cpu_family = cpu + file:print("system = '%s'", package:targetos() or "linux") + file:print("cpu_family = '%s'", cpu_family) + file:print("cpu = '%s'", cpu) + file:print("endian = 'little'") + end + file:print("") + file:close() + end + return crossfile +end + -- get configs function _get_configs(package, configs, opt) @@ -73,6 +216,11 @@ function _get_configs(package, configs, opt) table.insert(configs, "-Db_vscrt=" .. package:config("vs_runtime"):lower()) end + -- add cross file + if _is_cross_compilation(package) then + table.insert(configs, "--cross-file=" .. _get_cross_file(package, opt)) + end + -- add build directory table.insert(configs, _get_buildir(package, opt)) return configs @@ -164,37 +312,6 @@ function buildenvs(package, opt) envs.PKG_CONFIG = pkgconf.program end end - else - local cflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cflags")) - local cxxflags = table.join(table.wrap(package:build_getenv("cxflags")), package:build_getenv("cxxflags")) - local asflags = table.wrap(package:build_getenv("asflags")) - local arflags = table.wrap(package:build_getenv("arflags")) - local ldflags = table.wrap(package:build_getenv("ldflags")) - local shflags = table.wrap(package:build_getenv("shflags")) - table.join2(cflags, opt.cflags) - table.join2(cflags, opt.cxflags) - table.join2(cxxflags, opt.cxxflags) - table.join2(cxxflags, opt.cxflags) - table.join2(asflags, opt.asflags) - table.join2(ldflags, opt.ldflags) - table.join2(shflags, opt.shflags) - table.join2(cflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(cxxflags, _get_cflags_from_packagedeps(package, opt)) - table.join2(ldflags, _get_ldflags_from_packagedeps(package, opt)) - table.join2(shflags, _get_ldflags_from_packagedeps(package, opt)) - envs.CC = package:build_getenv("cc") - envs.AS = package:build_getenv("as") - envs.AR = package:build_getenv("ar") - envs.LD = package:build_getenv("ld") - envs.LDSHARED = package:build_getenv("sh") - envs.CPP = package:build_getenv("cpp") - envs.RANLIB = package:build_getenv("ranlib") - envs.CFLAGS = table.concat(cflags, ' ') - envs.CXXFLAGS = table.concat(cxxflags, ' ') - envs.ASFLAGS = table.concat(asflags, ' ') - envs.ARFLAGS = table.concat(arflags, ' ') - envs.LDFLAGS = table.concat(ldflags, ' ') - envs.SHFLAGS = table.concat(shflags, ' ') end local ACLOCAL_PATH = {} local PKG_CONFIG_PATH = {} |
