summaryrefslogtreecommitdiff
path: root/xmake/modules/lib/detect/has_flags.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2017-06-19 21:59:06 +0800
committerruki <[email protected]>2017-06-19 21:59:06 +0800
commitbc5021e091a9e7b962243354c88e0fe11dff563f (patch)
treeeb31e76d72c9b2c9a73a56e124d27caf4cb2f110 /xmake/modules/lib/detect/has_flags.lua
parent1e7d8c44b51528b129c9d600785fd7a84850646b (diff)
impl has_flags and add detect.flags.xxx
Diffstat (limited to 'xmake/modules/lib/detect/has_flags.lua')
-rw-r--r--xmake/modules/lib/detect/has_flags.lua53
1 files changed, 44 insertions, 9 deletions
diff --git a/xmake/modules/lib/detect/has_flags.lua b/xmake/modules/lib/detect/has_flags.lua
index 6aad9b7a8..43abc5a1e 100644
--- a/xmake/modules/lib/detect/has_flags.lua
+++ b/xmake/modules/lib/detect/has_flags.lua
@@ -25,6 +25,36 @@
-- imports
import("lib.detect.find_tool")
+-- get flag name
+--
+-- .e.g
+--
+-- "-fsanitize=address": fsanitize_address
+-- "--coverage": coverage
+-- "-nodefaultlib:\"msvcrt.lib\"": nodefaultlib
+-- "/TP": tp
+-- "fomit-frame-pointer": fomit_frame_pointer
+-- "-Wno-error=deprecated-declarations": wno_error_deprecated_declarations
+-- "-pagezero_size 10000" pagezero_size
+--
+function _get_flagname(flag)
+
+ -- get the first name by ' '
+ local name = flag:lower():split('%s+')[1]
+
+ -- split ':'
+ name = name:split(':')[1]
+
+ -- translate '-', '/' and '=' to '_'
+ name = name:gsub("[%-/=]", "_")
+
+ -- remove prefix '_*' .. xxxx
+ name = name:gsub("^_+", "")
+
+ -- ok?
+ return name
+end
+
-- has this flag?
function _has_flag(name, flag, opt)
@@ -35,12 +65,13 @@ function _has_flag(name, flag, opt)
return false
end
- -- init program and version
- opt.program = tool.program
- opt.version = tool.version
+ -- init tool
+ opt.tool = tool
+
+ -- TODO tool.check, semver(tool.version)
-- init cache and key
- local key = opt.program .. "_" .. (opt.version or "") .. "_" .. flag
+ local key = tool.program .. "_" .. (tool.version or "") .. "_" .. flag
local results = _g._RESULTS or {}
-- get result from the cache first
@@ -49,18 +80,22 @@ function _has_flag(name, flag, opt)
return result
end
+ -- get flag name
+ local flagname = _get_flagname(flag)
+ print(flagname)
+
-- "detect.tools.find_xxx" exists?
local result = nil
- if os.isfile(path.join(os.programdir(), "modules", "detect", "flags", tool.name .. ".lua")) then
- local has_flag_for_tool = import("detect.flags." .. tool.name)
- if has_flag_for_tool then
- result = has_flag_for_tool(flag, opt)
+ if os.isfile(path.join(os.programdir(), "modules", "detect", "flags", "has_ " .. flagname .. ".lua")) then
+ local hasflag = import("detect.flags.has_" .. flagname)
+ if hasflag then
+ result = hasflag(flag, opt)
end
end
-- attempt to check it directly
if result == nil then
- result = try { function () os.runv(opt.program, {flag}); return true end }
+ result = try { function () os.runv(tool.program, {flag}); return true end }
end
-- save result to cache