summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-06-17 23:40:03 +0800
committerruki <[email protected]>2017-06-17 23:40:03 +0800
commite701b9cbef180ca6b222327abab7b92cdf661fe1 (patch)
tree152f5bac1956abe945054345f68db59c43b6e438
parentf66d8f33bbfbcde8be896f63ef42048a931f7f13 (diff)
add find_toolname
-rwxr-xr-xtests/modules/lib/detect/test.lua14
-rw-r--r--xmake/modules/lib/detect/find_toolname.lua102
-rw-r--r--xmake/platforms/checker.lua5
3 files changed, 119 insertions, 2 deletions
diff --git a/tests/modules/lib/detect/test.lua b/tests/modules/lib/detect/test.lua
new file mode 100755
index 000000000..c44084ddc
--- /dev/null
+++ b/tests/modules/lib/detect/test.lua
@@ -0,0 +1,14 @@
+import("lib.detect.find_toolname")
+
+function main()
+ assert(find_toolname("xcrun -sdk macosx clang") == "clang")
+ assert(find_toolname("xcrun -sdk macosx clang++") == "clangxx")
+ assert(find_toolname("/usr/bin/arm-linux-gcc") == "gcc")
+ assert(find_toolname("/usr/bin/arm-linux-g++") == "gxx")
+ assert(find_toolname("/usr/bin/arm-linux-ar") == "ar")
+ assert(find_toolname("link.exe -lib") == "link")
+ assert(find_toolname("arm-android-clang++") == "clangxx")
+ assert(find_toolname("pkg-config") == "pkg_config")
+ assert(find_toolname("gcc-5") == "gcc")
+end
+
diff --git a/xmake/modules/lib/detect/find_toolname.lua b/xmake/modules/lib/detect/find_toolname.lua
new file mode 100644
index 000000000..1d8ce4d04
--- /dev/null
+++ b/xmake/modules/lib/detect/find_toolname.lua
@@ -0,0 +1,102 @@
+--!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 find_toolname.lua
+--
+
+-- find tool name from the given program
+function _find(program)
+
+ -- get file name first
+ name = path.filename(program):lower()
+
+ -- remove arguments: " -xxx" or " --xxx"
+ name = name:gsub("%s%-+%w+", " ")
+
+ -- get the last name by ' ': xxx xxx toolname
+ local names = name:split("%s")
+ if #names > 0 then
+ name = names[#names]
+ end
+
+ -- remove suffix: ".xxx"
+ name = name:gsub("%.%w+", "")
+
+ -- get tool directory
+ local tooldir = path.join(os.programdir(), "modules", "detect", "tool")
+
+ -- find_toolname.lua exists? found
+ local toolname = name:gsub("[%+%-]", function (ch) return ifelse(ch == "+", "x", "_") end)
+ if os.isfile(path.join(tooldir, "find_" .. toolname .. ".lua")) then
+ return toolname
+ end
+
+ -- get the last valid name: xxx-xxx-toolname-5
+ local partnames = {}
+ for partname in name:gmatch("([%a%+]+)") do
+ table.insert(partnames, partname)
+ end
+ if #partnames > 0 then
+ name = partnames[#partnames]
+ end
+
+ -- find_toolname.lua exists? found
+ toolname = name:gsub("%+", "x")
+ if os.isfile(path.join(tooldir, "find_" .. toolname .. ".lua")) then
+ return toolname
+ end
+end
+
+-- find tool name
+--
+-- .e.g
+-- "xcrun -sdk macosx clang": clang
+-- "/usr/bin/arm-linux-gcc": gcc
+-- "link.exe -lib": link
+-- "gcc-5": gcc
+-- "arm-android-clang++": clangxx
+-- "pkg-config": pkg_config
+--
+-- @param program the program path or name
+--
+-- @return the tool name
+--
+function main(program)
+
+ -- init cache
+ local toolnames = _g._TOOLNAMES or {}
+
+ -- get it from the cache first
+ local toolname = toolnames[program]
+ if toolname ~= nil then
+ return ifelse(toolname, toolname, nil)
+ end
+
+ -- find the tool name
+ toolname = _find(program)
+
+ -- save result to cache
+ toolnames[program] = ifelse(toolname, toolname, false)
+ _g._TOOLNAMES = toolnames
+
+ -- found?
+ return toolname
+end
diff --git a/xmake/platforms/checker.lua b/xmake/platforms/checker.lua
index c6cb2b581..3672649e9 100644
--- a/xmake/platforms/checker.lua
+++ b/xmake/platforms/checker.lua
@@ -27,6 +27,7 @@ import("core.base.option")
import("detect.sdk.find_xcode_dir")
import("detect.sdk.find_xcode_sdkvers")
import("lib.detect.find_tool")
+import("lib.detect.find_toolname")
-- find the given tool
function _toolchain_check(config, toolkind, toolinfo)
@@ -42,10 +43,10 @@ function _toolchain_check(config, toolkind, toolinfo)
local cross = config.get("cross") or toolinfo.cross or ""
-- get program name from the env if not cross-compilation
- if cross:trim() == "" then
+ if config.get("plat") == os.host() and config.get("arch") ==os.arch() then
local program = os.getenv(toolkind:upper():split('-')[1])
if program and program:trim() ~= "" then
- toolpath = find_tool(name, {program = program})
+ toolpath = find_tool(find_toolname(program), {program = program})
end
end