J'ai un Makefile qui ressemble à ceci
CXX = g++ -O2 -Wall
all: code1 code2
code1: code1.cc utilities.cc
$(CXX) $^ -o $@
code2: code2.cc utilities.cc
$(CXX) $^ -o $@
Ce que je veux faire ensuite, c'est inclure clean target
pour que chaque fois que j'exécute make
, il supprime automatiquement les fichiers binaires existants de code1
et code2
avant d'en créer de nouveaux.
J'ai essayé de mettre ces lignes à la fin du makefile, mais ça ne marche pas
clean:
rm -f $@
echo Clean done
Quelle est la bonne façon de procéder?
En langage makefile $@
signifie "nom de la cible", donc rm -f $@
Se traduit par rm -f clean
.
Vous devez spécifier à rm
ce que vous voulez supprimer exactement, comme rm -f *.o code1 code2
La meilleure chose à faire est probablement de créer une variable contenant vos binaires:
binaries=code1 code2
Ensuite, utilisez-le dans la cible all
-, pour éviter de répéter:
all: clean $(binaries)
Maintenant, vous pouvez également l'utiliser avec la cible clean
-, et simplement ajouter quelques globes pour attraper les fichiers objets et autres choses:
.PHONY: clean
clean:
rm -f $(binaries) *.o
Notez l'utilisation du .PHONY
pour faire clean
a pseudo-cible . Ceci est une fonction de création de GNU make, donc si vous devez être portable avec d'autres implémentations de make, ne l'utilisez pas.
Par la façon dont il est écrit, la règle propre n'est invoquée que si elle est explicitement appelée:
nettoyer
Je pense que c'est mieux que de nettoyer à chaque fois. Si vous voulez le faire à votre façon, essayez ceci:
CXX = g ++ -O2 -Wall All: clean code1 code2 Code1: code1.cc utilities.cc $ (CXX) $ ^ -o $ @ Code2: code2.cc utilities.cc $ (CXX) $ ^ -o $ @ clean: rm ... echo Clean done