2010-07-08 3 views
106

Je considère le passage d'un projet multiplateforme de systèmes de gestion de construction distincts dans Visual C++, XCode et makefiles à CMake.CMake - Ajouter automatiquement tous les fichiers dans un dossier à une cible?

Une fonctionnalité essentielle dont j'ai besoin est d'ajouter automatiquement tous les fichiers d'un répertoire à une cible. Bien que cela soit facile à faire avec make, il n'est pas facile à faire avec Visual C++ et XCode (corrigez-moi si je me trompe). Est-il possible de le faire directement dans CMake? Comment? N'hésitez pas à ajouter tout ce que je devrais savoir avant d'aller apprendre CMake, étant donné que le projet est actuellement de taille moyenne (8 bibliothèques, 2 exécutables, 8 projets de test et il dépend de 8 bibliothèques externes environ).).

+0

Btw. Dans In Visual Studio, au moins dans les projets C#, un bouton de la barre d'outils de l'explorateur de projet, nommé show, affiche tous les fichiers. Cela rend tous les sous-répertoires d'un projet visibles, grisés s'ils ne contiennent aucun fichier logiquement inclus dans le projet. Vous pouvez inclure ces répertoires via le menu contextuel, qui inclut tous les fichiers sources à l'intérieur, récursivement :) – yeoman

Répondre

154

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 re-fonctionnement de cmake si un fichier source est ajouté ou supprimé, étant donné que le système de construction généré ne sait pas quand demander CMake à se régénérer, et ce faisant à chaque build augmenterait le temps de construction.

+8

Une alternative à la relance manuelle de cmake consiste à toucher le fichier CMakeLists.txt avant d'exécuter make. –

+1

Alternative à 'GLOB': ['fichier (variable GLOB_RECURSE [chemin RELATIVE] [FOLLOW_SYMLINKS] [expressions globbing] ...)'] (https://cmake.org/cmake/help/v3.0/command/ fichier.html). – Hydro

+2

> "Nous ne recommandons pas d'utiliser GLOB pour collecter une liste de fichiers sources de votre arborescence source.Si aucun fichier CMakeLists.txt ne change quand une source est ajoutée ou supprimée, le système de construction généré ne peut pas savoir quand demander à régénérer CMake." Ceci n'est plus recommandé dans les documents CMAKE3.7 liés par Hand1Cloud – triple

27

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

Lorsque vous écrivez un Makefile manuellement, vous pouvez générer une variable SRCS en utilisant une fonction pour sélectionner tous les fichiers .cpp et .h. Si un fichier source est ajouté ultérieurement, la réexécution make l'inclura.

Toutefois, CMake (avec une commande comme 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 générer à nouveau le Makefile en relançant cmake.

edit: Pas besoin de retirer le Makefile.

+4

Est-ce que cmake ne peut pas simplement être relancé, ce qui devrait enlever/modifier le Makefile obsolète? – Ethan

+1

Ethan: juste essayé, vous avez raison, a édité la réponse. –

+7

Ceci n'est pas une réponse, c'est un commentaire sur la réponse de @ Kleist – Neowizard

Questions connexes