summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaikari <[email protected]>2025-10-04 23:09:26 +0300
committerGitHub <[email protected]>2025-10-04 23:09:26 +0300
commit4b643c4fa3792c834fe08d2e99104ea655b61584 (patch)
tree6f3b868645d3555cdf4bb50d901533d6b57b31b1
parentcb087738d9cc3caf04f619b2524d4a848daee387 (diff)
parent82f581a047820d7136b7bf6b6a969b4d3a96e497 (diff)
Merge branch 'xmake-io:dev' into fix-sizeof-wasm
-rw-r--r--xmake/core/base/hash.lua11
-rw-r--r--xmake/core/base/os.lua29
-rw-r--r--xmake/modules/detect/sdks/find_mingw.lua23
-rw-r--r--xmake/toolchains/mingw/check.lua7
4 files changed, 58 insertions, 12 deletions
diff --git a/xmake/core/base/hash.lua b/xmake/core/base/hash.lua
index e846ba302..9d7ca40ed 100644
--- a/xmake/core/base/hash.lua
+++ b/xmake/core/base/hash.lua
@@ -120,9 +120,14 @@ end
-- generate hash32 from string, e.g. "91e8ecf1"
function hash.strhash32(str)
- local data = libc.ptraddr(libc.dataptr(str))
- local size = #str
- return hash._xxhash(32, data, size)
+ if hash._rand32 then
+ local data = libc.ptraddr(libc.dataptr(str))
+ local size = #str
+ return hash._xxhash(32, data, size)
+ else
+ -- we need to be compatible with the old binary core (<= v3.0.3)
+ return hash.uuid4(str):split("-", {plain = true})[1]:lower()
+ end
end
-- generate hash64 from string, e.g. "91e8ecf191e8ecf1"
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index 988d9e4bf..e6422c549 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -42,6 +42,7 @@ os._tmpdir = os._tmpdir or os.tmpdir
os._curdir = os._curdir or os.curdir
os._fscase = os._fscase or os.fscase
os._setenv = os._setenv or os.setenv
+os._getenvs = os._getenvs or os.getenvs
os._cpuinfo = os._cpuinfo or os.cpuinfo
os._meminfo = os._meminfo or os.meminfo
os._readlink = os._readlink or os.readlink
@@ -1300,6 +1301,34 @@ function os.term()
return require("base/tty").term()
end
+-- get all current environments variables
+function os.getenvs()
+ local envs = os._getenvs()
+ if envs then
+ -- we need to be compatible with the old binary core, if it's array (<= v3.0.3)
+ if envs[1] ~= nil then
+ local result = {}
+ for _, line in ipairs(envs) do
+ local p = line:find('=', 1, true)
+ if p then
+ local key = line:sub(1, p - 1):trim()
+ -- only translate Path to PATH on windows
+ -- @see https://github.com/xmake-io/xmake/issues/3752
+ if os.host() == "windows" and key:lower() == "path" then
+ key = key:upper()
+ end
+ local values = line:sub(p + 1):trim()
+ if #key > 0 then
+ result[key] = values
+ end
+ end
+ end
+ envs = result
+ end
+ end
+ return envs
+end
+
-- set all current environment variables
-- e.g. envs["PATH"] = "/xxx:/yyy/foo"
function os.setenvs(envs)
diff --git a/xmake/modules/detect/sdks/find_mingw.lua b/xmake/modules/detect/sdks/find_mingw.lua
index e1b3571ec..37b6625c6 100644
--- a/xmake/modules/detect/sdks/find_mingw.lua
+++ b/xmake/modules/detect/sdks/find_mingw.lua
@@ -27,9 +27,7 @@ import("core.cache.detectcache")
import("detect.sdks.find_cross_toolchain")
-- find mingw directory
-function _find_mingwdir(sdkdir)
-
- -- get mingw directory
+function _find_mingwdir(sdkdir, msystem)
if not sdkdir then
if is_host("macosx", "linux") and os.isdir("/opt/llvm-mingw") then
sdkdir = "/opt/llvm-mingw"
@@ -65,6 +63,10 @@ function _find_mingwdir(sdkdir)
end
end
+ if is_subhost("msys") and sdkdir and msystem and not sdkdir:find(msystem, 1, true) then
+ sdkdir = path.unix(path.join(path.directory(sdkdir), msystem))
+ end
+
-- attempt to find mingw directory from the qt sdk
local qt = config.get("qt")
if not sdkdir and qt then
@@ -78,10 +80,10 @@ function _find_mingwdir(sdkdir)
end
-- find the mingw toolchain
-function _find_mingw(sdkdir, bindir, cross)
+function _find_mingw(sdkdir, bindir, cross, msystem)
-- find mingw root directory
- sdkdir = _find_mingwdir(sdkdir)
+ sdkdir = _find_mingwdir(sdkdir, msystem)
if not sdkdir then
return
end
@@ -105,7 +107,7 @@ function _find_mingw(sdkdir, bindir, cross)
toolchain = find_cross_toolchain(sdkdir or bindir, {bindir = bindir})
end
if toolchain then
- return {sdkdir = toolchain.sdkdir, bindir = toolchain.bindir, cross = toolchain.cross}
+ return {sdkdir = toolchain.sdkdir, bindir = toolchain.bindir, cross = toolchain.cross, msystem = msystem}
end
end
@@ -132,12 +134,17 @@ function main(sdkdir, opt)
-- attempt to load cache first
local key = "detect.sdks.find_mingw"
local cacheinfo = detectcache:get(key) or {}
- if not opt.force and cacheinfo.mingw and cacheinfo.mingw.sdkdir and os.isdir(cacheinfo.mingw.sdkdir) then
+ if not opt.force and cacheinfo.mingw and cacheinfo.mingw.sdkdir and os.isdir(cacheinfo.mingw.sdkdir) and cacheinfo.mingw.msystem == opt.msystem then
return cacheinfo.mingw
end
-- find mingw
- local mingw = _find_mingw(sdkdir or config.get("mingw") or global.get("mingw") or config.get("sdk"), opt.bindir or config.get("bin"), opt.cross or config.get("cross"))
+ local mingw = _find_mingw(
+ sdkdir or config.get("mingw") or global.get("mingw") or config.get("sdk"),
+ opt.bindir or config.get("bin"),
+ opt.cross or config.get("cross"),
+ opt.msystem
+ )
if mingw and mingw.sdkdir then
-- save to config
diff --git a/xmake/toolchains/mingw/check.lua b/xmake/toolchains/mingw/check.lua
index fbb647661..030dc6dd4 100644
--- a/xmake/toolchains/mingw/check.lua
+++ b/xmake/toolchains/mingw/check.lua
@@ -35,7 +35,12 @@ function main(toolchain)
end
end
if not mingw then
- mingw = find_mingw(toolchain:config("mingw") or config.get("mingw"), {verbose = true, bindir = toolchain:bindir(), cross = toolchain:cross()})
+ mingw = find_mingw(toolchain:config("mingw") or config.get("mingw"), {
+ verbose = true,
+ bindir = toolchain:bindir(),
+ cross = toolchain:cross(),
+ msystem = toolchain:config("msystem"),
+ })
end
if mingw then
toolchain:config_set("mingw", mingw.sdkdir)