summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-09-02 23:01:05 +0800
committerGitHub <[email protected]>2024-09-02 23:01:05 +0800
commitf20c40bf589088ee7738740f73af3504fbfb3317 (patch)
tree3906ca76ee0b10ca3e548e45c67e2b2167653424
parent0d2bd1503c4cc72f67a4a5a79606169609709c10 (diff)
parentb7dbf58d81a5731ec404afe57b2af4fa783d6b72 (diff)
Merge pull request #5553 from xmake-io/cosmocc
improve cosmocc for windows
-rw-r--r--xmake/core/base/os.lua32
-rw-r--r--xmake/core/project/package.lua5
-rw-r--r--xmake/core/project/target.lua2
-rw-r--r--xmake/core/sandbox/modules/import/lib/detect/find_program.lua3
-rw-r--r--xmake/modules/detect/tools/find_cosmoar.lua1
-rw-r--r--xmake/modules/detect/tools/find_cosmocc.lua2
-rw-r--r--xmake/modules/detect/tools/find_cosmocxx.lua1
-rw-r--r--xmake/toolchains/cosmocc/check.lua10
-rw-r--r--xmake/toolchains/cosmocc/xmake.lua8
-rw-r--r--xmake/toolchains/emcc/xmake.lua2
-rw-r--r--xmake/toolchains/iverilog/xmake.lua2
-rw-r--r--xmake/toolchains/nim/xmake.lua2
-rw-r--r--xmake/toolchains/verilator/xmake.lua4
-rw-r--r--xmake/toolchains/zig/xmake.lua2
14 files changed, 66 insertions, 10 deletions
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index 9160aa534..2dba50509 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -288,6 +288,36 @@ function os._run_exit_cbs(ok, errors)
end
end
+-- get shell path, e.g. sh, bash
+function os._get_shell_path(opt)
+ opt = opt or {}
+ local setenvs = opt.setenvs or opt.envs or {}
+ local addenvs = opt.addenvs or {}
+ local paths = {}
+ local p = setenvs.PATH
+ if type(p) == "string" then
+ p = path.splitenv(p)
+ end
+ if p then
+ table.join2(paths, p)
+ end
+ p = addenvs.PATH
+ if type(p) == "string" then
+ p = path.splitenv(p)
+ end
+ if p then
+ table.join2(paths, p)
+ end
+ for _, p in ipairs(paths) do
+ for _, name in ipairs({"sh", "bash"}) do
+ local filepath = path.join(p, name)
+ if os.isexec(filepath) then
+ return filepath
+ end
+ end
+ end
+end
+
-- match files or directories
--
-- @param pattern the search pattern
@@ -808,7 +838,7 @@ function os.execv(program, argv, opt)
-- because `/bin/sh` is not real file path, maybe we need to convert it.
local host = os.host()
if host == "windows" then
- filename = "sh"
+ filename = os._get_shell_path(opt) or "sh"
argv = table.join(shellfile, argv)
else
line = line:sub(3)
diff --git a/xmake/core/project/package.lua b/xmake/core/project/package.lua
index 63267a04e..c253ee0a2 100644
--- a/xmake/core/project/package.lua
+++ b/xmake/core/project/package.lua
@@ -271,6 +271,11 @@ function _instance:enable(enabled)
self:set("__enabled", enabled)
end
+-- get environments
+function _instance:envs()
+ return self:get("envs")
+end
+
-- get the given rule
function _instance:rule(name)
return self:rules()[name]
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index c84e6fbcb..ace54441c 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -1335,7 +1335,7 @@ function _instance:pkgenvs()
end
end
for _, pkg in pkgs:orderkeys() do
- local envs = pkg:get("envs")
+ local envs = pkg:envs()
if envs then
for name, values in table.orderpairs(envs) do
if type(values) == "table" then
diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_program.lua b/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
index 3923916d9..3b20eb938 100644
--- a/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
+++ b/xmake/core/sandbox/modules/import/lib/detect/find_program.lua
@@ -74,9 +74,10 @@ end
-- check program
function sandbox_lib_detect_find_program._check(program, opt)
+ opt = opt or {}
local findname = program
if os.subhost() == "windows" then
- if not program:endswith(".exe") and not program:endswith(".cmd") and not program:endswith(".bat") then
+ if not opt.shell and not program:endswith(".exe") and not program:endswith(".cmd") and not program:endswith(".bat") then
findname = program .. ".exe"
end
elseif os.subhost() == "msys" and os.isfile(program) and os.filesize(program) < 256 then
diff --git a/xmake/modules/detect/tools/find_cosmoar.lua b/xmake/modules/detect/tools/find_cosmoar.lua
index 01c9232ce..b293c9b57 100644
--- a/xmake/modules/detect/tools/find_cosmoar.lua
+++ b/xmake/modules/detect/tools/find_cosmoar.lua
@@ -36,6 +36,7 @@ import("lib.detect.find_program")
function main(opt)
opt = opt or {}
opt.shell = true
+ opt.envs = opt.envs or {PATH = os.getenv("PATH")}
local program = find_program(opt.program or "cosmoar", opt)
if program and is_host("windows") then
program = program:gsub("\\", "/")
diff --git a/xmake/modules/detect/tools/find_cosmocc.lua b/xmake/modules/detect/tools/find_cosmocc.lua
index 910643626..14d14d1be 100644
--- a/xmake/modules/detect/tools/find_cosmocc.lua
+++ b/xmake/modules/detect/tools/find_cosmocc.lua
@@ -37,7 +37,7 @@ import("lib.detect.find_programver")
function main(opt)
opt = opt or {}
opt.shell = true
- opt.envs = {PATH = os.getenv("PATH")}
+ opt.envs = opt.envs or {PATH = os.getenv("PATH")}
local program = find_program(opt.program or "cosmocc", opt)
if program and is_host("windows") then
program = program:gsub("\\", "/")
diff --git a/xmake/modules/detect/tools/find_cosmocxx.lua b/xmake/modules/detect/tools/find_cosmocxx.lua
index 06ce69aac..d09bac510 100644
--- a/xmake/modules/detect/tools/find_cosmocxx.lua
+++ b/xmake/modules/detect/tools/find_cosmocxx.lua
@@ -37,6 +37,7 @@ import("lib.detect.find_programver")
function main(opt)
opt = opt or {}
opt.shell = true
+ opt.envs = opt.envs or {PATH = os.getenv("PATH")}
local program = find_program(opt.program or "cosmoc++", opt)
if program and is_host("windows") then
program = program:gsub("\\", "/")
diff --git a/xmake/toolchains/cosmocc/check.lua b/xmake/toolchains/cosmocc/check.lua
index d193cceb2..5876db68f 100644
--- a/xmake/toolchains/cosmocc/check.lua
+++ b/xmake/toolchains/cosmocc/check.lua
@@ -32,6 +32,7 @@ function main(toolchain)
local bindir = toolchain:bindir()
-- find cross toolchain from external envirnoment
+ local envs
local cross_toolchain = find_cross_toolchain(sdkdir, {bindir = bindir})
if not cross_toolchain then
-- find it from packages
@@ -40,6 +41,11 @@ function main(toolchain)
if installdir and os.isdir(installdir) then
cross_toolchain = find_cross_toolchain(installdir)
if cross_toolchain then
+ -- we need to bind msys2 shell envirnoments for calling cosmocc,
+ -- @see https://github.com/xmake-io/xmake/issues/5552
+ if is_subhost("windows") then
+ envs = package:envs()
+ end
break
end
end
@@ -57,9 +63,13 @@ function main(toolchain)
toolchain:config_set("cross", cross_toolchain.cross)
toolchain:config_set("bindir", cross_toolchain.bindir)
toolchain:config_set("sdkdir", cross_toolchain.sdkdir)
+ if envs then
+ toolchain:config_set("envs", envs)
+ end
toolchain:configs_save()
else
raise("cosmocc toolchain not found!")
end
return cross_toolchain
end
+
diff --git a/xmake/toolchains/cosmocc/xmake.lua b/xmake/toolchains/cosmocc/xmake.lua
index 0b19ad16c..17d217a6c 100644
--- a/xmake/toolchains/cosmocc/xmake.lua
+++ b/xmake/toolchains/cosmocc/xmake.lua
@@ -45,4 +45,12 @@ toolchain("cosmocc")
toolchain:set("toolset", "ranlib", "aarch64-linux-cosmo-ranlib")
toolchain:set("toolset", "strip", "aarch64-linux-cosmo-strip")
end
+ -- @see https://github.com/xmake-io/xmake/issues/5552
+ local envs = toolchain:config("envs")
+ if envs then
+ for k, v in pairs(envs) do
+ toolchain:add("runenvs", k, v)
+ end
+ end
end)
+
diff --git a/xmake/toolchains/emcc/xmake.lua b/xmake/toolchains/emcc/xmake.lua
index b95e67145..2282afe93 100644
--- a/xmake/toolchains/emcc/xmake.lua
+++ b/xmake/toolchains/emcc/xmake.lua
@@ -58,7 +58,7 @@ toolchain("emcc")
toolchain:add("ldflags", "")
toolchain:add("shflags", "")
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
for _, name in ipairs({"EMSDK", "EMSDK_NODE", "EMSDK_PYTHON", "JAVA_HOME"}) do
local values = envs[name]
diff --git a/xmake/toolchains/iverilog/xmake.lua b/xmake/toolchains/iverilog/xmake.lua
index 30f83fabc..659922441 100644
--- a/xmake/toolchains/iverilog/xmake.lua
+++ b/xmake/toolchains/iverilog/xmake.lua
@@ -28,7 +28,7 @@ toolchain("iverilog")
import("lib.detect.find_tool")
local paths = {}
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
table.join2(paths, envs.PATH)
end
diff --git a/xmake/toolchains/nim/xmake.lua b/xmake/toolchains/nim/xmake.lua
index 9afd491da..826f3196e 100644
--- a/xmake/toolchains/nim/xmake.lua
+++ b/xmake/toolchains/nim/xmake.lua
@@ -26,7 +26,7 @@ toolchain("nim")
import("lib.detect.find_tool")
local paths = {}
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
table.join2(paths, envs.PATH)
end
diff --git a/xmake/toolchains/verilator/xmake.lua b/xmake/toolchains/verilator/xmake.lua
index 59edcf6db..5bb38b387 100644
--- a/xmake/toolchains/verilator/xmake.lua
+++ b/xmake/toolchains/verilator/xmake.lua
@@ -26,7 +26,7 @@ toolchain("verilator")
import("lib.detect.find_tool")
local paths = {}
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
table.join2(paths, envs.PATH)
end
@@ -46,7 +46,7 @@ toolchain("verilator")
on_load(function (toolchain)
if is_host("windows") then
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
local verilator_root = envs.VERILATOR_ROOT
if verilator_root then
diff --git a/xmake/toolchains/zig/xmake.lua b/xmake/toolchains/zig/xmake.lua
index 082dcba32..711334762 100644
--- a/xmake/toolchains/zig/xmake.lua
+++ b/xmake/toolchains/zig/xmake.lua
@@ -30,7 +30,7 @@ toolchain("zig")
import("lib.detect.find_tool")
local paths = {}
for _, package in ipairs(toolchain:packages()) do
- local envs = package:get("envs")
+ local envs = package:envs()
if envs then
table.join2(paths, envs.PATH)
end