package("rustlib") set_kind("template") set_description("Template to help with Rust libraries in xrepo") on_load(function (package) local toolchainconfigs = {} toolchainconfigs.target_plat = package:plat() toolchainconfigs.target_arch = package:arch() if package:is_plat("cross") then -- detect cross configuration from the compiler, if possible local compiler, toolname = package:tool("cc") if toolname == "clang" or toolname == "gcc" then local outdata, errdata = os.iorunv(compiler, {"-v"}) local output = #outdata:trim() > 0 and outdata or errdata local target = output:match("Target: ([^\r\n]*)") if target then if toolname == "gcc" then target = target:replace("-none-", "-unknown-", {plain = true}) end package:data_set("cross_target", target) local parts = target:split("-", {plain = true}) if #parts >= 3 then toolchainconfigs.target_arch = parts[1] toolchainconfigs.target_system = table.concat(parts, "-", 2, #parts - 1) toolchainconfigs.target_abi = parts[#parts] end end end end package:add("deps", "rust", {configs = toolchainconfigs}) end) on_check("mingw|i386", function (package) -- MinGW 32bits exception model must match rustc LLVM exception model (dwarf2) local mingw = package:toolchain("mingw") if not mingw then return end local compiler, toolname = mingw:tool("cc") if toolname ~= "gcc" then return end local output, errdata = os.iorunv(compiler, {"-v"}) -- for some reason the output is in stderr if #output:trim() == 0 then output = errdata end assert(output:find("--with-dwarf2", 1, true), "rustc is only compatible with dwarf2 exception model in 32bits mode, please use dwarf2 MinGW") end) on_install(function (package) -- pass rust toolchain configuration local rust = package:dep("rust") local rcfile_path = os.tmpfile() .. ".lua" local rcfile = io.open(rcfile_path, 'w') rcfile:print("add_requires(\"rust\", %s)", string.serialize(rust:requireinfo(), {strip = true, indent = false})) local cross_target = package:data("cross_target") if cross_target then rcfile:print("add_requireconfs(\"cargo::naga\", {arch = \"%s\", override = true})", cross_target) rcfile:print("add_rcflags(\"--target=%s\")", cross_target) end rcfile:close() local envs = import("package.tools.xmake").buildenvs(package) table.insert(envs.XMAKE_RCFILES, rcfile_path) package:data_set("xmake_envs", envs) end)