summaryrefslogtreecommitdiff
path: root/xmake/modules/detect
diff options
context:
space:
mode:
authorruki <[email protected]>2020-07-09 22:06:03 +0800
committerruki <[email protected]>2020-07-09 06:36:19 +0800
commit57c15ee42343b7ca4c9b5b860aff9a27b266ae3d (patch)
tree50ef27e845e86b8e4dcc5154f7aa54f149a3deb6 /xmake/modules/detect
parent519535ca82c093b011ccec2ba4c8378c117f72c0 (diff)
improve zig
Diffstat (limited to 'xmake/modules/detect')
-rw-r--r--xmake/modules/detect/tools/dmd/has_flags.lua2
-rw-r--r--xmake/modules/detect/tools/go/has_flags.lua4
-rw-r--r--xmake/modules/detect/tools/zig/has_flags.lua120
3 files changed, 123 insertions, 3 deletions
diff --git a/xmake/modules/detect/tools/dmd/has_flags.lua b/xmake/modules/detect/tools/dmd/has_flags.lua
index 02ece3260..c9b045b68 100644
--- a/xmake/modules/detect/tools/dmd/has_flags.lua
+++ b/xmake/modules/detect/tools/dmd/has_flags.lua
@@ -32,7 +32,7 @@ function _islinker(flags, opt)
-- the tool kind is ld or sh?
local toolkind = opt.toolkind or ""
- return toolkind == "ld" or toolkind == "sh" or toolkind:endswith("-ld") or toolkind:endswith("-sh")
+ return toolkind == "ld" or toolkind == "sh" or toolkind:endswith("ld") or toolkind:endswith("sh")
end
-- try running
diff --git a/xmake/modules/detect/tools/go/has_flags.lua b/xmake/modules/detect/tools/go/has_flags.lua
index a33fad322..c8ab17ba9 100644
--- a/xmake/modules/detect/tools/go/has_flags.lua
+++ b/xmake/modules/detect/tools/go/has_flags.lua
@@ -25,9 +25,9 @@ import("core.language.language")
-- is linker?
function _islinker(flags, opt)
- -- the tool kind is go-ld or gosh?
+ -- the tool kind is gcld or gcsh?
local toolkind = opt.toolkind or ""
- return toolkind:endswith("-ld") or toolkind:endswith("-sh")
+ return toolkind:endswith("ld") or toolkind:endswith("sh")
end
-- try running
diff --git a/xmake/modules/detect/tools/zig/has_flags.lua b/xmake/modules/detect/tools/zig/has_flags.lua
new file mode 100644
index 000000000..3b1150afb
--- /dev/null
+++ b/xmake/modules/detect/tools/zig/has_flags.lua
@@ -0,0 +1,120 @@
+--!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 has_flags.lua
+--
+
+-- imports
+import("lib.detect.cache")
+
+-- is linker?
+function _islinker(flags, opt)
+
+ -- the tool kind is ld or sh?
+ local toolkind = opt.toolkind or ""
+ return toolkind == "ld" or toolkind == "sh" or toolkind:endswith("ld") or toolkind:endswith("sh")
+end
+
+-- try running
+function _try_running(...)
+
+ local argv = {...}
+ local errors = nil
+ return try { function () os.runv(unpack(argv)); return true end, catch { function (errs) errors = (errs or ""):trim() end }}, errors
+end
+
+-- attempt to check it from the argument list
+function _check_from_arglist(flags, opt, islinker)
+
+ -- only for compiler
+ if islinker or #flags > 1 then
+ return
+ end
+
+ -- make cache key
+ local key = "detect.tools.zig.has_flags"
+
+ -- make allflags key
+ local flagskey = opt.program .. "_" .. (opt.programver or "")
+
+ -- load cache
+ local cacheinfo = cache.load(key)
+
+ -- get all allflags from argument list
+ local allflags = cacheinfo[flagskey]
+ if not allflags then
+
+ -- get argument list
+ allflags = {}
+ local arglist = os.iorunv(opt.program, {"--help"})
+ if arglist then
+ for arg in arglist:gmatch("%s+(%-[%-%a%d]+)%s+") do
+ allflags[arg] = true
+ end
+ end
+
+ -- save cache
+ cacheinfo[flagskey] = allflags
+ cache.save(key, cacheinfo)
+ end
+
+ -- ok?
+ return allflags[flags[1]]
+end
+
+-- try running to check flags
+function _check_try_running(flags, opt, islinker)
+
+ -- make an stub source file
+ local sourcefile = path.join(os.tmpdir(), "detect", "zig_has_flags.zig")
+ local objectdir = path.join(os.tmpdir(), "detect", "zig_has_flags")
+ if not os.isfile(sourcefile) then
+ io.writefile(sourcefile, "pub fn main() !void {\n}")
+ end
+
+ -- init argv
+ local argv = table.join(flags, "--output-dir", objectdir, sourcefile)
+ if islinker then
+ table.insert(argv, 1, "build-exe")
+ else
+ table.insert(argv, 1, "build-obj")
+ end
+
+ -- check it
+ return _try_running(opt.program, argv)
+end
+
+-- has_flags(flags)?
+--
+-- @param opt the argument options, e.g. {toolname = "", program = "", programver = "", toolkind = "[cc|cxx|ld|ar|sh|gc|rc|dc|mm|mxx]"}
+--
+-- @return true or false
+--
+function main(flags, opt)
+
+ -- is linker?
+ local islinker = _islinker(flags, opt)
+
+ -- attempt to check it from the argument list
+ if _check_from_arglist(flags, opt, islinker) then
+ return true
+ end
+
+ -- try running to check it
+ return _check_try_running(flags, opt, islinker)
+end
+