Compiling multiple source files --- each file separately, or all together?
David Given
dg at cowlark.com
Sat Dec 27 21:33:56 UTC 2025
On Friday, 26 December 2025 at 14:33:48 UTC, monkyyy wrote:
> Its not the 1970's
Gosh, is it? I did not know that!
On Friday, 26 December 2025 at 16:33:14 UTC, H. S. Teoh wrote:
> The D compiler compiles all source files together. In some
> cases it's able to optimize across files when compiled this
> way, as opposed to when compiled separately (but not
> necessarily so; imported files will still be parsed and
> analysed, just some parts of codegen may not run when the
> imported file isn't listed on the command-line).
>
> This applies to all D compilers.
Excellent, thanks; that's what I was hoping.
It looks like what I'll do is treat it like Java, where groups of
source files are bundled together into compilable units for
dependency management (libraries and the like). The fact that
multiple source files can be compiled into a _single_ `.o` file
may or may not be desirable. I'll have to bundle the `.di` files
as part of the build artifact anyway, so having multiple `.o`
files doesn't complicate anything; is there any benefit to the
compiler to using a single `.o` file? e.g. fewer copies of shared
code?
One thing which looks like it'll complicate matters is the
handling of `.di` files. AFAICT the compiler needs to see them in
specific places so that it can find them, so that the `.di` file
for the package `foo.bar.baz` needs to be in `foo/bar/baz.di`
relative to the search path. But when they're written with `-H`,
the prefix directories aren't written automatically, so I need
`-Hd=$(OBJ)/foo/bar` or the equivalent --- i.e. the build system
needs to know the package path of the file it's compiling.
This is bad for several reasons, not least that it scuppers the
ability to do build files from multiple directories together. I
could parse the source files to find the module line but that's
horrible. Are there any convenient ways around this? e.g. a way I
can tell the compiler where `$(OBJ)` is and have it create any
`foo/bar` as necessary?
Thanks!
More information about the Digitalmars-d
mailing list