diff options
| author | ruki <[email protected]> | 2024-09-02 23:01:05 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-09-02 23:01:05 +0800 |
| commit | f20c40bf589088ee7738740f73af3504fbfb3317 (patch) | |
| tree | 3906ca76ee0b10ca3e548e45c67e2b2167653424 | |
| parent | 0d2bd1503c4cc72f67a4a5a79606169609709c10 (diff) | |
| parent | b7dbf58d81a5731ec404afe57b2af4fa783d6b72 (diff) | |
Merge pull request #5553 from xmake-io/cosmocc
improve cosmocc for windows
| -rw-r--r-- | xmake/core/base/os.lua | 32 | ||||
| -rw-r--r-- | xmake/core/project/package.lua | 5 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 2 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/lib/detect/find_program.lua | 3 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_cosmoar.lua | 1 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_cosmocc.lua | 2 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_cosmocxx.lua | 1 | ||||
| -rw-r--r-- | xmake/toolchains/cosmocc/check.lua | 10 | ||||
| -rw-r--r-- | xmake/toolchains/cosmocc/xmake.lua | 8 | ||||
| -rw-r--r-- | xmake/toolchains/emcc/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/toolchains/iverilog/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/toolchains/nim/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/toolchains/verilator/xmake.lua | 4 | ||||
| -rw-r--r-- | xmake/toolchains/zig/xmake.lua | 2 |
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 |
