[CMake] preventing redundant compilations
Michael Wild
themiwi at gmail.com
Thu Mar 19 09:25:06 EDT 2009
On 19. Mar, 2009, at 1:09, Alexander Neundorf wrote:
> On Thursday 19 March 2009, Philip Lowman wrote:
>> On Wed, Mar 18, 2009 at 7:05 PM, Alexander Neundorf
>> <a.neundorf-work at gmx.net
>>
>>> wrote:
>>>
>>> On Wednesday 18 March 2009, Denis Scherbakov wrote:
>>>> You could do the following:
>>>>
>>>> ADD_LIBRARY(intermediate STATIC a.cpp)
>>>>
>>>> ADD_LIBRARY(foo b.cpp)
>>>> TARGET_LINK_LIBRARIES(foo intermediate)
>>>>
>>>> ADD_LIBRARY(bar c.cpp)
>>>> TARGET_LINK_LIBRARIES(bar intermediate)
>>>
>>> That's not portable if bar and foo are shared libraries.
>>> See it as a feature that cmake recognizes that these files have to
>>> be
>>> compiled
>>> separately for separate targets, since separate targets may have
>>> other
>>> compile flags etc, so may need different object files.
>>
>> In theory the Makefile generator could be adapted to share object
>> files
>> across targets provided all the compilation flags are the same.
>> This would
>> obviously take time and introduce additional complexity. It would
>> also be
>> of limited benefit since usually source files are not compiled in
>> more than
>> one library or executable.
>>
>> Also, in theory you could reuse object files compiled for a shared
>> library
>> (with -fPIC) in static libraries (on certain platforms). Since
>> preprocessor definitions usually always change per target when
>> using shared
>> libraries due to export definitions, however, this would also be of
>> limited
>> benefit.
>
> Basically it would be the same as the so-called "convenience"
> libraries with
> autotools.
> I think there is a feature request for this somewhere in the bug
> tracker.
>
> Alex
If this REALLY is an issue for the OP, he definitely should have a
look at ccache. It not only avoids redundant compilations during a
single build, it also does so after a "make clean". A rather large
code which takes 4-5 hours to compile on my machine can be rebuilt
within 10 minutes using ccache.
This is far better than "convenience libraries" can do, because they
can only work for a single build.
Just my 2 cents...
Michael
More information about the CMake
mailing list