commit 4b546c04759ce525ab783f8d1b35cd240a074a10 Author: Duncan Ogilvie Date: Fri Oct 21 02:32:29 2022 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..65fe6fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +bin +bin2 +compile_commands.json +.clangd +temp.* +.vs +.cache +build*/ +.idea/ +cmake-build*/ +CMakeLists.txt.user diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0daaf87 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.22) + +project(cmake-zig) + +add_library(mylib-static STATIC src/mylib.cpp) +add_library(mylib-shared SHARED src/mylib.cpp) + +add_executable(myexe src/myexe.cpp) +target_link_libraries(myexe PRIVATE mylib-static) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9dbd25a --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# zig-cross + +Example of using [zig](https://ziglang.org) as a CMake Toolchain for cross compiling. + +Reference: https://zig.news/kristoff/cross-compile-a-c-c-project-with-zig-3599 + +## Building + +- [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` diff --git a/cmake/zig-ar.cmd b/cmake/zig-ar.cmd new file mode 100644 index 0000000..8d8bac7 --- /dev/null +++ b/cmake/zig-ar.cmd @@ -0,0 +1,2 @@ +@echo off +zig ar %* \ No newline at end of file diff --git a/cmake/zig-ar.sh b/cmake/zig-ar.sh new file mode 100755 index 0000000..3d69448 --- /dev/null +++ b/cmake/zig-ar.sh @@ -0,0 +1,2 @@ +#!/bin/sh +zig ar "$@" diff --git a/cmake/zig-ranlib.cmd b/cmake/zig-ranlib.cmd new file mode 100644 index 0000000..5163a73 --- /dev/null +++ b/cmake/zig-ranlib.cmd @@ -0,0 +1,2 @@ +@echo off +zig ranlib %* \ No newline at end of file diff --git a/cmake/zig-ranlib.sh b/cmake/zig-ranlib.sh new file mode 100755 index 0000000..5caa38e --- /dev/null +++ b/cmake/zig-ranlib.sh @@ -0,0 +1,2 @@ +#!/bin/sh +zig ranlib "$@" diff --git a/cmake/zig-toolchain-aarch64.cmake b/cmake/zig-toolchain-aarch64.cmake new file mode 100644 index 0000000..ea7cd0f --- /dev/null +++ b/cmake/zig-toolchain-aarch64.cmake @@ -0,0 +1,18 @@ +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}") diff --git a/src/myexe.cpp b/src/myexe.cpp new file mode 100644 index 0000000..7dd26cc --- /dev/null +++ b/src/myexe.cpp @@ -0,0 +1,8 @@ +#include + +#include "mylib.h" + +int main() +{ + puts(mylib()); +} \ No newline at end of file diff --git a/src/mylib.cpp b/src/mylib.cpp new file mode 100644 index 0000000..5dc21a0 --- /dev/null +++ b/src/mylib.cpp @@ -0,0 +1,6 @@ +#include "mylib.h" + +const char* mylib() +{ + return "hello from mylib"; +} \ No newline at end of file diff --git a/src/mylib.h b/src/mylib.h new file mode 100644 index 0000000..33a4c53 --- /dev/null +++ b/src/mylib.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef _WIN32 +#define MYLIB_EXPORT __declspec(dllexport) +#else +#define MYLIB_EXPORT +#endif // _WIN32 + + +extern "C" MYLIB_EXPORT const char* mylib(); \ No newline at end of file