summaryrefslogtreecommitdiff
path: root/xmake/modules/core
diff options
context:
space:
mode:
authorruki <[email protected]>2020-05-24 21:10:49 +0800
committerGitHub <[email protected]>2020-05-24 21:10:49 +0800
commitfb2ba113ca1534249b0872002af0f133becd7e51 (patch)
treed5bc9fb1553f622842712b18a7959a0c08a92d63 /xmake/modules/core
parentdd09a2264181f82a0b6aefb38dce5c92fb3af8fe (diff)
parent5ad2eaee8cd65987359dbdfc5149bdd61b9260fc (diff)
Merge pull request #792 from xmake-io/toolchain
Improve to detect cross-compilation toolchains
Diffstat (limited to 'xmake/modules/core')
-rw-r--r--xmake/modules/core/tools/dmd.lua27
-rw-r--r--xmake/modules/core/tools/go.lua2
-rw-r--r--xmake/modules/core/tools/ld.lua99
-rw-r--r--xmake/modules/core/tools/ldc2.lua2
-rw-r--r--xmake/modules/core/tools/llvm_ar.lua3
-rw-r--r--xmake/modules/core/tools/nasm.lua139
-rw-r--r--xmake/modules/core/tools/rustc.lua6
7 files changed, 264 insertions, 14 deletions
diff --git a/xmake/modules/core/tools/dmd.lua b/xmake/modules/core/tools/dmd.lua
index eaadb249c..378c68642 100644
--- a/xmake/modules/core/tools/dmd.lua
+++ b/xmake/modules/core/tools/dmd.lua
@@ -27,10 +27,10 @@ import("core.project.project")
function init(self)
-- init arflags
- self:set("dc-arflags", "-lib")
+ self:set("dcarflags", "-lib")
-- init shflags
- self:set("dc-shflags", "-shared", "-fPIC")
+ self:set("dcshflags", "-shared", "-fPIC")
-- init dcflags for the kind: shared
self:set("shared.dcflags", "-fPIC")
@@ -134,15 +134,30 @@ end
-- make the rpathdir flag
function nf_rpathdir(self, dir)
- local flag = "-L-rpath=" .. os.args(dir)
- if self:has_flags(flag) then
- return flag
+ dir = path.translate(dir)
+ if self:has_flags("-L-rpath=" .. dir, "ldflags") then
+ return "-L-rpath=" .. os.args(dir:gsub("@[%w_]+", function (name)
+ local maps = {["@loader_path"] = "$ORIGIN", ["@executable_path"] = "$ORIGIN"}
+ return maps[name]
+ end))
+
+ elseif self:has_flags("-L-rpath -L" .. dir, "ldflags") then
+ return "-L-rpath -L" .. os.args(dir:gsub("%$ORIGIN", "@loader_path"))
end
end
-- make the link arguments list
function linkargv(self, objectfiles, targetkind, targetfile, flags)
- return self:program(), table.join(flags, "-of" .. targetfile, objectfiles)
+
+ -- add rpath for dylib (macho), e.g. -install_name @rpath/file.dylib
+ local flags_extra = {}
+ if targetkind == "shared" and is_plat("macosx") then
+ table.insert(flags_extra, "-L-install_name")
+ table.insert(flags_extra, "-L@rpath/" .. path.filename(targetfile))
+ end
+
+ -- init arguments
+ return self:program(), table.join(flags, flags_extra, "-of" .. targetfile, objectfiles)
end
-- link the target file
diff --git a/xmake/modules/core/tools/go.lua b/xmake/modules/core/tools/go.lua
index 944a14eff..80230ba4f 100644
--- a/xmake/modules/core/tools/go.lua
+++ b/xmake/modules/core/tools/go.lua
@@ -27,7 +27,7 @@ import("core.project.project")
function init(self)
-- init arflags
- self:set("gc-arflags", "grc")
+ self:set("gcarflags", "grc")
-- init the file formats
self:set("formats", { static = "$(name).a" })
diff --git a/xmake/modules/core/tools/ld.lua b/xmake/modules/core/tools/ld.lua
new file mode 100644
index 000000000..6894d21b8
--- /dev/null
+++ b/xmake/modules/core/tools/ld.lua
@@ -0,0 +1,99 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-2020, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file ld.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("core.project.project")
+import("core.language.language")
+
+-- init it
+function init(self)
+
+ -- init shflags
+ self:set("shflags", "-shared")
+
+ -- add -fPIC for shared
+ if not is_plat("windows", "mingw") then
+ self:add("shflags", "-fPIC")
+ self:add("shared.cxflags", "-fPIC")
+ end
+end
+
+-- make the strip flag
+function nf_strip(self, level)
+ local maps =
+ {
+ debug = "-S"
+ , all = "-s"
+ }
+
+ local plat = config.plat()
+ if plat == "macosx" or plat == "iphoneos" then
+ maps.all = "-Wl,-x"
+ maps.debug = "-Wl,-S"
+ end
+ return maps[level]
+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 linkdir flag
+function nf_linkdir(self, dir)
+ return "-L" .. os.args(path.translate(dir))
+end
+
+-- make the link arguments list
+function linkargv(self, objectfiles, targetkind, targetfile, flags, opt)
+
+ -- init arguments
+ local argv = table.join("-o", targetfile, objectfiles, flags)
+
+ -- too long arguments for windows?
+ if is_host("windows") then
+ opt = opt or {}
+ local args = os.args(argv, {escape = true})
+ if #args > 1024 and not opt.rawargs then
+ local argsfile = os.tmpfile(args) .. ".args.txt"
+ io.writefile(argsfile, args)
+ argv = {"@" .. argsfile}
+ end
+ end
+ return self:program(), argv
+end
+
+-- link the target file
+function link(self, objectfiles, targetkind, targetfile, flags)
+
+ -- ensure the target directory
+ os.mkdir(path.directory(targetfile))
+
+ -- link it
+ os.runv(linkargv(self, objectfiles, targetkind, targetfile, flags))
+end
+
diff --git a/xmake/modules/core/tools/ldc2.lua b/xmake/modules/core/tools/ldc2.lua
index ef4796156..9cf9fd48b 100644
--- a/xmake/modules/core/tools/ldc2.lua
+++ b/xmake/modules/core/tools/ldc2.lua
@@ -28,7 +28,7 @@ function init(self)
_super.init(self)
-- init shflags
- self:set("dc-shflags", "-shared")
+ self:set("dcshflags", "-shared")
-- init cxflags for the kind: shared
self:set("shared.dcflags", "")
diff --git a/xmake/modules/core/tools/llvm_ar.lua b/xmake/modules/core/tools/llvm_ar.lua
index b9674ffaf..0d890bd5c 100644
--- a/xmake/modules/core/tools/llvm_ar.lua
+++ b/xmake/modules/core/tools/llvm_ar.lua
@@ -24,9 +24,6 @@ import("core.tool.compiler")
-- init it
function init(self)
self:set("arflags", "cr")
- if is_plat("cross") and is_subhost("windows") then
- self:set("formats", { static = "$(name).lib" })
- end
end
-- make the strip flag
diff --git a/xmake/modules/core/tools/nasm.lua b/xmake/modules/core/tools/nasm.lua
new file mode 100644
index 000000000..a02091f07
--- /dev/null
+++ b/xmake/modules/core/tools/nasm.lua
@@ -0,0 +1,139 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-2020, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file nasm.lua
+--
+
+-- imports
+import("core.base.option")
+
+-- init it
+function init(self)
+
+ -- init flags map
+ self:set("mapflags",
+ {
+ -- symbols
+ ["-g"] = ""
+ , ["-fvisibility=.*"] = ""
+
+ -- warnings
+ , ["-Wall"] = "" -- = "-Wall" will enable too more warnings
+ , ["-W1"] = ""
+ , ["-W2"] = ""
+ , ["-W3"] = ""
+ , ["-Werror"] = ""
+ , ["%-Wno%-error=.*"] = ""
+
+ -- others
+ , ["-ftrapv"] = ""
+ , ["-fsanitize=address"] = ""
+ })
+end
+
+-- make the warning flag
+function nf_warning(self, level)
+
+ -- the maps
+ local maps =
+ {
+ none = "-w"
+ }
+
+ -- make it
+ return maps[level]
+end
+
+-- make the define flag
+function nf_define(self, macro)
+ return "-D" .. macro
+end
+
+-- make the undefine flag
+function nf_undefine(self, macro)
+ return "-U" .. macro
+end
+
+-- make the includedir flag
+function nf_includedir(self, dir)
+ return "-I" .. os.args(dir)
+end
+
+-- make the compile arguments list
+function _compargv1(self, sourcefile, objectfile, flags)
+ return self:program(), table.join(flags, "-o", objectfile, sourcefile)
+end
+
+-- compile the source file
+function _compile1(self, sourcefile, objectfile, dependinfo, flags)
+
+ -- ensure the object directory
+ os.mkdir(path.directory(objectfile))
+
+ -- compile it
+ local outdata, errdata = try
+ {
+ function ()
+ return os.iorunv(_compargv1(self, sourcefile, objectfile, flags))
+ end,
+ catch
+ {
+ function (errors)
+
+ -- try removing the old object file for forcing to rebuild this source file
+ os.tryrm(objectfile)
+
+ -- raise compiling errors
+ raise(tostring(errors))
+ end
+ },
+ finally
+ {
+ function (ok, outdata, errdata)
+
+ -- show warnings?
+ if ok and errdata and (option.get("diagnosis") or option.get("warning")) then
+ errdata = errdata:trim()
+ if #errdata > 0 then
+ cprint("${color.warning}%s", errdata)
+ end
+ end
+ end
+ }
+ }
+end
+
+-- make the compile arguments list
+function compargv(self, sourcefiles, objectfile, flags)
+
+ -- only support single source file now
+ assert(type(sourcefiles) ~= "table", "'object:sources' not support!")
+
+ -- for only single source file
+ return _compargv1(self, sourcefiles, objectfile, flags)
+end
+
+-- compile the source file
+function compile(self, sourcefiles, objectfile, dependinfo, flags)
+
+ -- only support single source file now
+ assert(type(sourcefiles) ~= "table", "'object:sources' not support!")
+
+ -- for only single source file
+ _compile1(self, sourcefiles, objectfile, dependinfo, flags)
+end
+
diff --git a/xmake/modules/core/tools/rustc.lua b/xmake/modules/core/tools/rustc.lua
index 227c6ad43..0ec83c803 100644
--- a/xmake/modules/core/tools/rustc.lua
+++ b/xmake/modules/core/tools/rustc.lua
@@ -27,13 +27,13 @@ import("core.project.project")
function init(self)
-- init arflags
- self:set("rc-arflags", "--crate-type=lib")
+ self:set("rcarflags", "--crate-type=lib")
-- init shflags
- self:set("rc-shflags", "--crate-type=dylib")
+ self:set("rcshflags", "--crate-type=dylib")
-- init ldflags
- self:set("rc-ldflags", "--crate-type=bin")
+ self:set("rcldflags", "--crate-type=bin")
-- init the file formats
self:set("formats", { static = "lib$(name).rlib" })