Skip to content

Fix duplicate source files on Windows due to mixed path separators (#3070)#3114

Open
hariprakazz wants to merge 2 commits intodlang:masterfrom
hariprakazz:fix-3081
Open

Fix duplicate source files on Windows due to mixed path separators (#3070)#3114
hariprakazz wants to merge 2 commits intodlang:masterfrom
hariprakazz:fix-3081

Conversation

@hariprakazz
Copy link
Copy Markdown
Contributor

On Windows, when mainSourceFile is set with forward slashes (e.g. "src/foo.d")
but the same file gets collected from sourcePaths with backslashes ("src\foo.d"),
they end up as two separate entries — causing a duplicate main source file error.

This fix normalizes all source file paths using buildNormalizedPath before
deduplication, so mixed separators are treated as the same file.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 10, 2026

✅ PR OK, no changes in deprecations or warnings

Total deprecations: 0

Total warnings: 0

Build statistics:

 statistics (-before, +after)
 executable size=5710288 bin/dub
-rough build time=70s
+rough build time=69s
Full build output
DUB version 1.41.0, built on Mar  1 2026
LDC - the LLVM D compiler (1.42.0):
  based on DMD v2.112.1 and LLVM 21.1.8
  built with LDC - the LLVM D compiler (1.42.0)
  Default target: x86_64-unknown-linux-gnu
  Host CPU: znver4
  https://dlang.org - https://wiki.dlang.org/LDC


  Registered Targets:
    aarch64     - AArch64 (little endian)
    aarch64_32  - AArch64 (little endian ILP32)
    aarch64_be  - AArch64 (big endian)
    amdgcn      - AMD GCN GPUs
    arm         - ARM
    arm64       - ARM64 (little endian)
    arm64_32    - ARM64 (little endian ILP32)
    armeb       - ARM (big endian)
    avr         - Atmel AVR Microcontroller
    bpf         - BPF (host endian)
    bpfeb       - BPF (big endian)
    bpfel       - BPF (little endian)
    hexagon     - Hexagon
    lanai       - Lanai
    loongarch32 - 32-bit LoongArch
    loongarch64 - 64-bit LoongArch
    mips        - MIPS (32-bit big endian)
    mips64      - MIPS (64-bit big endian)
    mips64el    - MIPS (64-bit little endian)
    mipsel      - MIPS (32-bit little endian)
    msp430      - MSP430 [experimental]
    nvptx       - NVIDIA PTX 32-bit
    nvptx64     - NVIDIA PTX 64-bit
    ppc32       - PowerPC 32
    ppc32le     - PowerPC 32 LE
    ppc64       - PowerPC 64
    ppc64le     - PowerPC 64 LE
    r600        - AMD GPUs HD2XXX-HD6XXX
    riscv32     - 32-bit RISC-V
    riscv64     - 64-bit RISC-V
    sparc       - Sparc
    sparcel     - Sparc LE
    sparcv9     - Sparc V9
    spirv       - SPIR-V Logical
    spirv32     - SPIR-V 32-bit
    spirv64     - SPIR-V 64-bit
    systemz     - SystemZ
    thumb       - Thumb
    thumbeb     - Thumb (big endian)
    ve          - VE
    wasm32      - WebAssembly 32-bit
    wasm64      - WebAssembly 64-bit
    x86         - 32-bit X86: Pentium-Pro and above
    x86-64      - 64-bit X86: EM64T and AMD64
    xcore       - XCore
    xtensa      - Xtensa 32
   Upgrading project in /home/runner/work/dub/dub/
    Starting Performing "release" build using /opt/hostedtoolcache/dc/ldc2-1.42.0/x64/ldc2-1.42.0-linux-x86_64/bin/ldc2 for x86_64.
    Building dub 1.42.0-beta.1+commit.9.g11bd266a: building configuration [application]
     Linking dub
STAT:statistics (-before, +after)
STAT:executable size=5710288 bin/dub
STAT:rough build time=69s

@hariprakazz
Copy link
Copy Markdown
Contributor Author

All Windows CI runs passed. The two Alpine failures appear to be pre-existing
infrastructure issues unrelated to this change. Ready for review when you get a chance!

Copy link
Copy Markdown
Contributor

@thewilsonator thewilsonator left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs a test case for the suite, otherwise looks fine.

Comment thread source/dub/compilers/buildsettings.d
Comment thread source/dub/compilers/buildsettings.d
@hariprakazz
Copy link
Copy Markdown
Contributor Author

Thanks for the review! I'll add a test case. The extra diff is from a previous
PR (#3081) that's already merged into master — I've prepared a clean branch
with only this fix. Should I open a new PR or force push to clean this one up?

@thewilsonator
Copy link
Copy Markdown
Contributor

Force push, and squash unless there is a reason for those extra commits

@hariprakazz
Copy link
Copy Markdown
Contributor Author

Force pushed a single clean commit rebased on current master. I’ll add a test case next.

@hariprakazz
Copy link
Copy Markdown
Contributor Author

Added the test case for #3070. Also closing #3115.

@hariprakazz
Copy link
Copy Markdown
Contributor Author

All CI checks are passing on Windows, Ubuntu, and macOS. The Alpine and macOS-13 failures are pre-existing infrastructure issues - same ones that failed before my changes. Ready for review!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants