summaryrefslogtreecommitdiff
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
parent1e7d8c44b51528b129c9d600785fd7a84850646b (diff)
impl has_flags and add detect.flags.xxx
-rw-r--r--xmake/modules/detect/flags/has_fsanitize_address.lua34
-rw-r--r--xmake/modules/lib/detect/has_flags.lua53
2 files changed, 78 insertions, 9 deletions
diff --git a/xmake/modules/detect/flags/has_fsanitize_address.lua b/xmake/modules/detect/flags/has_fsanitize_address.lua
new file mode 100644
index 000000000..36ef766d4
--- /dev/null
+++ b/xmake/modules/detect/flags/has_fsanitize_address.lua
@@ -0,0 +1,34 @@
+--!The Make-like Build Utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you 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 - 2017, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file has_fsanitize_address.lua
+--
+
+-- has flag: '-fsanitize=address'?
+--
+-- @param flag the flag
+-- @param opt the argument options, .e.g {tool = {name = "", program = "", version = ""}}
+--
+-- @return true or false
+--
+function main(flag, opt)
+ -- TODO
+end
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