CMake project directory structure

It’s a good idea to breakup project code into distinct subdirectories. It can be useful to have a CMakeLists.txt for each of these directories that are included from the top-level CMakeLists.txt.

Assume a C project with subdirectory io/ and top-level CMakeLists.txt:

project(benchmarks LANGUAGES C)
enable_testing()

add_subdirectory(io)

add_executable(benchIO bench.c)
target_link_libraries(benchIO PRIVATE iohdf)

and in io/CMakeLists.txt:

add_library(iohdf ...)

add_executable(testh5 testh5.c)
target_link_libraries(testh5 PRIVATE iohdf)

add_test(NAME h5io COMMAND testh5)

Build a little test script in io/ directory to test just HDF5 I/O, and compile the whole program from the top level directory, then test the main program and subdirectory libraries:

ctest --test-dir build -V

CMake Directory variables: to refer to the parent project directory use ${PROJECT_SOURCE_DIR}. If using nested projects, ${CMAKE_SOURCE_DIR} refers to the highest level CMakeLists.txt directory

Edit all CMakeLists.txt recursively: on Linux / Unix systems, edit all CMakeLists.txt in a project with a command like

gedit $(find -name CMakeLists.txt)

Related: