dub
dub copied to clipboard
LDC: Apply dflags affecting symbol visibility to all deps
~~On Windows.~~
✅ PR OK, no changes in deprecations or warnings
Total deprecations: 0
Total warnings: 0
Build statistics:
statistics (-before, +after)
executable size=5318488 bin/dub
-rough build time=61s
+rough build time=62s
Full build output
DUB version 1.35.1, built on Jan 6 2024
LDC - the LLVM D compiler (1.36.0):
based on DMD v2.106.1 and LLVM 17.0.6
built with LDC - the LLVM D compiler (1.36.0)
Default target: x86_64-unknown-linux-gnu
Host CPU: znver3
http://dlang.org - http://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
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
Upgrading project in /home/runner/work/dub/dub/
Starting Performing "release" build using /opt/hostedtoolcache/dc/ldc2-1.36.0/x64/ldc2-1.36.0-linux-x86_64/bin/ldc2 for x86_64.
Building dub 1.36.0-beta.1+commit.41.g2f121b3b: building configuration [application]
Linking dub
STAT:statistics (-before, +after)
STAT:executable size=5318488 bin/dub
STAT:rough build time=62s
Example scenarios:
- If an .exe is linked against druntime/Phobos DLLs (e.g., to enable loading other D DLLs, all sharing central druntime/Phobos), all static-lib dub dependencies need to be compiled with
-dllimport=defaultLibsOnlytoo [the default with-link-defaultlib-shared]. - To make large DLLs with few selective
exported symbols work after #2412, the implicit flags need to be overridden - for the DLL itself and all its static-lib dependencies. This can currently only be accomplished by setting theDFLAGSenvironment variable. This PR enables overriding thesedflagseither in the DLL root project/config directly, or in some dependency shared by multiple DLLs/executables. E.g., at Symmetry, we have an .exe with lots of plugin DLLs. All plugins and the .exe have a shared dependency, so addingdflags "-fvisibility=hidden" "-dllimport=defaultLibsOnly" platform="windows-ldc"once in thedub.sdlof that shared dependency suffices to compile everything with those required flags.
TODO:
- Tests
- Decide whether this should be Windows only, or whether
-fvisibilityshould be handled identically on Posix platforms, enabling to use hidden visibility for all static-lib deps of some .so/dylib too.
FYI @rikkimax @p0nce
Would be super nice to be able to get rid of DFLAGS tweaking! Thanks.
Our flags are:
"dflags-windows-ldc": ["-mscrtlib=libcmt","-fvisibility=hidden", "-link-defaultlib-shared=false"], (in adddition to the DFLAGS override as current workaround)
Does -mscrtlib need to be passed through too?
Does
-mscrtlibneed to be passed through too?
Nope, that flag really only affects linking, not compilation. And I think LDC defaults to static libcmt with -link-defaultlib-shared=false, for DLLs too [if an MSVC installation is found].
My one concern (apart from code review), is that this would be better suited to be handled from a pretty significant refactor in the form of placing directives to have the relationship to other packages of just this, goes up, goes down. But since this would be the default, its still a good PR in theory.
no longer draft? in that case also adjust title pls
Rebased, changelog entry added, and not passing stuff down to shared-library deps.
While I fully agree that there would ideally be a generic way of controlling the flags propagation, this automatism solves a number of use cases which can currently only be handled by setting the DFLAGS env variable. As DMD seems to be adopting the relevant LDC switches (-fvisibility and -dllimport), the approach could eventually be generalized to DMD too. GDC has -fvisibility already, so we could include it already (but the main use cases are on Windows).