summaryrefslogtreecommitdiff
path: root/xmake/modules/core/tools/rustc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/modules/core/tools/rustc.lua')
-rw-r--r--xmake/modules/core/tools/rustc.lua82
1 files changed, 53 insertions, 29 deletions
diff --git a/xmake/modules/core/tools/rustc.lua b/xmake/modules/core/tools/rustc.lua
index ade2daea4..ab41620cd 100644
--- a/xmake/modules/core/tools/rustc.lua
+++ b/xmake/modules/core/tools/rustc.lua
@@ -25,24 +25,10 @@ import("core.project.project")
-- init it
function init(self)
-
- -- init arflags
- self:set("rcarflags", "--crate-type=lib")
-
- -- init shflags
- self:set("rcshflags", "--crate-type=dylib")
-
- -- init ldflags
- self:set("rcldflags", "--crate-type=bin")
-
- -- init the file formats
- self:set("formats", { static = "lib$(name).rlib" })
end
-- make the optimize flag
function nf_optimize(self, level)
-
- -- the maps
local maps =
{
none = "-C opt-level=0"
@@ -52,21 +38,15 @@ function nf_optimize(self, level)
, smallest = "-C opt-level=s"
, aggressive = "-C opt-level=z"
}
-
- -- make it
return maps[level]
end
-- make the symbol flag
function nf_symbol(self, level)
-
- -- the maps
local maps =
{
debug = "-C debuginfo=2"
}
-
- -- make it
return maps[level]
end
@@ -75,18 +55,66 @@ function nf_linkdir(self, dir)
return {"-L" .. dir}
end
+-- make the link flag
+function nf_link(self, lib)
+ return "-l" .. lib
+end
+
+-- make the syslink flag
+function nf_syslink(self, lib)
+ return nf_link(self, lib)
+end
+
+-- make the frameworkdir flag, crate module dependency directories
+function nf_frameworkdir(self, frameworkdir)
+ return {"-L", "dependency=" .. frameworkdir}
+end
+
+-- make the framework flag, crate module
+function nf_framework(self, framework)
+ local basename = path.basename(framework)
+ local cratename = basename:match("lib(.-)%-.-") or basename:match("lib(.-)")
+ if cratename then
+ return {"--extern", cratename .. "=" .. framework}
+ end
+end
+
+-- make the rpathdir flag
+function nf_rpathdir(self, dir)
+ dir = path.translate(dir)
+ if self:has_flags({"-C", "link-arg=-Wl,-rpath=$ORIGIN"}, "ldflags") then
+ return {"-C", "link-arg=-Wl,-rpath=" .. (dir:gsub("@[%w_]+", function (name)
+ local maps = {["@loader_path"] = "$ORIGIN", ["@executable_path"] = "$ORIGIN"}
+ return maps[name]
+ end))}
+ elseif self:has_flags({"-C", "link-arg=-Xlinker", "-C", "link-arg=-rpath", "-C", "link-arg=-Xlinker", "-C", "link-arg=@loader_path"}, "ldflags") then
+ return {"-C", "link-arg=-Xlinker",
+ "-C", "link-arg=-rpath",
+ "-C", "link-arg=-Xlinker",
+ "-C", "link-arg=" .. (dir:gsub("%$ORIGIN", "@loader_path"))}
+ end
+end
+
-- make the build arguments list
function buildargv(self, sourcefiles, targetkind, targetfile, flags)
- return self:program(), table.join(flags, "-o", targetfile, sourcefiles)
+ -- add rpath for dylib (macho), e.g. -install_name @rpath/file.dylib
+ local flags_extra = {}
+ if targetkind == "shared" and is_plat("macosx", "iphoneos", "watchos") then
+ table.insert(flags_extra, "-C")
+ table.insert(flags_extra, "link-arg=-Xlinker")
+ table.insert(flags_extra, "-C")
+ table.insert(flags_extra, "link-arg=-install_name")
+ table.insert(flags_extra, "-C")
+ table.insert(flags_extra, "link-arg=-Xlinker")
+ table.insert(flags_extra, "-C")
+ table.insert(flags_extra, "link-arg=@rpath/" .. path.filename(targetfile))
+ end
+ return self:program(), table.join(flags, flags_extra, "-o", targetfile, sourcefiles)
end
-- build the target file
function build(self, sourcefiles, targetkind, targetfile, flags)
-
- -- ensure the target directory
os.mkdir(path.directory(targetfile))
-
- -- build it
os.runv(buildargv(self, sourcefiles, targetkind, targetfile, flags))
end
@@ -97,11 +125,7 @@ end
-- compile the source file
function compile(self, sourcefiles, objectfile, dependinfo, flags)
-
- -- ensure the object directory
os.mkdir(path.directory(objectfile))
-
- -- compile it
os.runv(compargv(self, sourcefiles, objectfile, flags))
end