<div dir="ltr"><div><br></div><div>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 ). </div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, May 9, 2018 at 8:56 AM Job Noorman <<a href="mailto:job@noorman.info">job@noorman.info</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
We have a large codebase consisting of 200+ modules. Each module is <br>
defined in its own subdirectory and compiled as a static library.<br>
<br>
These modules are not final products on their own but are combined to <br>
create "projects". We have about 15 projects that all use a subset of <br>
the modules to implement their functionality. The projects are <br>
independent in the sense that they cannot be built together; when <br>
running cmake, we select the project to build.<br>
<br>
To ensure that only the modules that are needed by the selected project <br>
are built, we took the following approach: all modules have a common <br>
root directory which is included using add_subdirectory with the <br>
EXCLUDE_FROM_ALL flag. Then, the current project's root directory is <br>
added without this flag. This ensures that the targets defined by the <br>
project and the modules that they need (but no other) are added to the <br>
build system. This works very well and is much nicer than having to <br>
define options for all optional modules to be able to disable them.<br>
<br>
There is one catch, however: each module defines an executable that runs <br>
its unit tests. What should happen is that if a module is built by a <br>
project, its unit tests are also built. However, there seems to be no <br>
way to define this relationship in CMake. What we would like to express <br>
is that "if library A is built, then executable ATest should also be <br>
built". Since ATest obviously links against A, we cannot use <br>
add_dependencies(A ATest) since this creates a circular dependency <br>
between an executable and a library.<br>
<br>
Note that the "option" approach briefly mentioned above would allow us <br>
to express this but this would be completely unwieldy in our case.<br>
<br>
Is there currently a way in CMake to express this relation between a <br>
library and an executable?<br>
<br>
If not, would the following suggestion make sense?: A target property <br>
"INTERFACE_DEPENDENCIES" could be added that would set the <br>
MANUALLY_ADDED_DEPENDENCIES target property of dependents. Setting this <br>
property on A with ATest as value would then solve my problem (note that <br>
I proposed adding this property for a different use case here: <br>
<a href="https://gitlab.kitware.com/cmake/cmake/issues/14633" rel="noreferrer" target="_blank">https://gitlab.kitware.com/cmake/cmake/issues/14633</a>).<br>
<br>
Regards,<br>
Job<br>
<br>
-- <br>
<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" rel="noreferrer" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
<br>
Kitware offers various services to support the CMake community. For more information on each offering, please visit:<br>
<br>
CMake Support: <a href="http://cmake.org/cmake/help/support.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/support.html</a><br>
CMake Consulting: <a href="http://cmake.org/cmake/help/consulting.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/consulting.html</a><br>
CMake Training Courses: <a href="http://cmake.org/cmake/help/training.html" rel="noreferrer" target="_blank">http://cmake.org/cmake/help/training.html</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="https://cmake.org/mailman/listinfo/cmake" rel="noreferrer" target="_blank">https://cmake.org/mailman/listinfo/cmake</a><br>
</blockquote></div>