emscripten-core / emscripten-core/emscripten
Invalid Dynamic Dependency files are being produced from language C++ 20 or later programs
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
On Windows
## Description
**Version of emscripten/emsdk:**
Output of `emcc -v`
``` PS1
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**
```ps1
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**
``` PS1
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
```
2. Run build command `cmake --build .\out -v` or `emmake cmake --build .\out -v`
3. Receive above error
## Minimal project setup
Root directory `D:\emscriptenDebug\`
Contents of file `.\demoApp.cpp`:
```cpp
#include
int main() {
std::cout << "Hello World!" << std::endl;
}
```
Contents of file `.\CMakeLists.txt`:
```cmake
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
Contributor guide
Assessment
This issue has not been assessed yet.