123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 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)
|