[cmake-developers] Build multiple CMake projects

Daniel Pfeifer daniel at pfeifer-mail.de
Mon Mar 27 03:35:59 EDT 2017


On Fri, Mar 24, 2017 at 7:35 PM, <jerry.c.t at web.de> wrote:

> Hi,
>
> I have some CMake projects which depend on each other. They provide Config
> scripts (all generated with the help of CMakePackageConfigHelpers) and the
> CMake projects find there dependencies with find_package(). Even the
> transitive dependencies are correctly modelled (exported to the Config
> scripts with find_dependency).
>
> The setup in general is fine. The only drawback is that I have to build
> and install them manually in the correct order. For example A depends on B
> depends on C, I have to build+install first C, than B, then A ...
>
> The number of projects are getting more and more and it's getting harder
> to build them.
>
> So my question:
> a) Is there a CMake way to generate a dependency graph and build them in
> the correct order, i.e., the same as CMake does within a project with the
> targets but this time on project level?
> b) What possiblities are provided by CMake to support this?
> c) Are there tools you can recommend?
>

Make sure that your projects can be used both as a sub-project and as a
installed package. That means: if the installed package provides a target
called C::C, create an alias target with that name, so that projects A and
B can use that name in target_link_libraries in both cases.
The next thing is to make sure that `find_package(C REQUIRED)` finds the
installed package when it supposed to be used, but does nothing when C is
used as a sub-project. This can be achieved by overriding the
`find_package` command. The original command can be called by prefixing it
with _. Your top-level project might look like this:

set(subprojects A B C)

macro(find_package name)
  if("${name}" IN_LIST subprojects)
    set("${name}_FOUND" TRUE)
  else()
    _find_package("${name}" ${ARGN})
  endif()
endmacro()

add_subdirectory(A)
add_subdirectory(B)
add_subdirectory(C)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20170327/6e0a1229/attachment.html>


More information about the cmake-developers mailing list