[CMake] modularizing, specifying dependencies in a project
Robert Maynard
robert.maynard at kitware.com
Wed Jan 3 14:16:41 EST 2018
You will want to use add_subdirectory instead of include in the root
CMakeLists.txt and remove all include statements from ModA and ModB
It total the changes needed to get everything to work are:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e611a37..b6968c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,9 @@
cmake_minimum_required(VERSION 3.0)
project(test_project)
-include(${CMAKE_CURRENT_LIST_DIR}/ModA/CMakeLists.txt)
-include(${CMAKE_CURRENT_LIST_DIR}/ModB/CMakeLists.txt)
+add_subdirectory(ModA)
+add_subdirectory(ModB)
+add_subdirectory(ModC)
add_executable(main main.cpp)
target_link_libraries(main
diff --git a/ModA/CMakeLists.txt b/ModA/CMakeLists.txt
index 87128d8..4931be6 100644
--- a/ModA/CMakeLists.txt
+++ b/ModA/CMakeLists.txt
@@ -1,5 +1,4 @@
-include(${CMAKE_CURRENT_LIST_DIR}/../ModC/CMakeLists.txt)
-add_library(ModA $CMAKE_CURRENT_LIST_DIR}/a.cpp)
+add_library(ModA a.cpp)
target_link_libraries(ModA
PRIVATE
ModC)
diff --git a/ModB/CMakeLists.txt b/ModB/CMakeLists.txt
index 3a31be9..7f83856 100644
--- a/ModB/CMakeLists.txt
+++ b/ModB/CMakeLists.txt
@@ -1,4 +1,3 @@
-include(${CMAKE_CURRENT_LIST_DIR}/../ModC/CMakeLists.txt)
add_library(ModB b.cpp)
target_link_libraries(ModB
On Wed, Jan 3, 2018 at 1:46 PM, Geogin Varghese <geogin at gmail.com> wrote:
> Hello,
>
> Recently came across these presentations on cmake:
>
> Using Modern CMake Patterns to Enforce a Good Modular Design
> (https://www.youtube.com/watch?v=bsXLMQ6WgIk)
> Effective CMake
> (https://www.youtube.com/watch?v=eC9-iRN2b04)
>
> They encourage using target_* command variants for scripting
> CMakeLists.txt.
>
> What would be the recommended way of writing build scripts for a
> repository structured as below. The application is compiled from three
> modules with a dependency among the modules as in the ascii diagram.
>
> Is it possible to distribute compile info, such that each submodule has
> a CMakeLists.txt that describes sources, include and link dependencies needed
> to compile that module.
>
> ---------------------------------------
> .
> ├── main.cpp
> ├── ModA
> ├── ModB
> ├── ModC
>
> Dependency relation:
> --------------------
> +--------+
> +->+main.cpp+<-+
> | +--------+ |
> | |
> | |
> | |
> +----+ +----+
> |ModA| |ModB|
> +----+ +----+
> ^ ^
> | |
> | +----+ |
> +----+ModC+----+
> +----+
>
> ModA <- ModC: Module A
> depends on Module C
> ---------------------------------------
>
> My naive effort to do this can be found here:
> https://github.com/vargheseg/test
>
> The problem I run into is with describing the dependency relation
> between ModA, ModB and ModC.
>
> Details:
> .
> ├── CMakeLists.txt
> ├── main.cpp
> ├── ModA
> │ ├── a.cpp
> │ └── CMakeLists.txt
> ├── ModB
> │ ├── b.cpp
> │ └── CMakeLists.txt
> ├── ModC
> │ ├── c.cpp
> │ └── CMakeLists.txt
>
> - CMakeLists.txt in the child directories describe compilation
> information for that directory.
> - The top level directory includes the CMakeLists.txt from
> subdirectories.
> - Cmake buildfile generation fails because the way I set things up; the
> top level CMakeLists.txt ends up including ModC/CMakeLists.txt twice.
>
> ---
> CMakeLists.txt
> ---
> cmake_minimum_required(VERSION 3.0)
> project(test_project)
>
> include(${CMAKE_CURRENT_LIST_DIR}/ModA/CMakeLists.txt)
> include(${CMAKE_CURRENT_LIST_DIR}/ModB/CMakeLists.txt)
>
> add_executable(main main.cpp)
> target_link_libraries(main PRIVATE ModA ModB)
>
>
> ---
> ModA/CMakeLists.txt
> ---
> include(${CMAKE_CURRENT_LIST_DIR}/../ModC/CMakeLists.txt)
> add_library(ModA $CMAKE_CURRENT_LIST_DIR}/a.cpp)
> target_link_libraries(ModA PRIVATE ModC)
>
>
> ---
> ModB/CMakeLists.txt
> ---
> include(${CMAKE_CURRENT_LIST_DIR}/../ModC/CMakeLists.txt)
> add_library(ModB b.cpp)
> target_link_libraries(ModB
> PRIVATE
> ModC)
>
> Is this way of structuring a project a supported use case?
> --
>
> 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
More information about the CMake
mailing list