From 3bf1daa6595a410d92d421fa77be50ec58c13c12 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Fri, 26 Jul 2024 22:29:20 +0200 Subject: [PATCH] Generalize zig-toolchain.cmake --- README.md | 7 ++++++ cmake/zig-rc.cmd | 2 ++ cmake/zig-rc.sh | 2 ++ cmake/zig-toolchain-aarch64.cmake | 20 ++------------- cmake/zig-toolchain-winarm64.cmake | 2 ++ cmake/zig-toolchain.cmake | 40 ++++++++++++++++++++++++++++++ 6 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 cmake/zig-rc.cmd create mode 100755 cmake/zig-rc.sh create mode 100644 cmake/zig-toolchain-winarm64.cmake create mode 100644 cmake/zig-toolchain.cmake diff --git a/README.md b/README.md index 9dbd25a..ab74cd3 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,10 @@ Reference: https://zig.news/kristoff/cross-compile-a-c-c-project-with-zig-3599 - [Install zig](https://ziglang.org/learn/getting-started/#installing-zig) in your PATH (`choco install zig` on Windows) - `cmake -B build-aarch64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/zig-toolchain-aarch64.cmake` - `cmake --build build-arch64` + +You can create toolchains for other triples like this. Here is an example to build for Windows on ARM64: + +```cmake +set(ZIG_TARGET "aarch64-windows-gnu") +include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) +``` diff --git a/cmake/zig-rc.cmd b/cmake/zig-rc.cmd new file mode 100644 index 0000000..7111f45 --- /dev/null +++ b/cmake/zig-rc.cmd @@ -0,0 +1,2 @@ +@echo off +zig rc %* \ No newline at end of file diff --git a/cmake/zig-rc.sh b/cmake/zig-rc.sh new file mode 100755 index 0000000..4be7275 --- /dev/null +++ b/cmake/zig-rc.sh @@ -0,0 +1,2 @@ +#!/bin/sh +zig rc "$@" diff --git a/cmake/zig-toolchain-aarch64.cmake b/cmake/zig-toolchain-aarch64.cmake index ea7cd0f..764383b 100644 --- a/cmake/zig-toolchain-aarch64.cmake +++ b/cmake/zig-toolchain-aarch64.cmake @@ -1,18 +1,2 @@ -if(CMAKE_GENERATOR MATCHES "Visual Studio") - message(FATAL_ERROR "Visual Studio generator not supported, use: cmake -G Ninja") -endif() -set(CMAKE_SYSTEM_NAME "Linux") -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR "aarch64") -set(CMAKE_C_COMPILER "zig" cc -target aarch64-linux-gnu) -set(CMAKE_CXX_COMPILER "zig" c++ -target aarch64-linux-gnu) - -if(WIN32) - set(SCRIPT_SUFFIX ".cmd") -else() - set(SCRIPT_SUFFIX ".sh") -endif() - -# This is working (thanks to Simon for finding this trick) -set(CMAKE_AR "${CMAKE_CURRENT_LIST_DIR}/zig-ar${SCRIPT_SUFFIX}") -set(CMAKE_RANLIB "${CMAKE_CURRENT_LIST_DIR}/zig-ranlib${SCRIPT_SUFFIX}") +set(ZIG_TARGET "aarch64-linux-gnu") +include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) diff --git a/cmake/zig-toolchain-winarm64.cmake b/cmake/zig-toolchain-winarm64.cmake new file mode 100644 index 0000000..a292187 --- /dev/null +++ b/cmake/zig-toolchain-winarm64.cmake @@ -0,0 +1,2 @@ +set(ZIG_TARGET "aarch64-windows-gnu") +include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) diff --git a/cmake/zig-toolchain.cmake b/cmake/zig-toolchain.cmake new file mode 100644 index 0000000..e344587 --- /dev/null +++ b/cmake/zig-toolchain.cmake @@ -0,0 +1,40 @@ +include_guard() + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + message(FATAL_ERROR "Visual Studio generator not supported, use: cmake -G Ninja") +endif() + +if(NOT ZIG_TARGET MATCHES "^([a-zZ-Z0-9_]+)-([a-zZ-Z0-9_]+)-([a-zZ-Z0-9_]+)$") + message(FATAL_ERROR "Expected -DZIG_TARGET=--") +endif() + +set(ZIG_ARCH ${CMAKE_MATCH_1}) +set(ZIG_OS ${CMAKE_MATCH_2}) +set(ZIG_ABI ${CMAKE_MATCH_3}) + +if(ZIG_OS STREQUAL "linux") + set(CMAKE_SYSTEM_NAME "Linux") +elseif(ZIG_OS STREQUAL "windows") + set(CMAKE_SYSTEM_NAME "Windows") +elseif(ZIG_OS STREQUAL "macos") + set(CMAKE_SYSTEM_NAME "Darwin") +else() + message(WARNING "Unknown OS: ${ZIG_OS}") +endif() + +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR ${ZIG_ARCH}) + +set(CMAKE_C_COMPILER "zig" cc -target ${ZIG_TARGET}) +set(CMAKE_CXX_COMPILER "zig" c++ -target ${ZIG_TARGET}) + +if(WIN32) + set(SCRIPT_SUFFIX ".cmd") +else() + set(SCRIPT_SUFFIX ".sh") +endif() + +# This is working (thanks to Simon for finding this trick) +set(CMAKE_AR "${CMAKE_CURRENT_LIST_DIR}/zig-ar${SCRIPT_SUFFIX}") +set(CMAKE_RANLIB "${CMAKE_CURRENT_LIST_DIR}/zig-ranlib${SCRIPT_SUFFIX}") +set(CMAKE_RC "${CMAKE_CURRENT_LIST_DIR}/zig-rc${SCRIPT_SUFFIX}")