diff options
| author | ruki <[email protected]> | 2016-04-14 10:07:13 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2016-04-14 10:07:13 +0800 |
| commit | bfd9b3a115c932973fecc82915f0cead7e6ceaa2 (patch) | |
| tree | dca32143b2f5d0f6dc5a57091bd14c8b2ddb815c | |
| parent | 1479b3c2c9ef3621fec864c0dd305ad4b1f5c60f (diff) | |
fix ar and swiftc bug
18 files changed, 56 insertions, 880 deletions
diff --git a/xmake/core/platform/platforms/android/prober.lua b/xmake/core/platform/platforms/android/prober.lua index 215a93bfe..8a37630fe 100644 --- a/xmake/core/platform/platforms/android/prober.lua +++ b/xmake/core/platform/platforms/android/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -108,7 +108,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -134,7 +134,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -164,7 +164,7 @@ function prober._probe_toolpath(configs, kind, cross, name, description) local toolpath = nil local toolchains = configs.get("toolchains") if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -188,7 +188,7 @@ function prober._probe_toolpath(configs, kind, cross, name, description) -- probe the tool path if toolchains then for _, filepath in ipairs(toolchains) do - toolpath = tool.probe(cross .. name, path.directory(filepath)) + toolpath = tool.check(cross .. name, path.directory(filepath)) if toolpath then break end end end diff --git a/xmake/core/platform/platforms/iphoneos/prober.lua b/xmake/core/platform/platforms/iphoneos/prober.lua index 5e0da4534..683954525 100644 --- a/xmake/core/platform/platforms/iphoneos/prober.lua +++ b/xmake/core/platform/platforms/iphoneos/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -167,7 +167,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -193,7 +193,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -226,7 +226,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -236,7 +236,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/iphonesimulator/prober.lua b/xmake/core/platform/platforms/iphonesimulator/prober.lua index a3f55d3a6..71eb921fa 100644 --- a/xmake/core/platform/platforms/iphonesimulator/prober.lua +++ b/xmake/core/platform/platforms/iphonesimulator/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -167,7 +167,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -193,7 +193,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -226,7 +226,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -236,7 +236,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/linux/prober.lua b/xmake/core/platform/platforms/linux/prober.lua index 86e2bc8b0..55af51a8f 100644 --- a/xmake/core/platform/platforms/linux/prober.lua +++ b/xmake/core/platform/platforms/linux/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -63,7 +63,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -89,7 +89,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -122,7 +122,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -132,7 +132,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/macosx/prober.lua b/xmake/core/platform/platforms/macosx/prober.lua index 639b4f338..42352d8de 100644 --- a/xmake/core/platform/platforms/macosx/prober.lua +++ b/xmake/core/platform/platforms/macosx/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -167,7 +167,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -193,7 +193,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -226,7 +226,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -236,7 +236,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/mingw/prober.lua b/xmake/core/platform/platforms/mingw/prober.lua index 848dc3f6a..307a16f60 100644 --- a/xmake/core/platform/platforms/mingw/prober.lua +++ b/xmake/core/platform/platforms/mingw/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -59,7 +59,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -85,7 +85,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -118,7 +118,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -128,7 +128,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/watchos/prober.lua b/xmake/core/platform/platforms/watchos/prober.lua index 8c7f28eb2..1fd7332eb 100644 --- a/xmake/core/platform/platforms/watchos/prober.lua +++ b/xmake/core/platform/platforms/watchos/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -167,7 +167,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -193,7 +193,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -226,7 +226,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -236,7 +236,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/watchsimulator/prober.lua b/xmake/core/platform/platforms/watchsimulator/prober.lua index 1338783d4..abdec157d 100644 --- a/xmake/core/platform/platforms/watchsimulator/prober.lua +++ b/xmake/core/platform/platforms/watchsimulator/prober.lua @@ -25,7 +25,7 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local string = require("base/string") -local tool = require("platform/tool") +local tool = require("tool/tool") local config = require("project/config") local global = require("project/global") @@ -167,7 +167,7 @@ function prober._probe_make(configs) if make then return true end -- probe the make path - make = tool.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + make = tool.check("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if make then configs.set("make", make) end @@ -193,7 +193,7 @@ function prober._probe_ccache(configs) end -- probe the ccache path - local ccache_path = tool.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + local ccache_path = tool.check("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) -- probe ok? update it if ccache_path then @@ -226,7 +226,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to get it from the given cross toolchains if toolchains then - toolpath = tool.probe(cross .. (configs.get(kind) or name), toolchains) + toolpath = tool.check(cross .. (configs.get(kind) or name), toolchains) end -- attempt to get it directly from the configure @@ -236,7 +236,7 @@ function prober._probe_toolpath(configs, kind, cross, names, description) -- attempt to run it directly if not toolpath then - toolpath = tool.probe(cross .. name) + toolpath = tool.check(cross .. name) end -- probe ok? diff --git a/xmake/core/platform/platforms/windows/prober.lua b/xmake/core/platform/platforms/windows/prober.lua index 2c1726ac9..46e41b149 100644 --- a/xmake/core/platform/platforms/windows/prober.lua +++ b/xmake/core/platform/platforms/windows/prober.lua @@ -28,7 +28,6 @@ local utils = require("base/utils") local string = require("base/string") local config = require("project/config") local global = require("project/global") -local tool = require("platform/tool") local platform = require("platform/platform") -- define module: prober diff --git a/xmake/core/platform/platforms/windows/tools/cl.lua b/xmake/core/platform/platforms/windows/tools/cl.lua deleted file mode 100644 index d03cbc056..000000000 --- a/xmake/core/platform/platforms/windows/tools/cl.lua +++ /dev/null @@ -1,141 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file cl.lua --- - --- define module: cl -local cl = cl or {} - --- load modules -local utils = require("base/utils") -local string = require("base/string") -local config = require("project/config") -local platform = require("platform/platform") - --- init the compiler -function cl.init(self, name) - - -- save name - self.name = name or "cl.exe" - - -- init cxflags - self.cxflags = { "-nologo", "-Gd", "-MP4", "-D_MBCS", "-D_CRT_SECURE_NO_WARNINGS"} - - -- init flags map - self.mapflags = - { - -- optimize - ["-O0"] = "-Od" - , ["-O3"] = "-Ot" - , ["-Ofast"] = "-Ox" - , ["-fomit-frame-pointer"] = "-Oy" - - -- symbols - , ["-g"] = "-Z7" - , ["-fvisibility=.*"] = "" - - -- warnings - , ["-Wall"] = "-W3" -- = "-Wall" will enable too more warnings - , ["-W1"] = "-W1" - , ["-W2"] = "-W2" - , ["-W3"] = "-W3" - , ["-Werror"] = "-WX" - , ["%-Wno%-error=.*"] = "" - , ["%-fno%-.*"] = "" - - -- vectorexts - , ["-mmmx"] = "-arch:MMX" - , ["-msse"] = "-arch:SSE" - , ["-msse2"] = "-arch:SSE2" - , ["-msse3"] = "-arch:SSE3" - , ["-mssse3"] = "-arch:SSSE3" - , ["-mavx"] = "-arch:AVX" - , ["-mavx2"] = "-arch:AVX2" - , ["-mfpu=.*"] = "" - - -- language - , ["-ansi"] = "" - , ["-std=c99"] = "-TP" -- compile as c++ files because msvc only support c89 - , ["-std=c11"] = "-TP" -- compile as c++ files because msvc only support c89 - , ["-std=gnu99"] = "-TP" -- compile as c++ files because msvc only support c89 - , ["-std=gnu11"] = "-TP" -- compile as c++ files because msvc only support c89 - , ["-std=.*"] = "" - - -- others - , ["-ftrapv"] = "" - , ["-fsanitize=address"] = "" - } - -end - --- make the compiler command -function cl.command_compile(self, srcfile, objfile, flags, logfile) - - -- redirect - local redirect = "" - if logfile then redirect = string.format(" > %s 2>&1", logfile) end - - -- make it - return string.format("%s -c %s -Fo%s %s%s", self.name, flags, objfile, srcfile, redirect) -end - --- make the define flag -function cl.flag_define(self, define) - - -- make it - return "-D" .. define:gsub("\"", "\\\"") -end - --- make the undefine flag -function cl.flag_undefine(self, undefine) - - -- make it - return "-U" .. undefine -end - --- make the includedir flag -function cl.flag_includedir(self, includedir) - - -- make it - return "-I" .. includedir -end - --- the main function -function cl.main(self, cmd) - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- execute it - local ok = os.execute(cmd) - - -- leave envirnoment - windows.leave() - - -- ok? - return utils.ifelse(ok == 0, true, false) -end - --- return module: cl -return cl diff --git a/xmake/core/platform/platforms/windows/tools/lib.lua b/xmake/core/platform/platforms/windows/tools/lib.lua deleted file mode 100644 index 571d0ef3f..000000000 --- a/xmake/core/platform/platforms/windows/tools/lib.lua +++ /dev/null @@ -1,138 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file lib.lua --- - --- define module: lib -local lib = lib or {} - --- load modules -local io = require("base/io") -local os = require("base/os") -local path = require("base/path") -local utils = require("base/utils") -local string = require("base/string") -local config = require("project/config") -local platform = require("platform/platform") - --- init the compiler -function lib.init(self, name) - - -- save name - self.name = name or "lib.exe" - -end - --- extract the static library to object files -function lib.extract(self, ...) - - -- check - local args = ... - assert(#args == 2 and self.name) - - -- get library and object file path - local libfile = args[1] - local objfile = args[2] - assert(libfile and objfile) - - -- get object directory - local objdir = path.directory(objfile) - if not os.isdir(objdir) then os.mkdir(objdir) end - if not os.isdir(objdir) then - utils.error("%s not found!", objdir) - return false - end - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- list object files - local file = io.popen(string.format("%s -nologo -list %s", self.name, libfile)) - if not file then - utils.error("extract %s to %s failed!", libfile, objdir) - windows.leave() - return false - end - - -- extrace all object files - for line in file:lines() do - - -- is object file? - if line:find("%.obj") then - - -- init command - local out = path.translate(string.format("%s\\%s", objdir, path.filename(line))) - - -- repeat? rename it - if os.isfile(out) then - for i = 0, 10 do - out = path.translate(string.format("%s\\%d_%s", objdir, i, path.filename(line))) - if not os.isfile(out) then break end - end - end - - -- init command - local cmd = string.format("%s -nologo -extract:%s -out:%s %s", self.name, line, out, libfile) - - -- extract it - if 0 ~= os.execute(cmd) then - utils.error("extract %s to %s failed!", libfile, objdir) - windows.leave() - return false - end - end - end - - -- exit file - file:close() - - -- leave envirnoment - windows.leave() - - -- ok - return true -end - --- the main function -function lib.main(self, cmd) - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- execute it - local ok = os.execute(cmd) - - -- leave envirnoment - windows.leave() - - -- ok? - return utils.ifelse(ok == 0, true, false) -end - --- return module: lib -return lib diff --git a/xmake/core/platform/platforms/windows/tools/link.lua b/xmake/core/platform/platforms/windows/tools/link.lua deleted file mode 100644 index a536626d6..000000000 --- a/xmake/core/platform/platforms/windows/tools/link.lua +++ /dev/null @@ -1,128 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file link.lua --- - --- define module: link -local link = link or {} - --- load modules -local utils = require("base/utils") -local string = require("base/string") -local config = require("project/config") -local platform = require("platform/platform") - --- init the compiler -function link.init(self, name) - - -- save name - self.name = name or "link.exe" - - -- the architecture - local arch = config.get("arch") - assert(arch) - - -- init flags for architecture - local flags_arch = "" - if arch == "x86" then flags_arch = "-machine:x86" - elseif arch == "x64" or arch == "amd64" or arch == "x86_amd64" then flags_arch = "-machine:x64" - end - - -- init ldflags - self.ldflags = { "-nologo" - , "-dynamicbase" - , "-nxcompat" - , flags_arch} - - -- init arflags - self.arflags = {"-nologo", flags_arch} - - -- init shflags - self.shflags = {"-nologo", flags_arch} - - -- init flags map - self.mapflags = - { - -- strip - ["-s"] = "" - , ["-S"] = "" - - -- others - , ["-ftrapv"] = "" - , ["-fsanitize=address"] = "" - } - -end - --- make the linker command -function link.command_link(self, objfiles, targetfile, flags, logfile) - - -- redirect - local redirect = "" - if logfile then redirect = string.format(" > %s 2>&1", logfile) end - - -- make it - local cmd = string.format("%s %s -out:%s %s%s", self.name, flags, targetfile, objfiles, redirect) - - -- too long? - if #cmd > 256 then - cmd = string.format("%s%s @<<\n%s -out:%s %s\n<<", self.name, redirect, flags, targetfile, objfiles) - end - - -- ok? - return cmd -end - --- make the link flag -function link.flag_link(self, link) - - -- make it - return link .. ".lib" -end - --- make the linkdir flag -function link.flag_linkdir(self, linkdir) - - -- make it - return "-libpath:" .. linkdir -end - --- the main function -function link.main(self, cmd) - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- execute it - local ok = os.execute(cmd) - - -- leave envirnoment - windows.leave() - - -- ok? - return utils.ifelse(ok == 0, true, false) -end - --- return module: link -return link diff --git a/xmake/core/platform/platforms/windows/tools/ml.lua b/xmake/core/platform/platforms/windows/tools/ml.lua deleted file mode 100644 index 5b91ab7b7..000000000 --- a/xmake/core/platform/platforms/windows/tools/ml.lua +++ /dev/null @@ -1,132 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file ml.lua --- - --- define module: ml -local ml = ml or {} - --- load modules -local utils = require("base/utils") -local string = require("base/string") -local config = require("project/config") -local platform = require("platform/platform") - --- init the compiler -function ml.init(self, name) - - -- save name - self.name = name or "ml.exe" - - -- init asflags - self.asflags = { "-nologo", "-Gd", "-MP4", "-D_MBCS", "-D_CRT_SECURE_NO_WARNINGS"} - - -- init flags map - self.mapflags = - { - -- optimize - ["-O0"] = "-Od" - , ["-O3"] = "-Ot" - , ["-Ofast"] = "-Ox" - , ["-fomit-frame-pointer"] = "-Oy" - - -- symbols - , ["-g"] = "-Z7" - , ["-fvisibility=.*"] = "" - - -- warnings - , ["-Wall"] = "-W3" -- = "-Wall" will enable too more warnings - , ["-W1"] = "-W1" - , ["-W2"] = "-W2" - , ["-W3"] = "-W3" - , ["-Werror"] = "-WX" - , ["%-Wno%-error=.*"] = "" - - -- vectorexts - , ["-mmmx"] = "-arch:MMX" - , ["-msse"] = "-arch:SSE" - , ["-msse2"] = "-arch:SSE2" - , ["-msse3"] = "-arch:SSE3" - , ["-mssse3"] = "-arch:SSSE3" - , ["-mavx"] = "-arch:AVX" - , ["-mavx2"] = "-arch:AVX2" - , ["-mfpu=.*"] = "" - - -- others - , ["-ftrapv"] = "" - , ["-fsanitize=address"] = "" - } - -end - --- make the compiler command -function ml.command_compile(self, srcfile, objfile, flags, logfile) - - -- redirect - local redirect = "" - if logfile then redirect = string.format(" > %s 2>&1", logfile) end - - -- make it - return string.format("%s -c %s -Fo%s %s%s", self.name, flags, objfile, srcfile, redirect) -end - --- make the define flag -function ml.flag_define(self, define) - - -- make it - return "-D" .. define:gsub("\"", "\\\"") -end - --- make the undefine flag -function ml.flag_undefine(self, undefine) - - -- make it - return "-U" .. undefine -end - --- make the includedir flag -function ml.flag_includedir(self, includedir) - - -- make it - return "-I" .. includedir -end - --- the main function -function ml.main(self, cmd) - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- execute it - local ok = os.execute(cmd) - - -- leave envirnoment - windows.leave() - - -- ok? - return utils.ifelse(ok == 0, true, false) -end - --- return module: ml -return ml diff --git a/xmake/core/platform/platforms/windows/tools/nmake.lua b/xmake/core/platform/platforms/windows/tools/nmake.lua deleted file mode 100644 index d2e1505f6..000000000 --- a/xmake/core/platform/platforms/windows/tools/nmake.lua +++ /dev/null @@ -1,75 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file nmake.lua --- - --- load modules -local os = require("base/os") -local path = require("base/path") -local utils = require("base/utils") -local string = require("base/string") -local option = require("base/option") -local config = require("project/config") -local platform = require("platform/platform") - --- define module: nmake -local nmake = nmake or {} - --- the init function -function nmake.init(self, name) - - -- save name - self.name = name or "nmake.exe" - - -- is verbose? - self._VERBOSE = utils.ifelse(option.get("verbose"), "-v", "") - -end - --- the main function -function nmake.main(self, mkfile, target) - - -- the windows module - local windows = platform.module() - assert(windows) - - -- enter envirnoment - windows.enter() - - -- make command - local cmd = nil - if mkfile and os.isfile(mkfile) then - cmd = string.format("%s /nologo /f %s %s VERBOSE=%s", self.name, mkfile, target or "", self._VERBOSE) - else - cmd = string.format("%s /nologo %s VERBOSE=%s", self.name, target or "", self._VERBOSE) - end - - -- done - local ok = os.execute(cmd) - - -- leave envirnoment - windows.leave() - - -- ok? - return utils.ifelse(ok == 0, true, false) -end - --- return module: nmake -return nmake diff --git a/xmake/core/platform/tool.lua b/xmake/core/platform/tool.lua deleted file mode 100644 index cc7346179..000000000 --- a/xmake/core/platform/tool.lua +++ /dev/null @@ -1,224 +0,0 @@ ---!The Automatic Cross-platform Build Tool --- --- XMake is free software; you can redistribute it and/or modify --- it under the terms of the GNU Lesser General Public License as published by --- the Free Software Foundation; either version 2.1 of the License, or --- (at your option) any later version. --- --- XMake is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public License --- along with XMake; --- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> --- --- Copyright (C) 2015 - 2016, ruki All rights reserved. --- --- @author ruki --- @file tool.lua --- - --- define module: tool -local tool = tool or {} - --- load modules -local os = require("base/os") -local path = require("base/path") -local utils = require("base/utils") -local string = require("base/string") -local platform = require("platform/platform") - --- match the tool name -function tool._match(name, toolname) - - -- match full? ok - if name == toolname then return 100 end - - -- match the last word? ok - if name:find(toolname .. "$") then return 80 end - - -- match the partial word? ok - if name:find("%-" .. toolname) then return 60 end - - -- contains it? ok - if name:find(toolname, 1, true) then return 30 end - - -- not matched - return 0 -end - --- find tool from the given root directory and name -function tool._find_from(root, name) - - -- attempt to get it directly first - local filepath = string.format("%s/%s.lua", root, name) - if os.isfile(filepath) then - return filepath - end - - -- make the lower name - name = name:lower() - - -- get all tool files - local file_ok = nil - local score_maxn = 0 - local files = os.match(string.format("%s/*.lua", root)) - for _, file in ipairs(files) do - - -- the tool name - local toolname = path.basename(file) - - -- found it? - if toolname and toolname ~= "tool" then - - -- match score - local score = tool._match(name, toolname:lower()) - - -- ok? - if score >= 100 then return file end - - -- select the file with the max score - if score > score_maxn then - file_ok = file - score_maxn = score - end - end - end - - -- ok? - return file_ok -end - --- probe it's absolute path if exists from the given tool name and root directory -function tool._probe(root, name) - - -- check - assert(root and name) - - -- make the tool path - local toolpath = string.format("%s/%s", root, name) - toolpath = path.translate(toolpath) - - -- the tool exists? ok - if toolpath and os.isfile(toolpath) then - return toolpath - end -end - --- find tool from the given name and directory (optional) -function tool.find(name, root) - - -- check - assert(name) - - -- init filename - local filepath = nil - - -- uses the basename only - name = path.basename(name) - assert(name) - - -- only find it from this directory if the given directory exists - if root then return tool._find_from(root, name) end - - -- attempt to find it from the current platform directory first - if not filepath then filepath = tool._find_from(path.join(platform.directory(), "tools"), name) end - - -- attempt to find it from the script directory - if not filepath then filepath = tool._find_from(path.join(xmake._CORE_DIR, "platform/tools"), name) end - - -- ok? - return filepath -end - --- load tool from the given name and directory (optional) -function tool.load(name, root) - - -- check - assert(name) - - -- get it directly from cache dirst - tool._TOOLS = tool._TOOLS or {} - if tool._TOOLS[name] then - return tool._TOOLS[name] - end - - -- find the tool file path - local toolpath = tool.find(name, root) - - -- not exists? - if not toolpath or not os.isfile(toolpath) then - return nil, string.format("%s not found!", name) - end - - -- load script - local script, errors = loadfile(toolpath) - if script then - - -- load tool - local ok, result = pcall(script) - if not ok then - return nil, result - end - - -- init tool - if result and result.init then - result:init(name) - end - - -- save tool to the cache - tool._TOOLS[name] = result - - -- ok? - return result - end - - - -- failed - return nil, errors -end - --- get the given tool script from the given kind -function tool.get(kind) - - -- get the tool name - local toolname = platform.tool(kind) - if not toolname then - return nil, string.format("cannot get tool name for %s", kind) - end - - -- load it - return tool.load(toolname) -end - --- probe it's absolute path if exists from the given tool name -function tool.probe(name, dirs) - - -- check - assert(name) - - -- attempt to run it directly first - if os.execute(string.format("%s > %s 2>&1", name, xmake._NULDEV)) ~= 0x7f00 then - return name - end - - -- attempt to get it from the given directories - if dirs then - for _, dir in ipairs(table.wrap(dirs)) do - - -- probe it - local toolpath = tool._probe(dir, name) - - -- ok? - if toolpath and os.execute(string.format("%s > %s 2>&1", toolpath, xmake._NULDEV)) ~= 0x7f00 then - return toolpath - end - end - end -end - - --- return module: tool -return tool diff --git a/xmake/core/tool/tool.lua b/xmake/core/tool/tool.lua index 75ef33a22..98ab836ac 100644 --- a/xmake/core/tool/tool.lua +++ b/xmake/core/tool/tool.lua @@ -388,6 +388,7 @@ function tool.check(shellname, dirs) -- check assert(shellname) + -- FIXME: 7f00 -- attempt to run it directly first if os.execute(string.format("%s > %s 2>&1", shellname, xmake._NULDEV)) ~= 0x7f00 then return shellname diff --git a/xmake/tools/compiler/swiftc.lua b/xmake/tools/compiler/swiftc.lua index b61a342d6..517df88a8 100644 --- a/xmake/tools/compiler/swiftc.lua +++ b/xmake/tools/compiler/swiftc.lua @@ -64,6 +64,13 @@ function init(shellname) end +-- get the property +function get(name) + + -- get it + return _g[name] +end + -- make the compile command function command(srcfile, objfile, flags, logfile) diff --git a/xmake/tools/linker/ar.lua b/xmake/tools/linker/ar.lua index 12beaab0a..3c261a375 100644 --- a/xmake/tools/linker/ar.lua +++ b/xmake/tools/linker/ar.lua @@ -27,10 +27,17 @@ function init(shellname) _g.shellname = shellname or "ar" -- init arflags - _g.arflags = { "-crs" } + _g.arflags = { "-cr" } end +-- get the property +function get(name) + + -- get it + return _g[name] +end + -- make the command function command(objfiles, targetfile, flags, logfile) |
