J'ai un projet qui n'a pas été divisé en bibliothèques, mais la source est organisée dans une arborescence de répertoires. Je ne sais pas comment dire à cmake de descendre un répertoire, puis d’ajouter la source dans ce répertoire au projet défini dans le répertoire parent. J'ai tenté ce qui suit:
dans project/source/CMakelists.txt:
set(SOURCE
${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
)
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})
puis dans project/source/folder1/CMakeLists.txt:
set(SOURCE
${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
${HEADERS}
${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)
en utilisant certaines instructions message (), j'ai constaté que le dossier enfant obtiendrait le contenu de la variable SOURCE, mais sa nouvelle affectation à cette variable ne sera pas conservée lors du renvoi au fichier parent CMakeLists.txt.
La recherche d’exemples et du didacticiel de cmake m’a amené à conclure que: - Les structures de fichier source sont généralement plates dans un projet - Si le code est divisé en dossiers, il est généralement divisé en bibliothèques correspondantes.
Je me demande s’il existe certaines «meilleures pratiques» dont je me détourne en essayant cette structure.
Comme dans la deuxième partie de la réponse de arrowdodger, on peut lire: dans project/source/folder1/CMakeLists.txt:
set(SOURCE
${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
PARENT_SCOPE
)
set(HEADERS
${HEADERS}
${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
PARENT_SCOPE
)
Ne pouvez-vous pas simplement définir toutes vos sources dans project/source/CMakelists.txt?
Quoi qu'il en soit, vous avez besoin de l’option PARENT_SCOPE
ou CACHE
de la commande set .
Depuis CMake 3.1, il existe un nouveau moyen d’ajouter une source à partir de sous-répertoires: target_sources
Disons que vous avez root_dir et root_dir/sub_dir et les fichiers source dans les deux cas. Avec target_sources, vous pouvez faire ceci:
Dans root_dir/CMakeLists.txt, définissez la cible
add_library(some_target main.cpp)
add_subdirectory(sub_dir)
Dans root_dir/sub_dir/CMakeLists.txt, ajoutez des sources:
target_sources(some_target PRIVATE more_cool_stuff.cpp)
some_target contiendra désormais les deux fichiers source.
Il est également possible d'utiliser d'autres commandes dans rép_racine/rép_base/CMakeLists.txt en utilisant some_target, par exemple target_compile_definitions, ce qui est très pratique.
J'ai appris sur target_sources ici, jetez-y un œil si vous voulez plus d'explications et d'exemples