web-dev-qa-db-fra.com

comment utiliser le fichier CMake (GLOB SRCS *.) avec un répertoire de construction

c'est mon fichier CMakeLists.txt actuel 

cmake_minimum_required(VERSION 3.3)
set(CMAKE_C_FLAGS " -Wall -g ")
project( bmi )
file( GLOB SRCS *.cpp *.h )
add_executable( bmi ${SRCS}) 

Cela se construit à partir de mon répertoire source, mais je dois nettoyer tous les fichiers supplémentaires après. Ma question est la suivante: comment puis-je générer cela à partir d'un répertoire de construction si tous mes fichiers source se trouvent dans le même répertoire source? 

merci 

6
Will Meyers

Si vous avez vraiment besoin d'utiliser un fichier (GLOB…), ce CMakeLists.txt devrait fonctionner:

cmake_minimum_required(VERSION 3.3)
project(bmi)
add_definitions("-Wall" "-g")
include_directories(${PROJECT_SOURCE_DIR})
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
add_executable(bmi ${SRC_FILES})

Dans ce cas, vous devez lancer cmake à partir de votre répertoire de construction chaque fois que vous ajoutez ou supprimez un fichier source:

cmake <your_source_dir> -G <your_build_generator>

Comme Phil le rappelle, la documentation de CMake ne recommande pas cette utilisation de GLOB. Mais il y a des exceptions. Vous obtiendrez plus d'informations sur ce post

Si vous ne rencontrez pas ces exceptions, vous préféreriez répertorier vos fichiers source plutôt que d'utiliser GLOB:

set(SRC_FILES ${PROJECT_SOURCE_DIR}/main.cpp
              ${PROJECT_SOURCE_DIR}/bmi.cpp
              … )

NB: si vous avez #include de vos fichiers .h dans des fichiers .cpp, je ne vois aucune raison de les mettre dans add_executable, il vous suffit de spécifier le répertoire include avec include_directories.

3
cromod

Ce n'est pas une réponse à votre question, mais je ne pouvais pas formater ceci correctement dans un commentaire. Dans la documentation cmake

Remarque: nous vous déconseillons d'utiliser GLOB pour collecter une liste de fichiers source à partir de votre arborescence. Si aucun fichier CMakeLists.txt ne change lors de l'ajout ou de la suppression d'une source, le système de génération généré ne sait pas quand demander à CMake de se régénérer.

0
Phil