diff options
| author | ruki <[email protected]> | 2025-12-20 00:39:28 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-12-20 00:39:28 +0800 |
| commit | 8d574375d0f0a496046987541091dca48fad3f5a (patch) | |
| tree | cb6529e000f25736d79916083ff1829c684ec1e1 | |
| parent | 3608bf0165ec41d87c93137ae6aaf2eb3c82f86b (diff) | |
improve clang toolchain
| -rw-r--r-- | xmake/toolchains/clang/load.lua | 102 | ||||
| -rw-r--r-- | xmake/toolchains/clang/toolchain_clang.lua | 30 |
2 files changed, 75 insertions, 57 deletions
diff --git a/xmake/toolchains/clang/load.lua b/xmake/toolchains/clang/load.lua index 6e6e5ba6d..3a15f3268 100644 --- a/xmake/toolchains/clang/load.lua +++ b/xmake/toolchains/clang/load.lua @@ -52,52 +52,98 @@ function _add_vsenv(toolchain, name, curenvs) end end -function main(toolchain, suffix) +function _load_windows(toolchain, suffix) + + -- add vs environments + local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"} + local curenvs = os.getenvs() + for _, name in ipairs(expect_vars) do + _add_vsenv(toolchain, name, curenvs) + end + for _, name in ipairs(find_vstudio.get_vcvars()) do + if not table.contains(expect_vars, name:upper()) then + _add_vsenv(toolchain, name, curenvs) + end + end + + if is_host("linux") or project.policy("build.optimization.lto") then + toolchain:add("ldflags", "-fuse-ld=lld-link" .. suffix) + toolchain:add("shflags", "-fuse-ld=lld-link" .. suffix) + end +end + +function _get_target(toolchain) + -- TODO + -- Perhaps in the future we will improve it and allow setting targets on more platforms. + if not toolchain:is_plat("windows", "mingw") then + return + end local target if toolchain:is_arch("x86_64", "x64") then target = "x86_64" - march = "-m64" elseif toolchain:is_arch("i386", "x86", "i686") then target = "i686" - march = "-m32" - elseif toolchain:is_arch("arm64", "aarch64") then + elseif toolchain:is_arch("arm64", "aarch64", "arm64-v8a") then target = "aarch64" - elseif toolchain:is_arch("arm") then + elseif toolchain:is_arch("arm.*") then target = "armv7" end - if toolchain:is_plat("windows") then - target = target .. "-windows-msvc" - - -- add vs environments - local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"} - local curenvs = os.getenvs() - for _, name in ipairs(expect_vars) do - _add_vsenv(toolchain, name, curenvs) - end - for _, name in ipairs(find_vstudio.get_vcvars()) do - if not table.contains(expect_vars, name:upper()) then - _add_vsenv(toolchain, name, curenvs) - end - end - - if is_host("linux") or project.policy("build.optimization.lto") then - toolchain:add("ldflags", "-fuse-ld=lld-link" .. suffix) - toolchain:add("shflags", "-fuse-ld=lld-link" .. suffix) + if target then + if toolchain:is_plat("windows") then + target = target .. "-windows-msvc" + elseif toolchain:is_plat("mingw") then + target = target .. "-w64-windows-gnu" + elseif toolchain:is_plat("linux") then + target = target .. "-linux-gnu" + else + target = nil end - elseif toolchain:is_plat("mingw") then - target = target .. "-w64-windows-gnu" - elseif toolchain:is_plat("linux") then - target = target .. "-linux-gnu" end + return target +end - toolchain_utils.add_llvm_runenvs(toolchain) +function main(toolchain, suffix) + + -- init tools for lto + if project.policy("build.optimization.lto") then + toolchain:set("toolset", "ar", "llvm-ar" .. suffix) + toolchain:set("toolset", "ranlib", "llvm-ranlib" .. suffix) + end + -- init target + local target = _get_target(toolchain) if target then toolchain:add("cxflags", "--target=" .. target) + toolchain:add("mxflags", "--target=" .. target) toolchain:add("asflags", "--target=" .. target) toolchain:add("ldflags", "--target=" .. target) toolchain:add("shflags", "--target=" .. target) + else + local march + if toolchain:is_arch("x86_64", "x64") then + march = "-m64" + elseif toolchain:is_arch("i386", "x86") then + march = "-m32" + end + if march then + toolchain:add("cxflags", march) + toolchain:add("mxflags", march) + toolchain:add("asflags", march) + toolchain:add("ldflags", march) + toolchain:add("shflags", march) + end + end + + -- init windows + if toolchain:is_plat("windows") then + _load_windows(toolchain, suffix) end + + -- set llvm runtimes + toolchain_utils.set_llvm_runtimes(toolchain) + + -- add llvm runenvs + toolchain_utils.add_llvm_runenvs(toolchain) end diff --git a/xmake/toolchains/clang/toolchain_clang.lua b/xmake/toolchains/clang/toolchain_clang.lua index b9713c6ae..d18bdf4b6 100644 --- a/xmake/toolchains/clang/toolchain_clang.lua +++ b/xmake/toolchains/clang/toolchain_clang.lua @@ -58,34 +58,6 @@ function toolchain_clang(version) end) on_load(function (toolchain) - import("core.project.project") - import("private.utils.toolchain", {alias = "toolchain_utils"}) - - if project.policy("build.optimization.lto") then - toolchain:set("toolset", "ar", "llvm-ar" .. suffix) - toolchain:set("toolset", "ranlib", "llvm-ranlib" .. suffix) - end - - local march - if toolchain:is_arch("x86_64", "x64") then - march = "-m64" - elseif toolchain:is_arch("i386", "x86") then - march = "-m32" - end - if march then - toolchain:add("cxflags", march) - toolchain:add("mxflags", march) - toolchain:add("asflags", march) - toolchain:add("ldflags", march) - toolchain:add("shflags", march) - end - - toolchain_utils.set_llvm_runtimes(toolchain) - - -- load windows configurations - if toolchain:is_plat("windows", "mingw") then - local rootdir = path.join(path.directory(os.scriptdir()), "clang") - import("load", {rootdir = rootdir})(toolchain, suffix) - end + import("load")(toolchain, suffix) end) end |
