zig c++ does not support compile only mode #30222

Open
opened 2025-12-18 15:13:06 +01:00 by Ghost · 0 comments

Zig Version

0.16.0-dev.1624+b9eefe17a

Steps to Reproduce and Observed Behavior

I started to investigate what is missing to support C++ modules with the zig c++ toolchain. As a first step cmake will run clang-scan-deps to discover C++ module dependencies.

Failing command:

Example with clang++-21

/home/user/local/llvm21-assert/bin/clang-scan-deps" -format=p1689 -- /home/user/local/llvm21-assert/bin/clang++ --verbose -H -stdlib=libc++ --optimize=2 --debug -g -std=gnu++23 -x c++ /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp -c -o CMakeFiles/main.dir/main.cpp.o -resource-dir "/home/user/local/llvm21-assert/lib/clang/21" -MT CMakeFiles/main.dir/main.cpp.o.ddi -MD -MF CMakeFiles/main.dir/main.cpp.o.ddi.d > CMakeFiles/main.dir/main.cpp.o.ddi.tmp && mv CMakeFiles/main.dir/main.cpp.o.ddi.tmp CMakeFiles/main.dir/main.cpp.o.ddi

Example command using zig c++

"/home/user/local/llvm21-assert/bin/clang-scan-deps" -format=p1689 -- /data/workspace/zig/cpp_modules/cpp_ex_01/zig-cxx-rel.sh   --verbose -H  -stdlib=libc++  --optimize=2 --debug -resource-dir /home/user/work/zig/zig.git/master/build/stage3/lib/clang/21 -g -std=gnu++23 -x c++ /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp -c -o CMakeFiles/main.dir/main.cpp.o -MT CMakeFiles/main.dir/main.cpp.o.ddi -MD -MF CMakeFiles/main.dir/main.cpp.o.ddi.d > CMakeFiles/main.dir/main.cpp.o.ddi.tmp && mv CMakeFiles/main.dir/main.cpp.o.ddi.tmp CMakeFiles/main.dir/main.cpp.o.ddi

Error in zig

Error while scanning dependencies for /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp:
/data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp:3:10: fatal error: 'iostream' file not found

The following arguments passed to zig c++ are meant to run clang in scan mode only, but It seems zig c++ is trying to compile and link, when it should only run in object mode:

-c Only run preprocess, compile, and assemble steps
-MT Specify name of main file output in depfile
-MD Write a depfile containing user and system headers
-MF Write depfile output from -MMD, -MD, -MM, or -M to
https://clang.llvm.org/docs/ClangCommandLineReference.html

Expected output(files generated):

build-cmake/CMakeFiles/main.dir/main.cpp.o
build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi
build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi.d
build-cmake/CMakeFiles/main.dir/main.cpp.o.modmap

Software used:

Ubuntu 24.04
cmake 4.2.0
clang++-21
zig 0.16.0-dev.1624+b9eefe17a

Steps to reproduce

commands
rm -Rf build-cmake; cmake --preset=clang-21-debug --log-level=TRACE --trace-expand   2>&1 | tee cmake-clang-cfg.log
cmake --build --preset=clang-21-debug-build --verbose 2>&1 | tee cmake-clang-build.log
rm -Rf build-cmake-zig; cmake --preset=zig-debug --log-level=TRACE --trace-expand   2>&1 | tee cmake-zig-cfg.log
cmake --build --preset=zig-debug-build --verbose  2>&1 | tee cmake-zig-build.log
main.cpp
import math;
#include <iostream>

int main(){
    std::cout<< "Simple module: " << add(4,3) << "\n";
    return 0;
}
math.cppm
module;
export module math;
export int add(int a, int b){ return a+b;}
CMakeLists.txt
cmake_minimum_required(VERSION 4.2.0 FATAL_ERROR)

project(main LANGUAGES CXX)

add_executable(main main.cpp)
target_sources(main PRIVATE
    FILE_SET CXX_MODULES
    FILES
    math.cppm
)

CMakePresets.json
{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 4,
    "minor": 2,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "zig-debug",
      "displayName": "ZIG Debug",
      "description": "Use ZIG as C++ replacement",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build-cmake-zig/",
      "cacheVariables": {
        "CMAKE_CXX_LINKER_DEPFILE_SUPPORTED": "TRUE",
        "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS": "/home/user/local/llvm21-assert/bin/clang-scan-deps",
        "CMAKE_CXX_MODULE_STD": "OFF",
        "CMAKE_CXX_STDLIB_MODULES_JSON": "/home/user/local/llvm21-assert/lib/x86_64-unknown-linux-gnu/libc++.modules.json",
        "CMAKE_CXX_STANDARD": "23",
        "CMAKE_CXX_STANDARD_REQUIRED": "YES",
        "CMAKE_CXX_EXTENSIONS": "ON",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "CMAKE_AR": "${sourceDir}/zig-ar.sh",
        "CMAKE_RANLIB": "${sourceDir}/zig-ranlib.sh",
        "CMAKE_CXX_COMPILER_RANLIB": "${sourceDir}/zig-ranlib.sh",
        "CMAKE_C_COMPILER": "${sourceDir}/zig-cc-debug.sh",
        "CMAKE_CXX_COMPILER": "${sourceDir}/zig-cxx-rel.sh",
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_CXX_FLAGS": "--verbose -H  -stdlib=libc++  --optimize=2 --debug -resource-dir /home/user/work/zig/zig.git/master/build/stage3/lib/clang/21"
      }
    },
    {
      "name": "clang-21-debug",
      "displayName": "Clang-21 Debug",
      "description": "Use Clang",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build-cmake",
      "cacheVariables": {
        "CMAKE_CXX_MODULE_STD": "OFF",
        "CMAKE_CXX_STDLIB_MODULES_JSON": "/home/user/local/llvm21-assert/lib/x86_64-unknown-linux-gnu/libc++.modules.json",
        "CMAKE_CXX_STANDARD": "23",
        "CMAKE_CXX_STANDARD_REQUIRED": "YES",
        "CMAKE_CXX_EXTENSIONS": "ON",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "CMAKE_C_COMPILER": "/home/user/local/llvm21-assert/bin/clang",
        "CMAKE_CXX_COMPILER": "/home/user/local/llvm21-assert/bin/clang++",
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS": "/home/user/local/llvm21-assert/bin/clang-scan-deps",
        "CMAKE_CXX_FLAGS": "--verbose -H -stdlib=libc++ --optimize=2 --debug"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "zig-debug-build",
      "configurePreset": "zig-debug"
    },
    {
      "name": "clang-21-debug-build",
      "configurePreset": "clang-21-debug"
    }
  ]
}

Expected Behavior

Expected output(files generated):

build-cmake/CMakeFiles/main.dir/main.cpp.o
build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi
build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi.d
build-cmake/CMakeFiles/main.dir/main.cpp.o.modmap
### Zig Version 0.16.0-dev.1624+b9eefe17a ### Steps to Reproduce and Observed Behavior I started to investigate what is missing to support C++ modules with the zig c++ toolchain. As a first step cmake will run clang-scan-deps to discover C++ module dependencies. ## Failing command: Example with clang++-21 ``` /home/user/local/llvm21-assert/bin/clang-scan-deps" -format=p1689 -- /home/user/local/llvm21-assert/bin/clang++ --verbose -H -stdlib=libc++ --optimize=2 --debug -g -std=gnu++23 -x c++ /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp -c -o CMakeFiles/main.dir/main.cpp.o -resource-dir "/home/user/local/llvm21-assert/lib/clang/21" -MT CMakeFiles/main.dir/main.cpp.o.ddi -MD -MF CMakeFiles/main.dir/main.cpp.o.ddi.d > CMakeFiles/main.dir/main.cpp.o.ddi.tmp && mv CMakeFiles/main.dir/main.cpp.o.ddi.tmp CMakeFiles/main.dir/main.cpp.o.ddi ``` Example command using zig c++ ``` "/home/user/local/llvm21-assert/bin/clang-scan-deps" -format=p1689 -- /data/workspace/zig/cpp_modules/cpp_ex_01/zig-cxx-rel.sh --verbose -H -stdlib=libc++ --optimize=2 --debug -resource-dir /home/user/work/zig/zig.git/master/build/stage3/lib/clang/21 -g -std=gnu++23 -x c++ /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp -c -o CMakeFiles/main.dir/main.cpp.o -MT CMakeFiles/main.dir/main.cpp.o.ddi -MD -MF CMakeFiles/main.dir/main.cpp.o.ddi.d > CMakeFiles/main.dir/main.cpp.o.ddi.tmp && mv CMakeFiles/main.dir/main.cpp.o.ddi.tmp CMakeFiles/main.dir/main.cpp.o.ddi ``` Error in zig Error while scanning dependencies for /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp: /data/workspace/zig/cpp_modules/cpp_ex_01/main.cpp:3:10: fatal error: 'iostream' file not found The following arguments passed to zig c++ are meant to run clang in scan mode only, but It seems zig c++ is trying to compile and link, when it should only run in object mode: -c Only run preprocess, compile, and assemble steps -MT<arg> Specify name of main file output in depfile -MD Write a depfile containing user and system headers -MF<file> Write depfile output from -MMD, -MD, -MM, or -M to <file> https://clang.llvm.org/docs/ClangCommandLineReference.html Expected output(files generated): build-cmake/CMakeFiles/main.dir/main.cpp.o build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi.d build-cmake/CMakeFiles/main.dir/main.cpp.o.modmap ## Software used: Ubuntu 24.04 cmake 4.2.0 clang++-21 zig 0.16.0-dev.1624+b9eefe17a # Steps to reproduce <details open> <summary>commands</summary> ``` rm -Rf build-cmake; cmake --preset=clang-21-debug --log-level=TRACE --trace-expand 2>&1 | tee cmake-clang-cfg.log cmake --build --preset=clang-21-debug-build --verbose 2>&1 | tee cmake-clang-build.log rm -Rf build-cmake-zig; cmake --preset=zig-debug --log-level=TRACE --trace-expand 2>&1 | tee cmake-zig-cfg.log cmake --build --preset=zig-debug-build --verbose 2>&1 | tee cmake-zig-build.log ``` </details> <details> <summary>main.cpp</summary> ``` import math; #include <iostream> int main(){ std::cout<< "Simple module: " << add(4,3) << "\n"; return 0; } ``` </details> <details> <summary>math.cppm</summary> ``` module; export module math; export int add(int a, int b){ return a+b;} ``` </details> <details> <summary>CMakeLists.txt</summary> ``` cmake_minimum_required(VERSION 4.2.0 FATAL_ERROR) project(main LANGUAGES CXX) add_executable(main main.cpp) target_sources(main PRIVATE FILE_SET CXX_MODULES FILES math.cppm ) ``` </details> <details> <summary>CMakePresets.json</summary> ``` { "version": 3, "cmakeMinimumRequired": { "major": 4, "minor": 2, "patch": 0 }, "configurePresets": [ { "name": "zig-debug", "displayName": "ZIG Debug", "description": "Use ZIG as C++ replacement", "generator": "Ninja", "binaryDir": "${sourceDir}/build-cmake-zig/", "cacheVariables": { "CMAKE_CXX_LINKER_DEPFILE_SUPPORTED": "TRUE", "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS": "/home/user/local/llvm21-assert/bin/clang-scan-deps", "CMAKE_CXX_MODULE_STD": "OFF", "CMAKE_CXX_STDLIB_MODULES_JSON": "/home/user/local/llvm21-assert/lib/x86_64-unknown-linux-gnu/libc++.modules.json", "CMAKE_CXX_STANDARD": "23", "CMAKE_CXX_STANDARD_REQUIRED": "YES", "CMAKE_CXX_EXTENSIONS": "ON", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_AR": "${sourceDir}/zig-ar.sh", "CMAKE_RANLIB": "${sourceDir}/zig-ranlib.sh", "CMAKE_CXX_COMPILER_RANLIB": "${sourceDir}/zig-ranlib.sh", "CMAKE_C_COMPILER": "${sourceDir}/zig-cc-debug.sh", "CMAKE_CXX_COMPILER": "${sourceDir}/zig-cxx-rel.sh", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_CXX_FLAGS": "--verbose -H -stdlib=libc++ --optimize=2 --debug -resource-dir /home/user/work/zig/zig.git/master/build/stage3/lib/clang/21" } }, { "name": "clang-21-debug", "displayName": "Clang-21 Debug", "description": "Use Clang", "generator": "Ninja", "binaryDir": "${sourceDir}/build-cmake", "cacheVariables": { "CMAKE_CXX_MODULE_STD": "OFF", "CMAKE_CXX_STDLIB_MODULES_JSON": "/home/user/local/llvm21-assert/lib/x86_64-unknown-linux-gnu/libc++.modules.json", "CMAKE_CXX_STANDARD": "23", "CMAKE_CXX_STANDARD_REQUIRED": "YES", "CMAKE_CXX_EXTENSIONS": "ON", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_C_COMPILER": "/home/user/local/llvm21-assert/bin/clang", "CMAKE_CXX_COMPILER": "/home/user/local/llvm21-assert/bin/clang++", "CMAKE_BUILD_TYPE": "Debug", "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS": "/home/user/local/llvm21-assert/bin/clang-scan-deps", "CMAKE_CXX_FLAGS": "--verbose -H -stdlib=libc++ --optimize=2 --debug" } } ], "buildPresets": [ { "name": "zig-debug-build", "configurePreset": "zig-debug" }, { "name": "clang-21-debug-build", "configurePreset": "clang-21-debug" } ] } ``` </details> ### Expected Behavior Expected output(files generated): ``` build-cmake/CMakeFiles/main.dir/main.cpp.o build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi build-cmake/CMakeFiles/main.dir/main.cpp.o.ddi.d build-cmake/CMakeFiles/main.dir/main.cpp.o.modmap ```
Sign in to join this conversation.
No labels
abi/f32
abi/ilp32
abi/n32
abi/sf
abi/x32
accepted
arch/1750a
arch/21k
arch/6502
arch/a29k
arch/aarch64
arch/alpha
arch/amdgcn
arch/arc
arch/arc32
arch/arc64
arch/arm
arch/avr
arch/avr32
arch/bfin
arch/bpf
arch/clipper
arch/colossus
arch/cr16
arch/cris
arch/csky
arch/dlx
arch/dsp16xx
arch/elxsi
arch/epiphany
arch/fr30
arch/frv
arch/h8300
arch/h8500
arch/hexagon
arch/hppa
arch/hppa64
arch/i370
arch/i860
arch/i960
arch/ia64
arch/ip2k
arch/kalimba
arch/kvx
arch/lanai
arch/lm32
arch/loongarch32
arch/loongarch64
arch/m32r
arch/m68k
arch/m88k
arch/maxq
arch/mcore
arch/metag
arch/microblaze
arch/mips
arch/mips64
arch/mmix
arch/mn10200
arch/mn10300
arch/moxie
arch/mrisc32
arch/msp430
arch/nds32
arch/nios2
arch/ns32k
arch/nvptx
arch/or1k
arch/pdp10
arch/pdp11
arch/pj
arch/powerpc
arch/powerpc64
arch/propeller
arch/riscv32
arch/riscv64
arch/rl78
arch/rx
arch/s390
arch/s390x
arch/sh
arch/sh64
arch/sparc
arch/sparc64
arch/spirv
arch/spu
arch/st200
arch/starcore
arch/tilegx
arch/tilepro
arch/tricore
arch/ts
arch/v850
arch/vax
arch/vc4
arch/ve
arch/wasm
arch/we32k
arch/x86
arch/x86_16
arch/x86_64
arch/xcore
arch/xgate
arch/xstormy16
arch/xtensa
autodoc
backend/c
backend/llvm
backend/self-hosted
binutils
breaking
build system
debug info
docs
error message
frontend
fuzzing
incremental
lib/c
lib/compiler-rt
lib/cxx
lib/std
lib/tsan
lib/ubsan-rt
lib/unwind
linking
miscompilation
os/aix
os/android
os/bridgeos
os/contiki
os/dragonfly
os/driverkit
os/emscripten
os/freebsd
os/fuchsia
os/haiku
os/hermit
os/hurd
os/illumos
os/ios
os/kfreebsd
os/linux
os/maccatalyst
os/macos
os/managarm
os/netbsd
os/ohos
os/openbsd
os/plan9
os/redox
os/rtems
os/serenity
os/solaris
os/tvos
os/uefi
os/visionos
os/wali
os/wasi
os/watchos
os/windows
os/zos
proposal
release notes
testing
tier system
zig cc
zig fmt
bounty
bug
contributor-friendly
downstream
enhancement
infra
optimization
question
regression
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ziglang/zig#30222
No description provided.