summaryrefslogtreecommitdiff
path: root/xmake/modules/private/detect/find_platform.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2020-12-16 23:43:28 +0800
committerruki <[email protected]>2020-12-16 23:43:28 +0800
commit207b4e753a4bed1f75836b78180411442103a9cd (patch)
tree5e4abe6e4f3c5b99ef6f1ebcbbd1a3d7d88795f5 /xmake/modules/private/detect/find_platform.lua
parentf3b3357ddad20367ff94e8b984a525a703d5947f (diff)
add find_platform
Diffstat (limited to 'xmake/modules/private/detect/find_platform.lua')
-rw-r--r--xmake/modules/private/detect/find_platform.lua146
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..a18849b82
--- /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", plat)
+ end
+ end
+ return {plat = plat, arch = arch}
+end