diff options
| author | ruki <[email protected]> | 2017-06-17 23:40:03 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2017-06-17 23:40:03 +0800 |
| commit | e701b9cbef180ca6b222327abab7b92cdf661fe1 (patch) | |
| tree | 152f5bac1956abe945054345f68db59c43b6e438 | |
| parent | f66d8f33bbfbcde8be896f63ef42048a931f7f13 (diff) | |
add find_toolname
| -rwxr-xr-x | tests/modules/lib/detect/test.lua | 14 | ||||
| -rw-r--r-- | xmake/modules/lib/detect/find_toolname.lua | 102 | ||||
| -rw-r--r-- | xmake/platforms/checker.lua | 5 |
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 |
