Skip to content

[bug] 对象路径按「父目录名+文件名」折叠,不同目录同名源文件冲突(multiple rules generate *.ddi) #233

Description

@Sunrisepeak

现象

对象/扫描产物路径仅由「目标名 + 源文件父目录名 + 文件名」构成,不同目录下的同名源文件(且父目录同名)发生 ninja 规则冲突,构建直接失败:

ninja: error: build.ninja:58: multiple rules generate obj/repro_src/util.cpp.ddi

最小复现(mcpp 0.0.95 / 0.0.96,linux-x86_64)

repro/
├── mcpp.toml
├── a/src/util.cpp      # int fa(){return 1;}
├── b/src/util.cpp      # int fb(){return 2;}
└── src/main.cpp        # int fa(); int fb(); int main(){return fa()+fb()-3;}
[package]
name = "repro"
version = "0.1.0"

[build]
sources = ["a/src/util.cpp", "b/src/util.cpp"]

[targets.repro]
kind = "bin"
main = "src/main.cpp"

mcpp build

ninja: error: build.ninja:58: multiple rules generate obj/repro_src/util.cpp.ddi

build.ninja 中两条 cxx_scan 规则输出同一路径:obj/repro_src/util.cpp.ddi(a/src 与 b/src 的父目录都叫 src,被折叠)。

影响

modules/<mod>/src/*.cpp 是 C/C++ 大型项目的标准布局(OpenCV、LLVM 等)。OpenCV 5.0 的 modules/imgproc/src/utils.cppmodules/imgcodecs/src/utils.cpp 即刻冲突——这是把 OpenCV 5.0 以全源码直编形态引入 mcpp-index(compat.ffmpeg 同款形态)时撞上的。FFmpeg 侥幸不受影响只因它是 per-lib 扁平目录(libavcodec/utils.c 的父目录名互不相同)。

当前 workaround:为每个 TU 生成唯一名转发 stub(gen/tu/<group>/<path__mangled>.cpp #include 原文件)——457 个 stub 文件,纯噪音。

期望

对象路径镜像源文件相对路径(或加入路径 hash),如 obj/<target>/a/src/util.cpp.oobj/<target>/b/src/util.cpp.o

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions