Tout comme make clean
supprime tous les fichiers produits par un makefile, je voudrais faire de même avec CMake. Trop souvent, je me retrouve à parcourir manuellement des répertoires supprimant des fichiers comme cmake_install.cmake
et CMakeCache.txt
, et les CMakeFiles
dossiers.
Existe-t-il une commande comme cmake clean
supprimer automatiquement tous ces fichiers? Idéalement, cela devrait suivre la structure récursive définie dans le CMakeLists.txt
fichier du répertoire courant .
cd <location-of-cmakelists>/build && cmake ..
La FAQ officielle de CMake indique:
la source
En ces jours de Git partout, vous pouvez oublier CMake et son utilisation
git clean -d -f -x
, qui supprimera tous les fichiers qui ne sont pas sous contrôle de source.la source
-x
option cependant. C'est une excellente astuce dugit
métier. Bien que personnellement je fais encore un fonctionnement à sec d' abord,git clean -d -f -x -n
. De temps en temps, je garde un fichier de commodité que j'utilise pour un projet avec le dossier du projet sousgit
contrôle, mais ce n'est pas quelque chose que je veux partager avec d'autres, donc je ne le fais pasgit add
pour le projet. Cela ferait sauter ce type de fichier si je ne faisais pas attention à ajouter une-e <pattern>
option. Sur cette note, ce serait bien d'git
avoir un.gitcleanignore
fichier. :)chattr +i $filename
(nécessite des autorisations root, ne permet pas de modifier le fichier après cela). De cette façon, git ne pourra pas supprimer ce fichier même s'il essaie de le faire commerm -f
.git add
?Je l'ai googlé pendant une demi-heure et la seule chose utile que j'ai trouvée a été d'invoquer l'
find
utilitaire:Assurez-vous également d'invoquer
make clean
(ou le générateur CMake que vous utilisez) avant cela.:)
la source
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
et je n'avais toujours pas fini ...Vous pouvez utiliser quelque chose comme:
Je crée généralement une commande "make clean-all" en ajoutant un appel à "make clean" à l'exemple précédent:
N'essayez pas d'ajouter la cible "propre" comme dépendance:
Parce que "nettoyer" n'est pas une vraie cible dans CMake et cela ne fonctionne pas.
De plus, vous ne devez pas utiliser ce "clean-cmake-files" comme dépendance de quoi que ce soit:
Parce que, si vous faites cela, tous les fichiers CMake seront effacés avant la fin de tout nettoyer, et make vous enverra une erreur lors de la recherche "CMakeFiles / clean-all.dir / build.make". En conséquence, vous ne pouvez pas utiliser la commande clean-all avant "n'importe quoi" dans n'importe quel contexte:
Ça ne marche pas non plus.
la source
Le simple fait de publier des
rm CMakeCache.txt
œuvres pour moi aussi.la source
cmake /build-path
nouveau.C'est peut-être un peu dépassé, mais comme c'est le premier hit lorsque vous google
cmake clean
, j'ajouterai ceci:Puisque vous pouvez démarrer une construction dans le répertoire de construction avec une cible spécifiée avec
cmake --build . --target xyz
vous pouvez bien sûr courir
cmake --build . --target clean
pour exécuter la
clean
cible dans les fichiers de génération générés.la source
Je suis d'accord que la construction hors source est la meilleure réponse. Mais pour les moments où vous devez simplement faire une construction en source, j'ai écrit un script Python disponible ici , qui:
la source
make
lorsqu'il n'y a pas deMakefile
présence en raison d'un nettoyage préalable (c'est-à-dire, rend ce script idempotent). Ajoutez simplement la ligne (correctement espacée):if os.path.isfile(os.path.join(directory,'Makefile')):
juste avant la ligne 24:args = [
et bien sûr, indentez le reste du corps de la fonction après la ligne qui vient d'être ajoutée. Cela n'effectuera quemake ... clean
si aMakefile
est présent dans le répertoire en cours de nettoyage. Sinon, le script est parfait!Une solution que j'ai trouvée récemment consiste à combiner le concept de construction hors source avec un wrapper Makefile.
Dans mon fichier CMakeLists.txt de niveau supérieur, j'inclus les éléments suivants pour empêcher les builds en source:
Ensuite, je crée un Makefile de niveau supérieur et j'inclus les éléments suivants:
La cible par défaut
all
est appelée en tapantmake
et appelle la cible./build/Makefile
.La première chose que la cible
./build/Makefile
fait est de créer lebuild
répertoire en utilisant$(MKDIR)
, qui est une variable pourmkdir -p
. Le répertoirebuild
est l'endroit où nous effectuerons notre build out-of-source. Nous fournissons l'argument-p
pour nous assurer quemkdir
cela ne nous crie pas pour essayer de créer un répertoire qui peut déjà exister.La deuxième chose que la cible
./build/Makefile
fait est de changer de répertoire enbuild
répertoire et d'appelercmake
.De retour à la
all
cible, nous invoquons$(MAKE) -C build
, où se$(MAKE)
trouve une variable Makefile générée automatiquement pourmake
.make -C
change le répertoire avant de faire quoi que ce soit. Par conséquent, utiliser$(MAKE) -C build
équivaut à fairecd build; make
.Pour résumer, appeler ce wrapper Makefile avec
make all
oumake
équivaut à faire:La cible
distclean
invoquecmake ..
, puismake -C build clean
, et enfin, supprime tout le contenu dubuild
répertoire. Je pense que c'est exactement ce que vous avez demandé dans votre question.La dernière partie du Makefile évalue si la cible fournie par l'utilisateur est ou non
distclean
. Sinon, il changera de répertoire enbuild
avant de l'invoquer. C'est très puissant car l'utilisateur peut taper, par exemplemake clean
, et le Makefile le transformera en un équivalent decd build; make clean
.En conclusion, ce wrapper Makefile, en combinaison avec une configuration CMake de construction hors source obligatoire, fait en sorte que l'utilisateur n'ait jamais à interagir avec la commande
cmake
. Cette solution fournit également une méthode élégante pour supprimer tous les fichiers de sortie CMake dubuild
répertoire.PS Dans le Makefile, nous utilisons le préfixe
@
pour supprimer la sortie d'une commande shell, et le préfixe@-
pour ignorer les erreurs d'une commande shell. Lors de l'utilisationrm
dans le cadre de ladistclean
cible, la commande retournera une erreur si les fichiers n'existent pas (ils peuvent avoir été supprimés déjà en utilisant la ligne de commande avecrm -rf build
, ou ils n'ont jamais été générés en premier lieu). Cette erreur de retour forcera notre Makefile à quitter. Nous utilisons le préfixe@-
pour éviter cela. Il est acceptable si un fichier a déjà été supprimé; nous voulons que notre Makefile continue et supprime le reste.Une autre chose à noter: Ce Makefile ne peut pas fonctionner si vous utilisez un nombre variable de variables CMake pour construire votre projet, par exemple,
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
. Ce Makefile suppose que vous appelez CMake de manière cohérente, soit en tapant,cmake ..
soit en fournissantcmake
un nombre cohérent d'arguments (que vous pouvez inclure dans votre Makefile).Enfin, le crédit là où le crédit est dû. Ce wrapper Makefile a été adapté du Makefile fourni par le modèle de projet d'application C ++ .
la source
Bien sûr, les builds hors source sont la méthode incontournable pour les Makefiles Unix, mais si vous utilisez un autre générateur tel que Eclipse CDT, il préfère que vous construisiez en source. Dans ce cas, vous devrez purger les fichiers CMake manuellement. Essaye ça:
Ou si vous avez activé globstar avec
shopt -s globstar
, essayez plutôt cette approche moins dégoûtante:la source
build
. Cela a pris un peu plus de temps que ces commandes mais je n'ai dû le faire qu'une seule fois :)essayez d'utiliser: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first: Construisez la cible propre d'abord, puis construisez.
(Pour nettoyer uniquement, utilisez --target clean.)
la source
Dans le cas où vous transmettez des
-D
paramètres à CMake lors de la génération des fichiers de build et que vous ne souhaitez pas supprimer l'intégralité du répertoire build /:Supprimez simplement le répertoire CMakeFiles / dans votre répertoire de construction.
Cela provoque CMake à réexécuter et les fichiers système de génération sont régénérés. Votre build commencera également à zéro.
la source
Pour simplifier le nettoyage lors de l'utilisation de build "out of source" (c'est-à-dire que vous construisez dans le
build
répertoire), j'utilise le script suivant:Chaque fois que vous devez nettoyer, vous devez source ce script à partir du
build
répertoire:la source
cd .. ; rm ; mkdir ; cd
séquence parcd .. ; rm -rf build/*
.Si vous avez des définitions personnalisées et que vous souhaitez les enregistrer avant le nettoyage, exécutez ce qui suit dans votre répertoire de génération:
Créez ensuite un nouveau répertoire de build (ou supprimez l'ancien répertoire de build et recréez-le) et enfin exécutez
cmake
avec les arguments que vous obtiendrez avec le script ci-dessus.la source
Si vous courez
il régénérera les fichiers CMake. Ce qui est nécessaire si vous ajoutez un nouveau fichier à un dossier source sélectionné par * .cc, par exemple.
Bien que ce ne soit pas un "nettoyage" en soi, il "nettoie" les fichiers CMake en régénérant les caches.
la source
J'utilise le script shell suivant à de telles fins:
Si vous utilisez Windows, utilisez Cygwin pour ce script.
la source
C'est drôle de voir que cette question reçoit autant d'attentions et de solutions compliquées, ce qui montre en effet une douleur de ne pas avoir une méthode propre avec cmake.
Eh bien, vous pouvez certainement
cd build
faire votre travail, puis faire unrm -rf *
quand vous avez besoin de nettoyer. Cependant,rm -rf *
c'est une commande dangereuse étant donné que beaucoup de gens ne savent souvent pas dans quel répertoire ils se trouvent.Si vous
cd ..
,rm -rf build
et puismkdir build
et puiscd build
, c'est tout simplement trop de frappe.Donc, une bonne solution est de rester en dehors du dossier de construction et de dire à cmake le chemin:
à configurer:
cmake -B build
à construire:
cmake --build build
à nettoyer:
rm -rf build
à recréer le dossier de construction: vous n'avez même pas besoin de le
mkdir build
configurer aveccmake -B build
et cmake le créerala source
cmake
cuit principalement unMakefile
, on pourrait ajouterrm
à la PHONY propre .Par exemple,
la source
J'ai ceci dans mon fichier shell rc (
.bashrc
,.zshrc
):Vous êtes censé l'utiliser uniquement pour les versions hors source. Disons que vous avez un répertoire nommé
build/
à cet effet. Ensuite, il vous suffit de courirt-cmake-clean
à l'intérieur.la source
J'ai utilisé la réponse de zsxwing avec succès pour résoudre le problème suivant:
J'ai une source que je construis sur plusieurs hôtes (sur une carte Linux Raspberry Pi, sur une machine virtuelle Linux VMware, etc.)
J'ai un script Bash qui crée des répertoires temporaires basés sur le nom d'hôte de la machine comme ceci:
la source
Créez un répertoire de construction temporaire, par exemple,
build_cmake
,. Par conséquent, tous vos fichiers de construction seront dans ce dossier.Ensuite, dans votre fichier CMake principal, ajoutez la commande ci-dessous.
Par conséquent, lors de la compilation,
Et pour nettoyer faire:
la source