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
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)
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"})
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)
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)