11include_guard (GLOBAL )
22
3- set (ZIG_TOOLCHAIN_VERSION "0.1.0 " )
3+ set (ZIG_TOOLCHAIN_VERSION "0.1.1 " )
44
55if (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)
1010if (NOT ZIG_COMPILER)
1111 message (FATAL_ERROR "Zig Toolchain: Zig compiler not found. Please install Zig and ensure it is in your PATH." )
1212endif ()
13-
1413execute_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 ()
5161endif ()
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" )
5572else ()
56- message (STATUS "Zig Toolchain: v ${ZIG_COMPILER_VERSION} → ${ZIG_TARGET } " )
73+ message (FATAL_ERROR "Unknown OS: ${ZIG_OS } " )
5774endif ()
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
7196option (ZIG_USE_CCACHE "Enable ccache optimization for Zig toolchain" OFF )
7297set (ZIG_CC_PREFIX "" )
@@ -93,8 +118,8 @@ else()
93118 set (ARGS "\" $@\" " )
94119endif ()
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 " )
98123file (WRITE "${ZIG_SHIMS_DIR} /zig-ar${EXT} " "${HEADER} \n zig ar ${ARGS} \n " )
99124file (WRITE "${ZIG_SHIMS_DIR} /zig-rc${EXT} " "${HEADER} \n zig rc ${ARGS} \n " )
100125file (WRITE "${ZIG_SHIMS_DIR} /zig-ranlib${EXT} " "${HEADER} \n zig ranlib ${ARGS} \n " )
0 commit comments