diff options
| author | ruki <[email protected]> | 2026-03-07 23:10:56 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-07 23:10:56 +0800 |
| commit | 31c6941b7ea41f1d3888db2fc2ee07a6cd948499 (patch) | |
| tree | be379aac619943e3b6ddf0eef76e736c6a7432f1 | |
| parent | 6f71ecb6dda0eff8db9089c475e4e549c0db1dec (diff) | |
| parent | cb4ac4367a20be40109185f942cbf82865351c6d (diff) | |
Merge pull request #7383 from xmake-io/zig
split zig toolchain to zig/zigcc
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | README_zh.md | 1 | ||||
| -rw-r--r-- | tests/projects/c++/console_zig_cxx/xmake.lua | 2 | ||||
| -rw-r--r-- | tests/projects/zig/console_c_call_zig/xmake.lua | 2 | ||||
| -rw-r--r-- | xmake/modules/private/utils/toolchain.lua | 62 | ||||
| -rw-r--r-- | xmake/toolchains/zig/xmake.lua | 107 | ||||
| -rw-r--r-- | xmake/toolchains/zigcc/xmake.lua | 106 |
8 files changed, 177 insertions, 107 deletions
diff --git a/.gitignore b/.gitignore index f67e40d38..a53743fae 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,6 @@ compile_commands.json *.mod.c Module.symvers modules.order + +# ai +.claude @@ -207,6 +207,7 @@ gdc The GNU D Compiler (GDC) gfortran GNU Fortran Programming Language Compiler flang LLVM Fortran Compiler zig Zig Programming Language Compiler +zigcc Use zig cc/c++ as C/C++ Compiler sdcc Small Device C Compiler cuda CUDA Toolkit (nvcc, nvc, nvc++, nvfortran) ndk Android NDK diff --git a/README_zh.md b/README_zh.md index 836008860..c36e2ac3b 100644 --- a/README_zh.md +++ b/README_zh.md @@ -268,6 +268,7 @@ gdc The GNU D Compiler (GDC) gfortran GNU Fortran Programming Language Compiler flang LLVM Fortran Compiler zig Zig Programming Language Compiler +zigcc Use zig cc/c++ as C/C++ Compiler sdcc Small Device C Compiler cuda CUDA Toolkit (nvcc, nvc, nvc++, nvfortran) ndk Android NDK diff --git a/tests/projects/c++/console_zig_cxx/xmake.lua b/tests/projects/c++/console_zig_cxx/xmake.lua index 855aa47f1..d14aa8869 100644 --- a/tests/projects/c++/console_zig_cxx/xmake.lua +++ b/tests/projects/c++/console_zig_cxx/xmake.lua @@ -4,6 +4,6 @@ add_requires("zig") target("test") set_kind("binary") add_files("src/*.cpp") - set_toolchains("@zig") + set_toolchains("zig@zigcc") diff --git a/tests/projects/zig/console_c_call_zig/xmake.lua b/tests/projects/zig/console_c_call_zig/xmake.lua index c110e0236..e75764873 100644 --- a/tests/projects/zig/console_c_call_zig/xmake.lua +++ b/tests/projects/zig/console_c_call_zig/xmake.lua @@ -6,5 +6,5 @@ target("demo") set_kind("binary") add_files("src/*.c") add_files("src/*.zig") - set_toolchains("@zig", {zigcc = false}) + set_toolchains("@zig") diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua index f694c23c9..c2840a591 100644 --- a/xmake/modules/private/utils/toolchain.lua +++ b/xmake/modules/private/utils/toolchain.lua @@ -604,6 +604,68 @@ function get_sanitizer_flags(target, opt) return result end +-- get zig target +function get_zig_target(toolchain) + local zig_version = toolchain:config("zig_version") + + -- get target from cross only for cross-compilation + -- @see https://github.com/xmake-io/xmake/issues/7180 + local target + if not target and toolchain:is_cross() then + target = toolchain:cross() + end + + -- get target from arch + if not target then + local arch + if toolchain:is_arch("arm64", "arm64-v8a") then + arch = "aarch64" + elseif toolchain:is_arch("arm", "armv7") then + arch = "arm" + elseif toolchain:is_arch("i386", "x86") then + if zig_version and semver.compare(zig_version, "0.11") >= 0 then + arch = "x86" + else + arch = "i386" + end + elseif toolchain:is_arch("riscv64") then + arch = "riscv64" + elseif toolchain:is_arch("loong64") then + arch = "loongarch64" + elseif toolchain:is_arch("mips.*") then + arch = toolchain:arch() + elseif toolchain:is_arch("ppc64") then + arch = "powerpc64" + elseif toolchain:is_arch("ppc") then + arch = "powerpc" + elseif toolchain:is_arch("s390x") then + arch = "s390x" + else + arch = "x86_64" + end + + if toolchain:is_plat("cross") then + -- xmake f -p cross --toolchain=zig --cross=mips64el-linux-gnuabi64 + elseif toolchain:is_plat("macosx") then + --@see https://github.com/ziglang/zig/issues/14226 + target = arch .. "-macos-none" + elseif toolchain:is_plat("linux") then + if arch == "arm" then + target = "arm-linux-gnueabi" + elseif arch == "mips64" or arch == "mips64el" then + target = arch .. "-linux-gnuabi64" + else + target = arch .. "-linux-gnu" + end + elseif toolchain:is_plat("windows") then + target = arch .. "-windows-msvc" + elseif toolchain:is_plat("mingw") then + target = arch .. "-windows-gnu" + end + end + return target +end + -- check if the file is a c++ header file extension function is_cxx_headerext(extension) -- prioritize .h* extensions to filter out most cases quickly diff --git a/xmake/toolchains/zig/xmake.lua b/xmake/toolchains/zig/xmake.lua index d1b2165e4..48a91f676 100644 --- a/xmake/toolchains/zig/xmake.lua +++ b/xmake/toolchains/zig/xmake.lua @@ -20,33 +20,12 @@ -- define toolchain toolchain("zig") - set_kind("standalone") set_homepage("https://ziglang.org/") set_description("Zig Programming Language Compiler") on_check(function (toolchain) import("lib.detect.find_tool") - -- @see https://github.com/xmake-io/xmake/issues/5610 - function _setup_zigcc_wrapper(zig) - local script_suffix = is_host("windows") and ".cmd" or "" - for _, tool in ipairs({"cc", "c++", "ar", "ranlib", "lib", "ld.lld", "lld-link", "wasm-ld", "objcopy", "dlltool", "rc"}) do - local wrapper_path = path.join(os.tmpdir(), "zigcc", tool) .. script_suffix - if not os.isfile(wrapper_path) then - if is_host("windows") then - io.writefile(wrapper_path, ("@echo off\n\"%s\" %s %%*"):format(zig, tool)) - else - io.writefile(wrapper_path, ("#!/bin/bash\nexec \"%s\" %s \"$@\""):format(zig, tool)) - os.runv("chmod", {"+x", wrapper_path}) - end - end - if (tool == "cc" or tool == "c++") and wrapper_path then - wrapper_path = "zig_cc@" .. wrapper_path - end - toolchain:config_set("toolset_" .. tool, wrapper_path) - end - end - local paths = {} for _, package in ipairs(toolchain:packages()) do local envs = package:envs() @@ -69,7 +48,6 @@ toolchain("zig") end end if zig then - _setup_zigcc_wrapper(zig) toolchain:config_set("zig", zig) toolchain:config_set("zig_version", zig_version) return true @@ -77,97 +55,16 @@ toolchain("zig") end) on_load(function (toolchain) - import("core.base.semver") + import("private.utils.toolchain", {alias = "toolchain_utils"}) - -- set toolset - -- we patch target to `zig cc` to fix has_flags. see https://github.com/xmake-io/xmake/issues/955#issuecomment-766929692 local zig = toolchain:config("zig") or "zig" - local zig_version = toolchain:config("zig_version") - if toolchain:config("zigcc") ~= false then - -- we can use `set_toolchains("zig", {zigcc = false})` to disable zigcc - -- @see https://github.com/xmake-io/xmake/issues/3251 - toolchain:set("toolset", "cc", toolchain:config("toolset_cc")) - toolchain:set("toolset", "cxx", toolchain:config("toolset_c++")) - toolchain:set("toolset", "ld", toolchain:config("toolset_c++")) - toolchain:set("toolset", "sh", toolchain:config("toolset_c++")) - toolchain:set("toolset", "ar", toolchain:config("toolset_ar")) - toolchain:set("toolset", "ranlib", toolchain:config("toolset_ranlib")) - toolchain:set("toolset", "lib", toolchain:config("toolset_lib")) - toolchain:set("toolset", "ld.lld", toolchain:config("toolset_ld.lld")) - toolchain:set("toolset", "lld-link", toolchain:config("toolset_lld-link")) - toolchain:set("toolset", "wasm-ld", toolchain:config("toolset_wasm-ld")) - toolchain:set("toolset", "objcopy", toolchain:config("toolset_objcopy")) - toolchain:set("toolset", "as", toolchain:config("toolset_cc")) - toolchain:set("toolset", "dlltool", toolchain:config("toolset_dlltool")) - toolchain:set("toolset", "mrc", toolchain:config("toolset_rc")) - end toolchain:set("toolset", "zc", zig) toolchain:set("toolset", "zcar", zig) toolchain:set("toolset", "zcld", zig) toolchain:set("toolset", "zcsh", zig) - -- get target from cross only for cross-compilation - -- @see https://github.com/xmake-io/xmake/issues/7180 - local target - if not target and toolchain:is_cross() then - target = toolchain:cross() - end - - -- get target from arch - if not target then - local arch - if toolchain:is_arch("arm64", "arm64-v8a") then - arch = "aarch64" - elseif toolchain:is_arch("arm", "armv7") then - arch = "arm" - elseif toolchain:is_arch("i386", "x86") then - if zig_version and semver.compare(zig_version, "0.11") >= 0 then - arch = "x86" - else - arch = "i386" - end - elseif toolchain:is_arch("riscv64") then - arch = "riscv64" - elseif toolchain:is_arch("loong64") then - arch = "loongarch64" - elseif toolchain:is_arch("mips.*") then - arch = toolchain:arch() - elseif toolchain:is_arch("ppc64") then - arch = "powerpc64" - elseif toolchain:is_arch("ppc") then - arch = "powerpc" - elseif toolchain:is_arch("s390x") then - arch = "s390x" - else - arch = "x86_64" - end - - if toolchain:is_plat("cross") then - -- xmake f -p cross --toolchain=zig --cross=mips64el-linux-gnuabi64 - elseif toolchain:is_plat("macosx") then - --@see https://github.com/ziglang/zig/issues/14226 - target = arch .. "-macos-none" - elseif toolchain:is_plat("linux") then - if arch == "arm" then - target = "arm-linux-gnueabi" - elseif arch == "mips64" or arch == "mips64el" then - target = arch .. "-linux-gnuabi64" - else - target = arch .. "-linux-gnu" - end - elseif toolchain:is_plat("windows") then - target = arch .. "-windows-msvc" - elseif toolchain:is_plat("mingw") then - target = arch .. "-windows-gnu" - end - end - - -- set target flags + local target = toolchain_utils.get_zig_target(toolchain) if target then - toolchain:add("asflags", "-target", target) - toolchain:add("cxflags", "-target", target) - toolchain:add("shflags", "-target", target) - toolchain:add("ldflags", "-target", target) toolchain:add("zcflags", "-target", target) toolchain:add("zcldflags", "-target", target) toolchain:add("zcshflags", "-target", target) diff --git a/xmake/toolchains/zigcc/xmake.lua b/xmake/toolchains/zigcc/xmake.lua new file mode 100644 index 000000000..aabf3640e --- /dev/null +++ b/xmake/toolchains/zigcc/xmake.lua @@ -0,0 +1,106 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, Xmake Open Source Community. +-- +-- @author ruki +-- @file xmake.lua +-- + +-- define toolchain +toolchain("zigcc") + set_kind("standalone") + set_homepage("https://ziglang.org/") + set_description("Use zig cc/c++ as C/C++ Compiler") + + on_check(function (toolchain) + import("lib.detect.find_tool") + + -- @see https://github.com/xmake-io/xmake/issues/5610 + local function _setup_zigcc_wrapper(zig) + local script_suffix = is_host("windows") and ".cmd" or "" + for _, tool in ipairs({"cc", "c++", "ar", "ranlib", "lib", "ld.lld", "lld-link", "wasm-ld", "objcopy", "dlltool", "rc"}) do + local wrapper_path = path.join(os.tmpdir(), "zigcc", tool) .. script_suffix + if not os.isfile(wrapper_path) then + if is_host("windows") then + io.writefile(wrapper_path, ("@echo off\n\"%s\" %s %%*"):format(zig, tool)) + else + io.writefile(wrapper_path, ("#!/bin/bash\nexec \"%s\" %s \"$@\""):format(zig, tool)) + os.runv("chmod", {"+x", wrapper_path}) + end + end + if (tool == "cc" or tool == "c++") and wrapper_path then + wrapper_path = "zig_cc@" .. wrapper_path + end + toolchain:config_set("toolset_" .. tool, wrapper_path) + end + end + + local paths = {} + for _, package in ipairs(toolchain:packages()) do + local envs = package:envs() + if envs then + table.join2(paths, envs.PATH) + end + end + local sdkdir = toolchain:sdkdir() + if sdkdir then + table.insert(paths, sdkdir) + end + + local zig = get_config("zc") + local zig_version + if not zig then + zig = find_tool("zig", {force = true, version = true, paths = paths}) + if zig and zig.program then + zig_version = zig.version + zig = zig.program + end + end + if zig then + _setup_zigcc_wrapper(zig) + toolchain:config_set("zig", zig) + toolchain:config_set("zig_version", zig_version) + return true + end + end) + + on_load(function (toolchain) + import("private.utils.toolchain", {alias = "toolchain_utils"}) + + -- set toolset + -- we patch target to `zig cc` to fix has_flags. see https://github.com/xmake-io/xmake/issues/955#issuecomment-766929692 + toolchain:set("toolset", "cc", toolchain:config("toolset_cc")) + toolchain:set("toolset", "cxx", toolchain:config("toolset_c++")) + toolchain:set("toolset", "ld", toolchain:config("toolset_c++")) + toolchain:set("toolset", "sh", toolchain:config("toolset_c++")) + toolchain:set("toolset", "ar", toolchain:config("toolset_ar")) + toolchain:set("toolset", "ranlib", toolchain:config("toolset_ranlib")) + toolchain:set("toolset", "lib", toolchain:config("toolset_lib")) + toolchain:set("toolset", "ld.lld", toolchain:config("toolset_ld.lld")) + toolchain:set("toolset", "lld-link", toolchain:config("toolset_lld-link")) + toolchain:set("toolset", "wasm-ld", toolchain:config("toolset_wasm-ld")) + toolchain:set("toolset", "objcopy", toolchain:config("toolset_objcopy")) + toolchain:set("toolset", "as", toolchain:config("toolset_cc")) + toolchain:set("toolset", "dlltool", toolchain:config("toolset_dlltool")) + toolchain:set("toolset", "mrc", toolchain:config("toolset_rc")) + + local target = toolchain_utils.get_zig_target(toolchain) + if target then + toolchain:add("asflags", "-target", target) + toolchain:add("cxflags", "-target", target) + toolchain:add("shflags", "-target", target) + toolchain:add("ldflags", "-target", target) + end + end) |
