Skip to content

Invalid Dynamic Dependency files are being produced from language C++ 20 or later programs #25378

@MarcosASandoval

Description

@MarcosASandoval

On Windows

Description

Version of emscripten/emsdk:
Output of emcc -v

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.15 (09f52557f0d48b65b8c724853ed8f4e8bf80e669)
clang version 22.0.0git (https:/github.com/llvm/llvm-project 3388d40684742e950b3c5d1d2dafe5a40695cfc1)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: C:\Users\user\emsdk\upstream\bin

Failing command line in full:
cmake --build .\out -v and emmake cmake --build .\out -v produce the same results

Output

Change Dir: 'D:/emscriptenDebug/out'

Run Build Command(s): C:/Users/user/AppData/Local/Microsoft/WinGet/Links/ninja.exe -v
[1/4] C:\WINDOWS\system32\cmd.exe /C ""C:/Users/user/emsdk/upstream/emscripten/emscan-deps" -format=p1689 -- C:\Users\user\emsdk\upstream\emscripten\em++.bat   -std=gnu++23 -x c++ D:/emscriptenDebug/demoApp.cpp -c -o CMakeFiles\demoApp.dir\demoApp.cpp.o -MT CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi -MD -MF CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi.d > CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi.tmp && "C:/Program Files/CMake/bin/cmake.exe" -E rename CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi.tmp CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi"
[2/4] "C:\Program Files\CMake\bin\cmake.exe" -E cmake_ninja_dyndep --tdi=CMakeFiles\demoApp.dir\CXXDependInfo.json --lang=CXX --modmapfmt=clang --dd=CMakeFiles/demoApp.dir/CXX.dd @CMakeFiles/demoApp.dir/CXX.dd.rsp
FAILED: [code=1] CMakeFiles/demoApp.dir/CXX.dd CMakeFiles/demoApp.dir/CXXModules.json CMakeFiles/demoApp.dir/demoApp.cpp.o.modmap
"C:\Program Files\CMake\bin\cmake.exe" -E cmake_ninja_dyndep --tdi=CMakeFiles\demoApp.dir\CXXDependInfo.json --lang=CXX --modmapfmt=clang --dd=CMakeFiles/demoApp.dir/CXX.dd @CMakeFiles/demoApp.dir/CXX.dd.rsp
CMake Error: -E cmake_ninja_dyndep failed to parse CMakeFiles/demoApp.dir/demoApp.cpp.o.ddi* Line 1, Column 3
  Syntax error: value, object or array expected.

CMake Error: -E cmake_ninja_dyndep failed to parse ddi file CMakeFiles/demoApp.dir/demoApp.cpp.o.ddi
ninja: build stopped: subcommand failed.

Steps to reproduce

  1. Run command emcmake cmake . -B out -G Ninja:
    Output
configure: cmake . -B out -G Ninja '-DCMAKE_TOOLCHAIN_FILE=C:\Users\user\emsdk\upstream\emscripten\cmake\Modules\Platform\Emscripten.cmake' -DCMAKE_CROSSCOMPILING_EMULATOR=C:/Users/user/emsdk/node/22.16.0_64bit/bin/node.exe
-- Configuring done (0.5s)
-- Generating done (0.0s)
-- Build files have been written to: D:/emscriptenDebug/out
  1. Run build command cmake --build .\out -v or emmake cmake --build .\out -v
  2. Receive above error

Minimal project setup

Root directory D:\emscriptenDebug\

Contents of file .\demoApp.cpp:

#include <iostream>

int main() {
    std::cout << "Hello World!" << std::endl;
}

Contents of file .\CMakeLists.txt:

cmake_minimum_required (VERSION 4.0)

project(
  emscriptenDebug
  VERSION 0.1
  DESCRIPTION "Minimal example project"
  LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 23)

add_executable(demoApp "demoApp.cpp")

Synopsis

Invalid DDI files are being produced in the output. There is a blank line, in this case's single .ddi file, followed by a line listing the output directory and a set of parentheses.

Removing this second line, D:\emscriptenDebug\out>(), and rerunning the build command produces a demoApp.wasm file and a demoApp.js file. Subsequent changes to demoApp.cpp will cause Ninja to rebuild and reproduce the invalid .ddi, causing the build to fail.

Invalid DDI file:

emscripten build generated file .\out\CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi:


D:\emscriptenDebug\out>() 
{
  "revision": 0,
  "rules": [
    {
      "primary-output": "CMakeFiles\\demoApp.dir\\demoApp.cpp.o"
    }
  ],
  "version": 1
}

Valid DDI file

Running the configure, step 1 above, without the emcmake prefix, ie cmake . -B out -G Ninja followed by step 2 generates a properly formed DDI file. Builds succeed for this configuration.

Contents of CMake only generated file, .\out\CMakeFiles\demoApp.dir\demoApp.cpp.obj.ddi:

{
    "version": 1,
    "revision": 0,
    "rules": [
        {
            "primary-output": "CMakeFiles\\demoApp.dir\\demoApp.cpp.obj",
            "outputs": [
                "CMakeFiles\\demoApp.dir\\demoApp.cpp.obj.ddi"
            ],
            "requires": []
        }
    ]
}

Might also be worth mentioning that the output filenames differ slightly:

  • .\out\CMakeFiles\demoApp.dir\demoApp.cpp.o.ddi for the emscripten configured build vs
  • .\out\CMakeFiles\demoApp.dir\demoApp.cpp.obj.ddi CMake configured build

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions