diff --git a/README.md b/README.md index ab74cd3..71c019d 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,22 @@ You can create toolchains for other triples like this. Here is an example to bui set(ZIG_TARGET "aarch64-windows-gnu") include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) ``` + +## clangd + +To get [clangd](https://clangd.llvm.org/) to work you need to first enable generation of `compile_commands.json`: + +```sh +cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON +``` + +Additionally you need to pass pass the following arguments to `clangd`: + +```json +"clangd.arguments": [ + "--log=verbose", + "--query-driver=*/clang-cl.exe,*/zig-cc.*,*/zig-c++.*,*/em++.bat,*/emcc.bat,*/em++,*/emcc", +] +``` + +Without these arguments `clangd` will not query the driver (`zig c++`) and the include paths will not be resolved correctly. diff --git a/cmake/zig-ar.sh b/cmake/zig-ar old mode 100755 new mode 100644 similarity index 100% rename from cmake/zig-ar.sh rename to cmake/zig-ar diff --git a/cmake/zig-c++ b/cmake/zig-c++ new file mode 100644 index 0000000..98bd07b --- /dev/null +++ b/cmake/zig-c++ @@ -0,0 +1,2 @@ +#!/bin/sh +zig c++ "$@" diff --git a/cmake/zig-c++.cmd b/cmake/zig-c++.cmd new file mode 100644 index 0000000..fd1542f --- /dev/null +++ b/cmake/zig-c++.cmd @@ -0,0 +1,2 @@ +@echo off +zig c++ %* \ No newline at end of file diff --git a/cmake/zig-cc b/cmake/zig-cc new file mode 100644 index 0000000..47f1650 --- /dev/null +++ b/cmake/zig-cc @@ -0,0 +1,2 @@ +#!/bin/sh +zig cc "$@" diff --git a/cmake/zig-cc.cmd b/cmake/zig-cc.cmd new file mode 100644 index 0000000..bcde8db --- /dev/null +++ b/cmake/zig-cc.cmd @@ -0,0 +1,2 @@ +@echo off +zig cc %* \ No newline at end of file diff --git a/cmake/zig-ranlib.sh b/cmake/zig-ranlib old mode 100755 new mode 100644 similarity index 100% rename from cmake/zig-ranlib.sh rename to cmake/zig-ranlib diff --git a/cmake/zig-rc.sh b/cmake/zig-rc old mode 100755 new mode 100644 similarity index 100% rename from cmake/zig-rc.sh rename to cmake/zig-rc diff --git a/cmake/zig-toolchain-riscv64.cmake b/cmake/zig-toolchain-riscv64.cmake index 560bff1..12de615 100644 --- a/cmake/zig-toolchain-riscv64.cmake +++ b/cmake/zig-toolchain-riscv64.cmake @@ -1,2 +1,2 @@ -set(ZIG_TARGET "riscv64-freestanding-none") -include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) +set(ZIG_TARGET "riscv64-freestanding-none") +include(${CMAKE_CURRENT_LIST_DIR}/zig-toolchain.cmake) diff --git a/cmake/zig-toolchain.cmake b/cmake/zig-toolchain.cmake index c7ad918..10bebe1 100644 --- a/cmake/zig-toolchain.cmake +++ b/cmake/zig-toolchain.cmake @@ -33,15 +33,16 @@ 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) +if(CMAKE_HOST_WIN32) set(SCRIPT_SUFFIX ".cmd") else() - set(SCRIPT_SUFFIX ".sh") + set(SCRIPT_SUFFIX "") endif() +# Work around a bug in clangd where 'c++' is reordered on the command line +set(CMAKE_C_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-cc${SCRIPT_SUFFIX}" -target ${ZIG_TARGET}) +set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_LIST_DIR}/zig-c++${SCRIPT_SUFFIX}" -target ${ZIG_TARGET}) + # 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}")