Can't compile a simple Swift/C++ interop CMake project on Darwin

Hello,

I’m a maintainer of a certain CMake application that builds a certain object using Swift/C++ interoperability. It fails when it tries to build that object with various syntax errors. A simplified example of such a project is available here:

I tried to build it with:

{
  lib,
  stdenv,
  fetchFromGitHub,

  # nativeBuildInputs
  cmake,
  swift,
  ninja,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "swift-cxx-example";
  version = "unstable";

  src = fetchFromGitHub {
    owner = "swiftlang";
    repo = "swift-cmake-examples";
    rev = "47255279d69d0e3fa4491f7640c54b85e33a369d";
    hash = "sha256-1MtON09lfD4mbS++K4gL2okvHQqvLe1lgoHAJp3YDvU=";
  };
  sourceRoot = "${finalAttrs.src.name}/3_bidirectional_cxx_interop";

  nativeBuildInputs = [
    cmake
    swift
    ninja
  ];

  meta = {
    license = lib.licenses.free;
    maintainers = with lib.maintainers; [ doronbehar ];
  };
})

And it failed with:

[1/8] Generating '/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h'
[2/8] Building Swift Module 'SwiftFibonacci' with 1 source
[3/8] Building Swift Module 'fibonacci_swift' with 1 source
[4/8] Building CXX object lib/fibonacci/CMakeFiles/fibonacci.dir/fibonacci.cpp.o
FAILED: [code=1] lib/fibonacci/CMakeFiles/fibonacci.dir/fibonacci.cpp.o 
/nix/store/rwsbw420hcq148hifv7fga6r4g0k1dw8-clang-wrapper-21.1.8/bin/clang++  -I/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/include -I/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include -O3 -DNDEBUG -arch arm64 -isysroot /nix/store/rcqgjj8hphkhqark1ibiwfaa7yrzniz3-apple-sdk-14.4/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=13.0 -MD -MT lib/fibonacci/CMakeFiles/fibonacci.dir/fibonacci.cpp.o -MF lib/fibonacci/CMakeFiles/fibonacci.dir/fibonacci.cpp.o.d -o lib/fibonacci/CMakeFiles/fibonacci.dir/fibonacci.cpp.o -c /nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/lib/fibonacci/fibonacci.cpp
In file included from /nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/lib/fibonacci/fibonacci.cpp:12:
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:337:17: error: expected '{'
  337 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:337:17: error: a type specifier is required for all declarations
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:339:1: error: expected expression
  339 | namespace _impl {
      | ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:580:2: error: expected ';' after top level declarator
  580 | } // namespace swift
      |  ^
      |  ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:17: error: expected '{'
  584 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:64: error: expected ';' after top level declarator
  584 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:17: error: expected '{'
  777 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:64: error: expected ';' after top level declarator
  777 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:812:17: error: expected '{'
  812 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:812:17: error: a type specifier is required for all declarations
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:815:1: error: expected expression
  815 | template<class T_0_0>
      | ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:821:2: error: expected ';' after top level declarator
  821 | } // namespace swift
      |  ^
      |  ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:17: error: expected '{'
  823 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:64: error: expected ';' after top level declarator
  823 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:827:17: error: expected '{'
  827 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:827:17: error: a type specifier is required for all declarations
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
[5/8] Building CXX object src/CMakeFiles/fibonacci_cpp.dir/fibonacci.cpp.o
FAILED: [code=1] src/CMakeFiles/fibonacci_cpp.dir/fibonacci.cpp.o 
/nix/store/rwsbw420hcq148hifv7fga6r4g0k1dw8-clang-wrapper-21.1.8/bin/clang++  -I/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/include -I/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include -O3 -DNDEBUG -arch arm64 -isysroot /nix/store/rcqgjj8hphkhqark1ibiwfaa7yrzniz3-apple-sdk-14.4/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -mmacosx-version-min=13.0 -MD -MT src/CMakeFiles/fibonacci_cpp.dir/fibonacci.cpp.o -MF src/CMakeFiles/fibonacci_cpp.dir/fibonacci.cpp.o.d -o src/CMakeFiles/fibonacci_cpp.dir/fibonacci.cpp.o -c /nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/src/fibonacci.cpp
In file included from /nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/src/fibonacci.cpp:12:
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:337:17: error: expected '{'
  337 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:337:17: error: a type specifier is required for all declarations
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:339:1: error: expected expression
  339 | namespace _impl {
      | ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:580:2: error: expected ';' after top level declarator
  580 | } // namespace swift
      |  ^
      |  ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:17: error: expected '{'
  584 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:584:64: error: expected ';' after top level declarator
  584 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:17: error: expected '{'
  777 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:777:64: error: expected ';' after top level declarator
  777 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:812:17: error: expected '{'
  812 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:812:17: error: a type specifier is required for all declarations
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:815:1: error: expected expression
  815 | template<class T_0_0>
      | ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:821:2: error: expected ';' after top level declarator
  821 | } // namespace swift
      |  ^
      |  ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:17: error: expected '{'
  823 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:17: error: unknown type name 'SWIFT_PRIVATE_ATTR'
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:823:64: error: expected ';' after top level declarator
  823 | namespace swift SWIFT_PRIVATE_ATTR SWIFT_SYMBOL_MODULE("swift") {
      |                                                                ^
      |                                                                ;
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:827:17: error: expected '{'
  827 | namespace swift SWIFT_PRIVATE_ATTR {
      |                 ^
/nix/var/nix/builds/nix-31727-3598768211/source/3_bidirectional_cxx_interop/build/lib/fibonacci/include/fibonacci/fibonacci-swift.h:827:17: error: a type specifier is required for all declarations
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
ninja: build stopped: subcommand failed.

Any idea how to fix it? Nixpkgs PR:

I ran into this while working on the Swift 6 update. There are some headers that need to be copied for Swift to C++ interoperability to work. If someone wants to cherry-pick it onto the current derivation, I think this is it.

1 Like