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