Incremental compilation with DMD
Walter Bright
newshound1 at digitalmars.com
Sun Sep 13 00:55:40 PDT 2009
Tom S wrote:
> Walter Bright wrote:
>> Tom S wrote:
>>> Walter Bright wrote:
>>>> I don't really understand why the -lib approach is not working for
>>>> your needs.
>>>
>>> I'm not sure what you mean by "the -lib approach". Just how do you
>>> exactly apply it to incremental compilation? If my project has a few
>>> hundred modules and I change just one line in one function, I don't
>>> want to rebuild it with -lib all again. I thought you were referring
>>> to the proof-of-concept incremental build tool I posted yesterday
>>> which used -multiobj, as it should be possible to optimize it using
>>> -lib... I just haven't tried that yet.
>>
>> You only have to build one source file with -lib, not all of them.
>
> So you mean compiling each file separately?
Yes. Or a subset of the files.
> That's only an option if we
> turn to the C/C++ way of doing projects - using .di files just like C
> headers - *everywhere*. Only then can changes in .d files be localized
> to just one module and compiled quickly. Java and C# do without header
> files because (to my knowledge) they have no means of changing what's
> compiled based on the contents of an imported module (basically they
> lack metaprogramming).
>
> So we could give up and do it the C/C++ way with lots of duplicated code
> in headers (C++ is better here with allowing you to only implement
> methods of a class in the .cpp file instead of rewriting the complete
> class and filling in member functions, like the .d/.di approach would
> force) or we might have an incremental build tool that doesn't suck.
>
> This is the picture as I see it:
>
> * I need to rebuild all modules that import the changed modules, because
> some code in them might evaluate differently (static ifs on the imported
> modules, for instance - I explained that in my first post in this topic).
>
> * I need to compile them all at once, because compiling each of them in
> succession yields massively long compile times.
>
> * With your suggestion of using -lib, I assumed that you were suggesting
> building all these modules at once into a lib and then figuring out what
> to do with their object files one by one.
>
> * Some object files need to be extracted because otherwise module ctors
> won't be linked into the executable.
>
> * As this is incremental compilation, there will be object files from
> the previous build, some of which should not be linked, because that
> would cause multiple definition errors.
>
> * The obsoleted object files can't be simply removed, since they might
> contain comdat symbols needed by some objects outside of the newly
> compiled set (I gave an example in my first post, but can provide actual
> D code that illustrates this issue). Thus they have to be moved into a
> lib and only pulled into linking on demand.
>
> That's how my experimental build tool maps to the "-lib approach".
What you can try is creating a database that is basically a lib (call it
A.lib) of all the modules compiled with -lib. Then recompile all modules
that depend on changed modules in one command, also with -lib, call it
B.lib. Then for all the obj's in B, replace the corresponding ones in A.
More information about the Digitalmars-d
mailing list