The most commonly used rule is “One CMakeLists.txt per target”. So your option No. 1.
To achieve this your project structure may have to adapt, if “each source file from the subfolders creates a separate executable”.
And the root CMakeLists.txt is your starting point and contains the project() command.
It’s important to note that
- CMake will mirror your
add_subdirectory()andCMakeLists.txtdirectory structure in its generated build environment - CMake will create a new variable scope with each
add_subdirectory()call (the big difference to usinginclude()command)
What you should avoid is having to reference source files out of other subdirectories with something like ../some_other_dir/some_other_source.cpp. It shows that your CMake structure is not setup according to the rule of thumb quoted above.
Documentation Extracts
-
CMake:
add_subdirectory()commandAdd a subdirectory to the build. The
source_dirspecifies the directory in which the sourceCMakeLists.txtand code files are located. -
CLion: CMakeLists File
When a project has the complex structure and includes one or more subdirectories (project root and subdirectories), you can create subdirectory
CMakeList.txtfiles. SubdirectoryCMakeLists.txtfiles describe the build, contents, and target rules for a subdirectory. -
C++Now 2017: Daniel Pfeifer “Effective CMake: a random selection of best practices
Directories that contain a
CMakeLists.txtare the entry point for the build system generator. Subdirectories may be added withadd_subdirectory()and must contain aCMakeLists.txttoo.
References
- Embracing Modern CMake
- https://stackoverflow.com/questions/2186110/cmake-tutorial
- CMake with subdirectories
- CMake share library with multiple executables
- Renaming `CMakeLists.txt`