Skip to content

Commit 3cb43da

Browse files
committed
feat: add flexible compiler flags support and improve documentation
- Add ZIG_COMPILER_FLAGS cache variable for additional compilation flags - Refactor CPU flags handling to support ZIG_MCPU and ZIG_MCPU_FEATURES separately - Add comprehensive comments explaining edge case handling for cross-compilation - Document macOS SDK path prevention and Windows RC compiler syntax requirements - Bump toolchain version from 0.1.0 to 0.1.1
1 parent a70e5b9 commit 3cb43da

1 file changed

Lines changed: 57 additions & 32 deletions

File tree

zig.toolchain.cmake

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
include_guard(GLOBAL)
22

3-
set(ZIG_TOOLCHAIN_VERSION "0.1.0")
3+
set(ZIG_TOOLCHAIN_VERSION "0.1.1")
44

55
if(CMAKE_GENERATOR MATCHES "Visual Studio")
66
message(FATAL_ERROR "Zig Toolchain: Visual Studio generator is not supported. Please use '-G Ninja' or '-G MinGW Makefiles'.")
@@ -10,7 +10,6 @@ find_program(ZIG_COMPILER zig)
1010
if(NOT ZIG_COMPILER)
1111
message(FATAL_ERROR "Zig Toolchain: Zig compiler not found. Please install Zig and ensure it is in your PATH.")
1212
endif()
13-
1413
execute_process(
1514
COMMAND zig version
1615
OUTPUT_VARIABLE ZIG_COMPILER_VERSION
@@ -29,44 +28,70 @@ if(NOT ZIG_TARGET)
2928
set(CMAKE_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}")
3029
endif()
3130

32-
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" Z_ARCH)
33-
if(Z_ARCH MATCHES "arm64|aarch64")
34-
set(Z_ARCH "aarch64")
35-
elseif(Z_ARCH MATCHES "x64|x86_64|amd64")
36-
set(Z_ARCH "x86_64")
31+
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" ZIG_ARCH)
32+
if(ZIG_ARCH MATCHES "arm64|aarch64")
33+
set(ZIG_ARCH "aarch64")
34+
elseif(ZIG_ARCH MATCHES "x64|x86_64|amd64")
35+
set(ZIG_ARCH "x86_64")
3736
endif()
3837

39-
string(TOLOWER "${CMAKE_SYSTEM_NAME}" Z_OS)
40-
set(Z_ABI "gnu")
41-
if(Z_OS MATCHES "darwin|macos")
42-
set(Z_OS "macos")
43-
set(Z_ABI "none") # macOS uses its own ABI, not GNU
44-
elseif(Z_OS MATCHES "windows")
45-
set(Z_OS "windows")
46-
elseif(Z_OS MATCHES "linux")
47-
set(Z_OS "linux")
38+
string(TOLOWER "${CMAKE_SYSTEM_NAME}" ZIG_OS)
39+
set(ZIG_ABI "gnu")
40+
if(ZIG_OS MATCHES "darwin|macos")
41+
set(ZIG_OS "macos")
42+
set(ZIG_ABI "none") # macOS uses its own ABI, not GNU
43+
elseif(ZIG_OS MATCHES "windows")
44+
set(ZIG_OS "windows")
45+
elseif(ZIG_OS MATCHES "linux")
46+
set(ZIG_OS "linux")
4847
endif()
4948

50-
set(ZIG_TARGET "${Z_ARCH}-${Z_OS}-${Z_ABI}")
49+
set(ZIG_TARGET "${ZIG_ARCH}-${ZIG_OS}-${ZIG_ABI}")
50+
else()
51+
if(NOT ZIG_TARGET MATCHES "^([a-zA-Z0-9_]+)-([a-zA-Z0-9_]+)(-([a-zA-Z0-9_.]+))?$")
52+
message(FATAL_ERROR "Zig Toolchain: ZIG_TARGET is invalid. Please specify it manually using -DZIG_TARGET=<arch>-<os>[-<abi>]")
53+
endif()
54+
set(ZIG_ARCH ${CMAKE_MATCH_1})
55+
set(ZIG_OS ${CMAKE_MATCH_2})
56+
if(CMAKE_MATCH_4)
57+
set(ZIG_ABI ${CMAKE_MATCH_4})
58+
else()
59+
set(ZIG_ABI "none")
60+
endif()
5161
endif()
5262

53-
if(ZIG_TARGET MATCHES "^-")
54-
message(FATAL_ERROR "Zig Toolchain: ZIG_TARGET is not set. Please specify it manually using -DZIG_TARGET=...")
63+
# Dummy version satisfies CMake's cross-compilation requirements without affecting Zig's behavior
64+
set(CMAKE_SYSTEM_VERSION 1)
65+
set(CMAKE_SYSTEM_PROCESSOR ${ZIG_ARCH})
66+
if(ZIG_OS STREQUAL "linux")
67+
set(CMAKE_SYSTEM_NAME "Linux")
68+
elseif(ZIG_OS STREQUAL "windows")
69+
set(CMAKE_SYSTEM_NAME "Windows")
70+
elseif(ZIG_OS STREQUAL "macos")
71+
set(CMAKE_SYSTEM_NAME "Darwin")
5572
else()
56-
message(STATUS "Zig Toolchain: v${ZIG_COMPILER_VERSION}${ZIG_TARGET}")
73+
message(FATAL_ERROR "Unknown OS: ${ZIG_OS}")
5774
endif()
75+
message(STATUS "Zig Toolchain: v${ZIG_COMPILER_VERSION}${ZIG_TARGET}")
5876

59-
if(ZIG_TARGET MATCHES "windows")
60-
set(CMAKE_SYSTEM_NAME Windows)
61-
elseif(ZIG_TARGET MATCHES "linux")
62-
set(CMAKE_SYSTEM_NAME Linux)
63-
elseif(ZIG_TARGET MATCHES "macos")
64-
set(CMAKE_SYSTEM_NAME Darwin)
65-
endif()
77+
set(ZIG_MCPU "" CACHE STRING "Target CPU architecture")
78+
set(ZIG_MCPU_FEATURES "" CACHE STRING "CPU features to enable/disable")
79+
set(ZIG_COMPILER_FLAGS "" CACHE STRING "Additional compilation flags")
6680

67-
# Dummy version satisfies CMake's cross-compilation requirements without affecting Zig's behavior
68-
set(CMAKE_SYSTEM_VERSION 1)
69-
set(CMAKE_SYSTEM_PROCESSOR ${Z_ARCH})
81+
set(ZIG_WRAPPER_ARGS "")
82+
if(ZIG_MCPU)
83+
string(APPEND ZIG_WRAPPER_ARGS " -mcpu=${ZIG_MCPU}")
84+
if(ZIG_MCPU_FEATURES)
85+
string(APPEND ZIG_WRAPPER_ARGS "${ZIG_MCPU_FEATURES}")
86+
endif()
87+
endif()
88+
if(ZIG_COMPILER_FLAGS)
89+
string(APPEND ZIG_WRAPPER_ARGS " ${ZIG_COMPILER_FLAGS}")
90+
endif()
91+
string(STRIP "${ZIG_WRAPPER_ARGS}" ZIG_WRAPPER_ARGS)
92+
if(ZIG_WRAPPER_ARGS)
93+
message(STATUS "Zig Toolchain: Compiler flags → ${ZIG_WRAPPER_ARGS}")
94+
endif()
7095

7196
option(ZIG_USE_CCACHE "Enable ccache optimization for Zig toolchain" OFF)
7297
set(ZIG_CC_PREFIX "")
@@ -93,8 +118,8 @@ else()
93118
set(ARGS "\"$@\"")
94119
endif()
95120

96-
file(WRITE "${ZIG_SHIMS_DIR}/zig-cc${EXT}" "${HEADER}\n${ZIG_CC_PREFIX}zig cc -target ${ZIG_TARGET} ${ARGS}\n")
97-
file(WRITE "${ZIG_SHIMS_DIR}/zig-c++${EXT}" "${HEADER}\n${ZIG_CC_PREFIX}zig c++ -target ${ZIG_TARGET} ${ARGS}\n")
121+
file(WRITE "${ZIG_SHIMS_DIR}/zig-cc${EXT}" "${HEADER}\n${ZIG_CC_PREFIX}zig cc -target ${ZIG_TARGET} ${ZIG_WRAPPER_ARGS} ${ARGS}\n")
122+
file(WRITE "${ZIG_SHIMS_DIR}/zig-c++${EXT}" "${HEADER}\n${ZIG_CC_PREFIX}zig c++ -target ${ZIG_TARGET} ${ZIG_WRAPPER_ARGS} ${ARGS}\n")
98123
file(WRITE "${ZIG_SHIMS_DIR}/zig-ar${EXT}" "${HEADER}\nzig ar ${ARGS}\n")
99124
file(WRITE "${ZIG_SHIMS_DIR}/zig-rc${EXT}" "${HEADER}\nzig rc ${ARGS}\n")
100125
file(WRITE "${ZIG_SHIMS_DIR}/zig-ranlib${EXT}" "${HEADER}\nzig ranlib ${ARGS}\n")

0 commit comments

Comments
 (0)