[cmake-developers] External projects & library dependencies

Roger Leigh rleigh at codelibre.net
Tue Apr 11 17:27:56 EDT 2017


On 11/04/2017 18:24, Wouter Klouwen wrote:
> On 11/04/17 18:00, Brad King wrote:
>> On 04/11/2017 12:33 PM, Wouter Klouwen wrote:
>>> So in order to create a mega project I want to put all of the third
>>> party packages into the build system using ExternalProject_Add.
>>> This function does provide for targets in terms of build dependencies,
>>> but this isn't quite enough. I need these packages to convey information
>>> in the same way as was done through pkg-config files and provide
>>> COMPILE_OPTIONS, INCLUDE_DIRECTORIES and LINK_LIBRARIES.
>>>
>>> All of this information is present once the ExternalProject is built as
>>> it would be possible to invoke pkg-config afterwards. This is of course
>>> too late for CMake to resolve this information at configure/build rule
>>> creation time.
>>>
>>> Is there a better way of solving this other than effectively duplicating
>>> the information in the pkg-config files so that CMake can read it at
>>> generation time?
>>
>> Make your outer project a "superbuild" that does not compile anything
>> itself but instead just uses ExternalProject_Add to build everything
>> else in dependency order.  That way each project won't configure until
>> all its dependencies are built.
>
> Unfortunately this isn't really an option for us. There's a non trivial
> amount of third party packages that take a non trivial amount of time to
> compile.
> Waiting for all of these to compile while not yet starting on our own
> projects would create a very long critical path before the build could
> fan out for all targets. This would have a detrimental impact on our
> build performance.

That's not an insurmountable problem.  If your projects are buildable in 
parallel with the third-party sources, you can add each third-party
source, plus each first-party project, as a separate external project
and then build the entire collection in parallel.

The only thing that's changed with the superbuild vs a completely 
self-contained project is the location of the higher-level organisation. 
  With the superbuild, that is moved out into a separate project which 
coordinates the building of everything with appropriate inter-project 
dependencies.


Regards,
Roger


More information about the cmake-developers mailing list