From 7e3c48b59afbbb53a58951d81413cd438553ad05 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 22:41:11 +0800 Subject: improve has_flags --- xmake/modules/core/tools/gcc/has_flags.lua | 13 +++++++++++-- xmake/modules/detect/tools/find_cmake.lua | 1 + xmake/modules/detect/tools/find_ninja.lua | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/xmake/modules/core/tools/gcc/has_flags.lua b/xmake/modules/core/tools/gcc/has_flags.lua index 731e5da2f..b56596e3e 100644 --- a/xmake/modules/core/tools/gcc/has_flags.lua +++ b/xmake/modules/core/tools/gcc/has_flags.lua @@ -21,6 +21,7 @@ -- imports import("core.cache.detectcache") import("core.language.language") +import("core.base.hashset") -- is linker? function _islinker(flags, opt) @@ -45,6 +46,14 @@ end -- attempt to check it from known flags function _check_from_knownargs(flags, opt, islinker) local flag = flags[1] + local known_flags = _g.known_flags + if known_flags == nil then + known_flags = hashset.from({"-O0", "-O1", "-O2", "-O3", "-g"}) + _g.known_flags = known_flags + end + if known_flags:has(flag) then + return true + end if not islinker then if flag:startswith("-D") or flag:startswith("-U") or @@ -119,10 +128,10 @@ function main(flags, opt) -- attempt to check it from the argument list if not opt.tryrun then - if _check_from_arglist(flags, opt, islinker) then + if _check_from_knownargs(flags, opt, islinker) then return true end - if _check_from_knownargs(flags, opt, islinker) then + if _check_from_arglist(flags, opt, islinker) then return true end end diff --git a/xmake/modules/detect/tools/find_cmake.lua b/xmake/modules/detect/tools/find_cmake.lua index cebb5487d..a9267543d 100644 --- a/xmake/modules/detect/tools/find_cmake.lua +++ b/xmake/modules/detect/tools/find_cmake.lua @@ -40,6 +40,7 @@ function main(opt) -- init options opt = opt or {} + opt.norunfile = true if is_host("windows") then opt.paths = "$(reg HKEY_LOCAL_MACHINE\\SOFTWARE\\Kitware\\CMake;InstallDir)\\bin" end diff --git a/xmake/modules/detect/tools/find_ninja.lua b/xmake/modules/detect/tools/find_ninja.lua index 4a03d9e41..06b95f24c 100644 --- a/xmake/modules/detect/tools/find_ninja.lua +++ b/xmake/modules/detect/tools/find_ninja.lua @@ -40,6 +40,7 @@ function main(opt) -- find program opt = opt or {} + opt.norunfile = true local program = find_program(opt.program or "ninja", opt) if not program and is_host("windows") then local msvc = toolchain.load("msvc", {plat = os.host(), arch = os.arch()}) -- cgit v1.3.1 From ec133a69c703b26c8ae4ef61265287db604b9897 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 22:47:12 +0800 Subject: improve to check cl --- xmake/core/base/os.lua | 2 +- xmake/toolchains/icc/check.lua | 6 +++--- xmake/toolchains/icx/check.lua | 4 ++-- xmake/toolchains/ifort/check.lua | 4 ++-- xmake/toolchains/ifx/check.lua | 4 ++-- xmake/toolchains/msvc/check.lua | 16 ++++++---------- 6 files changed, 16 insertions(+), 20 deletions(-) diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua index cecf38dd2..82da8e6d9 100644 --- a/xmake/core/base/os.lua +++ b/xmake/core/base/os.lua @@ -264,7 +264,7 @@ end -- trace process for profile(stuck,trace)? function os._is_tracing_process() - local is_tracing = os._IS_TRACING_PROCESS + local is_tracing = true-- os._IS_TRACING_PROCESS if is_tracing == nil then local profile = os.getenv("XMAKE_PROFILE") if profile then diff --git a/xmake/toolchains/icc/check.lua b/xmake/toolchains/icc/check.lua index 002b9e191..a88e309af 100644 --- a/xmake/toolchains/icc/check.lua +++ b/xmake/toolchains/icc/check.lua @@ -75,12 +75,12 @@ function _check_vsenv(toolchain) if pathenv then paths = path.splitenv(pathenv) end - local tool = find_tool("cl.exe", {version = true, force = true, paths = paths, envs = vcvars}) + local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) if tool then program = tool.program end if program then - return vsver, tool + return vsver end end end @@ -117,7 +117,7 @@ function _check_intel_on_windows(toolchain) local iclvarsall = iccenv.iclvars local iclenv = iclvarsall[toolchain:arch()] if iclenv and iclenv.PATH and iclenv.INCLUDE and iclenv.LIB then - local tool = find_tool("icl.exe", {force = true, envs = iclenv, version = true}) + local tool = find_tool("icl.exe", {force = true, envs = iclenv}) if tool then cprint("checking for Intel C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) toolchain:config_set("varsall", iclvarsall) diff --git a/xmake/toolchains/icx/check.lua b/xmake/toolchains/icx/check.lua index c781f5c8a..29fc56a7c 100644 --- a/xmake/toolchains/icx/check.lua +++ b/xmake/toolchains/icx/check.lua @@ -75,12 +75,12 @@ function _check_vsenv(toolchain) if pathenv then paths = path.splitenv(pathenv) end - local tool = find_tool("cl.exe", {version = true, force = true, paths = paths, envs = vcvars}) + local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) if tool then program = tool.program end if program then - return vsver, tool + return vsver end end end diff --git a/xmake/toolchains/ifort/check.lua b/xmake/toolchains/ifort/check.lua index ac8f31c6e..e9dd5c133 100644 --- a/xmake/toolchains/ifort/check.lua +++ b/xmake/toolchains/ifort/check.lua @@ -75,12 +75,12 @@ function _check_vsenv(toolchain) if pathenv then paths = path.splitenv(pathenv) end - local tool = find_tool("cl.exe", {version = true, force = true, paths = paths, envs = vcvars}) + local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) if tool then program = tool.program end if program then - return vsver, tool + return vsver end end end diff --git a/xmake/toolchains/ifx/check.lua b/xmake/toolchains/ifx/check.lua index 75264e14e..7a10a5865 100644 --- a/xmake/toolchains/ifx/check.lua +++ b/xmake/toolchains/ifx/check.lua @@ -75,12 +75,12 @@ function _check_vsenv(toolchain) if pathenv then paths = path.splitenv(pathenv) end - local tool = find_tool("cl.exe", {version = true, force = true, paths = paths, envs = vcvars}) + local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) if tool then program = tool.program end if program then - return vsver, tool + return vsver, end end end diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua index 01a81ad93..37f38b53c 100644 --- a/xmake/toolchains/msvc/check.lua +++ b/xmake/toolchains/msvc/check.lua @@ -69,12 +69,12 @@ function _check_vsenv(toolchain) -- check compiler local program = nil - local tool = find_tool("cl.exe", {version = true, force = true, envs = vcvars}) + local tool = find_tool("cl.exe", {force = true, envs = vcvars}) if tool then program = tool.program end if program then - return vsver, tool + return vsver end end end @@ -83,16 +83,13 @@ end -- check the visual studio function _check_vstudio(toolchain) - local vs, msvc = _check_vsenv(toolchain) + local vs = _check_vsenv(toolchain) if vs then if toolchain:is_global() then config.set("vs", vs, {force = true, readonly = true}) end toolchain:config_set("vs", vs) cprint("checking for Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs) - if msvc and msvc.version then - cprint("checking for Microsoft C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), msvc.version) - end else cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch()) end @@ -112,16 +109,15 @@ function _check_vc_build_tools(toolchain, sdkdir) local vcvars = vcvarsall[toolchain:arch()] if vcvars and vcvars.PATH and vcvars.INCLUDE and vcvars.LIB then - -- save vcvars toolchain:config_set("vcvars", vcvars) toolchain:config_set("vcarchs", table.orderkeys(vcvarsall)) toolchain:config_set("vs_toolset", vcvars.VCToolsVersion) toolchain:config_set("vs_sdkver", vcvars.WindowsSDKVersion) -- check compiler - local cl = find_tool("cl.exe", {version = true, force = true, envs = vcvars}) - if cl and cl.version then - cprint("checking for Microsoft C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), cl.version) + local cl = find_tool("cl.exe", {force = true, envs = vcvars}) + if cl then + cprint("checking for Microsoft C/C++ Compiler (%s) ... ${color.success}", toolchain:arch()) end return vcvars end -- cgit v1.3.1 From 0ea9fd74dc21820c7ed41e81c833dceac6243a08 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 22:56:46 +0800 Subject: improve known flags --- xmake/modules/core/tools/gcc/has_flags.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/modules/core/tools/gcc/has_flags.lua b/xmake/modules/core/tools/gcc/has_flags.lua index b56596e3e..4d001ef6e 100644 --- a/xmake/modules/core/tools/gcc/has_flags.lua +++ b/xmake/modules/core/tools/gcc/has_flags.lua @@ -48,7 +48,7 @@ function _check_from_knownargs(flags, opt, islinker) local flag = flags[1] local known_flags = _g.known_flags if known_flags == nil then - known_flags = hashset.from({"-O0", "-O1", "-O2", "-O3", "-g"}) + known_flags = hashset.from({"-O", "-O0", "-O1", "-O2", "-O3", "-Os", "-g"}) _g.known_flags = known_flags end if known_flags:has(flag) then -- cgit v1.3.1 From f737997eddc40fa5fea7864e7c7bd28e618ba749 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 22:56:57 +0800 Subject: revert os --- xmake/core/base/os.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua index 82da8e6d9..cecf38dd2 100644 --- a/xmake/core/base/os.lua +++ b/xmake/core/base/os.lua @@ -264,7 +264,7 @@ end -- trace process for profile(stuck,trace)? function os._is_tracing_process() - local is_tracing = true-- os._IS_TRACING_PROCESS + local is_tracing = os._IS_TRACING_PROCESS if is_tracing == nil then local profile = os.getenv("XMAKE_PROFILE") if profile then -- cgit v1.3.1 From dd46b5b5089cfa1edda87347628c5e40e34b0efb Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 23:25:45 +0800 Subject: improve cl has_flags --- xmake/modules/core/tools/cl/has_flags.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xmake/modules/core/tools/cl/has_flags.lua b/xmake/modules/core/tools/cl/has_flags.lua index 487338a0b..fe0429cda 100644 --- a/xmake/modules/core/tools/cl/has_flags.lua +++ b/xmake/modules/core/tools/cl/has_flags.lua @@ -25,6 +25,14 @@ import("core.cache.global_detectcache") -- attempt to check it from known flags function _check_from_knownargs(flags, opt) local flag = flags[1]:gsub("/", "-") + local known_flags = _g.known_flags + if known_flags == nil then + known_flags = hashset.from({"-Ox", "-O1", "-O2", "-Od", "-MT", "-MD", "-MTd", "-MDd", "-EHsc"}) + _g.known_flags = known_flags + end + if known_flags:has(flag) then + return true + end if flag:startswith("-D") or flag:startswith("-U") or flag:startswith("-I") then @@ -105,10 +113,10 @@ function main(flags, opt) -- attempt to check it from the argument list opt = opt or {} if not opt.tryrun then - if _check_from_arglist(flags, opt) then + if _check_from_knownargs(flags, opt) then return true end - if _check_from_knownargs(flags, opt) then + if _check_from_arglist(flags, opt) then return true end end -- cgit v1.3.1 From 0d6ab60fa9c7e77ae4819417d4f8145661c03d09 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 23:26:15 +0800 Subject: improve has_flags --- xmake/modules/lib/detect/has_flags.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xmake/modules/lib/detect/has_flags.lua b/xmake/modules/lib/detect/has_flags.lua index b122bcebb..36409ef84 100644 --- a/xmake/modules/lib/detect/has_flags.lua +++ b/xmake/modules/lib/detect/has_flags.lua @@ -53,8 +53,10 @@ function main(name, flags, opt) opt.flagskey = opt.flagskey or table.concat(flags, " ") opt.sysflags = table.wrap(opt.sysflags) + -- @note avoid running additional `program --version` processes + --opt.version = true + -- find tool program and version first - opt.version = true local tool = find_tool(name, opt) if not tool then return false @@ -63,7 +65,7 @@ function main(name, flags, opt) -- init tool opt.toolname = tool.name opt.program = tool.program - opt.programver = tool.version + --opt.programver = tool.version -- get tool platform local plat = opt.plat or config.get("plat") or os.host() -- cgit v1.3.1 From 47f7c581cc8daacdd109aeed3c007d908bc9ea42 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Sep 2025 23:58:08 +0800 Subject: fix cl.has_flags --- xmake/modules/core/tools/cl/has_flags.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/xmake/modules/core/tools/cl/has_flags.lua b/xmake/modules/core/tools/cl/has_flags.lua index fe0429cda..48884b340 100644 --- a/xmake/modules/core/tools/cl/has_flags.lua +++ b/xmake/modules/core/tools/cl/has_flags.lua @@ -21,6 +21,7 @@ -- imports import("core.language.language") import("core.cache.global_detectcache") +import("core.base.hashset") -- attempt to check it from known flags function _check_from_knownargs(flags, opt) -- cgit v1.3.1 From 90e422afa7a4f209ccf8e45e8ec4c54a70456d90 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 19 Sep 2025 00:43:10 +0800 Subject: improve find_tool --- xmake/modules/lib/detect/find_tool.lua | 11 ++++++++--- xmake/toolchains/rust/xmake.lua | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/xmake/modules/lib/detect/find_tool.lua b/xmake/modules/lib/detect/find_tool.lua index ddf96753e..dc30b314a 100644 --- a/xmake/modules/lib/detect/find_tool.lua +++ b/xmake/modules/lib/detect/find_tool.lua @@ -33,16 +33,21 @@ function _find_from_modules(name, opt) if program then return {name = toolname or name, program = program, version = version} end + return false end + return nil end -- find tool function _find_tool(name, opt) local toolname = find_toolname(name or opt.program) if toolname then - local tool = _find_from_modules(toolname, opt) - if tool then - return tool + local result = _find_from_modules(toolname, opt) + if result then + return result + elseif result == false then + -- find_xxx.lua exists, but program not found + return end end diff --git a/xmake/toolchains/rust/xmake.lua b/xmake/toolchains/rust/xmake.lua index 76bc64923..3baa998bb 100644 --- a/xmake/toolchains/rust/xmake.lua +++ b/xmake/toolchains/rust/xmake.lua @@ -34,7 +34,7 @@ toolchain("rust") if toolchain:config("appledev") == "simulator" then opt.apple_sim = true end - + local target = target_triple(toolchain:plat(), toolchain:arch(), opt) if target then toolchain:add("rcflags", "--target=" .. target) -- cgit v1.3.1 From e8a0b0b9d8ad08e0ab3efe5962c10017d84aaf9f Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 19 Sep 2025 00:48:37 +0800 Subject: improve test --- tests/benchmarks/build_targets/test.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/benchmarks/build_targets/test.lua b/tests/benchmarks/build_targets/test.lua index ec9f1bcf1..0f5124bfa 100644 --- a/tests/benchmarks/build_targets/test.lua +++ b/tests/benchmarks/build_targets/test.lua @@ -27,7 +27,7 @@ function test_build(t) os.runv(cmake.program, {"--build", ".", "-j" .. jobs}, {curdir = "build"}) cmake_default_dt = os.mclock() - cmake_default_dt print("build targets/30: cmake/default: %d ms", cmake_default_dt) - t:require((cmake_default_dt > xmake_dt) or (cmake_default_dt + 2000 > xmake_dt)) + t:require((cmake_default_dt > xmake_dt) or (cmake_default_dt + 3000 > xmake_dt)) local ninja = find_tool("ninja") if ninja then @@ -49,7 +49,7 @@ function test_build(t) os.runv(cmake.program, {"--build", ".", "-j" .. jobs}, {curdir = "build", envs = envs}) cmake_ninja_dt = os.mclock() - cmake_ninja_dt print("build targets/30: cmake/ninja: %d ms", cmake_ninja_dt) - t:require((cmake_ninja_dt > xmake_dt) or (cmake_ninja_dt + 2000 > xmake_dt)) + t:require((cmake_ninja_dt > xmake_dt) or (cmake_ninja_dt + 3000 > xmake_dt)) end local make = find_tool("make") @@ -61,7 +61,7 @@ function test_build(t) os.runv(cmake.program, {"--build", ".", "-j" .. jobs}, {curdir = "build"}) cmake_makefile_dt = os.mclock() - cmake_makefile_dt print("build targets/30: cmake/makefile: %d ms", cmake_makefile_dt) - t:require((cmake_makefile_dt > xmake_dt) or (cmake_makefile_dt + 2000 > xmake_dt)) + t:require((cmake_makefile_dt > xmake_dt) or (cmake_makefile_dt + 3000 > xmake_dt)) end end @@ -81,7 +81,7 @@ function test_build(t) meson_build_dt = os.mclock() - meson_build_dt local meson_dt = meson_setup_dt + meson_build_dt print("build targets/30: meson: %d ms", meson_dt) - t:require((meson_dt > xmake_dt) or (meson_dt + 2000 > xmake_dt)) + t:require((meson_dt > xmake_dt) or (meson_dt + 3000 > xmake_dt)) end end -- cgit v1.3.1