web-dev-qa-db-fra.com

Comment inclure une cible propre dans Makefile?

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?

21
neversaint

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

19
qrdl

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.

34
unwind

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 
2
Alex F