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

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

Reply via email to