web-dev-qa-db-fra.com

Ajouter automatiquement tous les fichiers d'un dossier à une cible à l'aide de CMake?

J'envisage de basculer un projet multiplateforme de systèmes de gestion de génération distincts dans Visual C++, XCode et makefiles vers CMake.

Une fonctionnalité essentielle dont j'ai besoin est d'ajouter automatiquement tous les fichiers d'un répertoire à une cible. Bien que ce soit facile à faire avec make, ce n'est pas facilement faisable avec Visual C++ et XCode (corrigez-moi si je me trompe). Est-il possible de le faire directement dans CMake? Comment?

138
martjno

C'est possible. Par exemple. avec file(GLOB:

cmake_minimum_required(VERSION 2.8)

file(GLOB helloworld_SRC
    "*.h"
    "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})

Notez que cela nécessite manuel la relance de cmake si un fichier source est ajouté ou supprimé, car le système de compilation généré ne sait pas quand demander à CMake de se régénérer, et le faire à chaque construction augmenterait le temps de construction.

196
Kleist

La réponse de Kleist fonctionne certes, mais il y a une mise en garde importante:

Lorsque vous écrivez manuellement Makefile, vous pouvez générer une variable SRCS à l'aide d'une fonction permettant de sélectionner tous les fichiers .cpp Et .h. Si un fichier source est ajouté ultérieurement, la réexécution de make l'inclura.

Cependant, CMake (avec une commande telle que file(GLOB ...)) générera explicitement une liste de fichiers et la placera dans le Makefile généré automatiquement. Si vous avez un nouveau fichier source, vous devrez régénérer le Makefile en réexécutant cmake.

edit: Pas besoin de supprimer le Makefile.

30
kara deniz