[CMake] Forcing a target to be built if another target is built
Robert Maynard
robert.maynard at kitware.com
Thu May 17 09:50:03 EDT 2018
That is roughly what I am saying. In my head you had a layout that looked
like
-> root_dir
--> module_A
--> tests_A
--> module_B
--> tests_B
So while it is tedious to have module_A explicitly add tests_A it would be
a possible solution. The problem is one of graph building. Currently the
CMake 'all' graph properly represents building the active module and all
dependencies it needs. Separately you have a pool of smaller graphs that
represent all tests and targets that are from sub-directories that had
EXCLUDE_FROM_ALL applied. Nothing is quickly coming to me that will allow
you to add more components to the 'all' graph after the fact.
On Thu, May 17, 2018 at 6:19 AM Job Noorman <job at noorman.info> wrote:
> I'm not sure I completely understand what you mean but I think your
> suggestion would be to list *all* needed subdirectories in the active
> project. This is not what a want. The active project simply lists its
> *direct* dependencies (via target_link_libraries) and CMake then figures
> out all the needed transitive dependencies.
>
> Please correct me if i missed your point :-)
>
>
> On 15/05/18 23:29, Robert Maynard wrote:
> >
> > Have you thought about not doing anything in the root CMakeLists for
> > your testing directories but instead inside the active project you use
> > add_subdirectory ( it supports relative paths to handle directories
> > not physically nested inside it ).
> >
> > On Wed, May 9, 2018 at 8:56 AM Job Noorman <job at noorman.info
> > <mailto:job at noorman.info>> wrote:
> >
> > Hi all,
> >
> > We have a large codebase consisting of 200+ modules. Each module is
> > defined in its own subdirectory and compiled as a static library.
> >
> > These modules are not final products on their own but are combined to
> > create "projects". We have about 15 projects that all use a subset of
> > the modules to implement their functionality. The projects are
> > independent in the sense that they cannot be built together; when
> > running cmake, we select the project to build.
> >
> > To ensure that only the modules that are needed by the selected
> > project
> > are built, we took the following approach: all modules have a common
> > root directory which is included using add_subdirectory with the
> > EXCLUDE_FROM_ALL flag. Then, the current project's root directory is
> > added without this flag. This ensures that the targets defined by the
> > project and the modules that they need (but no other) are added to
> > the
> > build system. This works very well and is much nicer than having to
> > define options for all optional modules to be able to disable them.
> >
> > There is one catch, however: each module defines an executable
> > that runs
> > its unit tests. What should happen is that if a module is built by a
> > project, its unit tests are also built. However, there seems to be no
> > way to define this relationship in CMake. What we would like to
> > express
> > is that "if library A is built, then executable ATest should also be
> > built". Since ATest obviously links against A, we cannot use
> > add_dependencies(A ATest) since this creates a circular dependency
> > between an executable and a library.
> >
> > Note that the "option" approach briefly mentioned above would
> > allow us
> > to express this but this would be completely unwieldy in our case.
> >
> > Is there currently a way in CMake to express this relation between a
> > library and an executable?
> >
> > If not, would the following suggestion make sense?: A target property
> > "INTERFACE_DEPENDENCIES" could be added that would set the
> > MANUALLY_ADDED_DEPENDENCIES target property of dependents. Setting
> > this
> > property on A with ATest as value would then solve my problem
> > (note that
> > I proposed adding this property for a different use case here:
> > https://gitlab.kitware.com/cmake/cmake/issues/14633).
> >
> > Regards,
> > Job
> >
> > --
> >
> > Powered by www.kitware.com <http://www.kitware.com>
> >
> > Please keep messages on-topic and check the CMake FAQ at:
> > http://www.cmake.org/Wiki/CMake_FAQ
> >
> > Kitware offers various services to support the CMake community.
> > For more information on each offering, please visit:
> >
> > CMake Support: http://cmake.org/cmake/help/support.html
> > CMake Consulting: http://cmake.org/cmake/help/consulting.html
> > CMake Training Courses: http://cmake.org/cmake/help/training.html
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Follow this link to subscribe/unsubscribe:
> > https://cmake.org/mailman/listinfo/cmake
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180517/391b5cd0/attachment-0001.html>
More information about the CMake
mailing list