diff options
| author | ruki <[email protected]> | 2020-12-17 10:59:28 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-12-17 10:59:28 +0800 |
| commit | e95f99d7d99daf3c065dd04d457b2a8a81545380 (patch) | |
| tree | 72816b1c749dd12e31da06b9b9d97ffc8d057866 /xmake/modules/private | |
| parent | 37521d4aa857d57773b0f6cb9311856d3787c6f5 (diff) | |
| parent | 98a044d2947d070d035fe76c651fdbf9f0c3b135 (diff) | |
Merge pull request #1141 from xmake-io/toolchain
Improve toolchain
Diffstat (limited to 'xmake/modules/private')
| -rw-r--r-- | xmake/modules/private/detect/find_platform.lua | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/xmake/modules/private/detect/find_platform.lua b/xmake/modules/private/detect/find_platform.lua new file mode 100644 index 000000000..d366260b6 --- /dev/null +++ b/xmake/modules/private/detect/find_platform.lua @@ -0,0 +1,146 @@ +--!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 find_platform.lua +-- + +-- imports +import("core.project.config") +import("detect.sdks.find_cross_toolchain") + +-- find platform +function _find_plat(plat) + plat = plat or config.get("plat") + if not plat then + plat = os.subhost() + if plat == "msys" then + local msystem = os.getenv("MSYSTEM") + if msystem and msystem:lower():find("mingw", 1, true) then + plat = "mingw" + end + end + end + return plat +end + +-- find architecture for cross platform +function _find_arch_from_cross() + local cross = config.get("cross") + if not cross then + local cross_toolchain = find_cross_toolchain(config.get("sdk"), {bindir = config.get("bin")}) + if cross_toolchain then + cross = cross_toolchain.cross + end + end + local arch = "none" + if cross then + if cross:find("aarch64", 1, true) then + arch = "arm64" + elseif cross:find("arm", 1, true) then + arch = "arm" + elseif cross:find("mips64", 1, true) then + arch = "mips64" + elseif cross:find("mips", 1, true) then + arch = "mips" + elseif cross:find("riscv64", 1, true) then + arch = "riscv64" + elseif cross:find("riscv", 1, true) then + arch = "riscv" + elseif cross:find("s390x", 1, true) then + arch = "s390x" + elseif cross:find("powerpc64", 1, true) then + arch = "ppc64" + elseif cross:find("powerpc", 1, true) then + arch = "ppc" + elseif cross:find("sh4", 1, true) then + arch = "sh4" + elseif cross:find("x86_64", 1, true) then + arch = "x86_64" + elseif cross:find("i386", 1, true) or cross:find("i686", 1, true) then + arch = "i386" + end + end + return arch +end + +-- find architecture +function _find_arch(plat, arch) + arch = arch or config.get("arch") + if not arch then + if plat == "android" then + arch = "armeabi-v7a" + elseif plat == "iphoneos" then + arch = "arm64" + elseif plat == "watchos" then + arch = "armv7k" + elseif plat == "wasm" then + arch = "wasm32" + elseif plat == "mingw" then + local mingw_chost = nil + if is_subhost("msys") then + mingw_chost = os.getenv("MINGW_CHOST") + end + if mingw_chost == "i686-w64-mingw32" then + arch = "i386" + else + arch = "x86_64" + end + elseif plat == "cross" then + arch = _find_arch_from_cross() + else + arch = os.subarch() + end + end + return arch +end + +-- find default platform and architecture +-- +-- @param opt the argument options, e.g. {plat = "", arch = "", global = true} +-- +-- @return plat, arch +-- +-- @code +-- +-- find the default platform: +-- local result = find_platform() +-- +-- find the default architecture from the given platform: +-- local result = find_platform({plat = "iphoneos"}) +-- +-- @endcode +-- +function main(opt) + + -- find plat and arch + opt = opt or {} + local plat = _find_plat(opt.plat) + local arch = _find_arch(plat, opt.arch) + + -- save the local configuration if be global + if opt.global then + if not opt.plat and not config.get("plat") then + config.set("plat", plat) + cprint("checking for platform ... ${color.success}%s", plat) + end + if not opt.arch and not config.get("arch") then + config.set("arch", arch) + cprint("checking for architecture ... ${color.success}%s", arch) + end + end + return plat, arch +end |
