2010-06-20 4 views
1

S'il vous plaît considérer le Makefile suivant:gnu faire: match quoi que ce soit: Dependance sur l'existence de conditions préalables

CC = g++ 
CFLAGS = -c -O -Wall 
EFLAGS = -O -Wall -lm -o 

UTILITIES = error.o stream_manip.o mat_ops.o GaussElim.o 
UTILITIES += abstractmatrix.o dvector.o dmatrix.o ConjGrad.o 

# All objects 
%.o: %.cpp %.hpp 
    $(CC) $(CFLAGS) $< 

# Executables (doesn't have extension) 
% : %.cpp $(UTILITIES) 
    $(CC) $(EFLAGS) % $< $(UTILITIES) 

# Specific executable 
#TS_CG : TS_CG.cpp $(UTILITIES) 
    #$(CC) $(EFLAGS) [email protected] [email protected] $(UTILITIES) 

La règle match quoi que ce soit (pour executables) est censé me permettre de taper ce qui suit dans un terminal:

make TS_CG

et ont faire compiler l'exécutable appelé TS_CG. Cependant, make n'utilise pas ma cible de recherche universelle. Au lieu de cela, il utilise sa règle de compilation par défaut. D'autre part, si tous les objets répertoriés dans UTILITIES existent, il utilise ma cible de correspondance générale. Il semble donc que l'appariement dépend de l'existence des prérequis.

Apparemment:

Lorsqu'une règle est en phase terminale, il ne s'applique pas à moins que ses conditions préalables existent réellement.

(selon make manual). Mais ma règle n'est pas terminale; il n'est pas marqué par un double colon!

Alors, pourquoi cela semble-t-il toujours s'appliquer?

Je pourrais également demander si quelqu'un a une meilleure solution pour différencier les cibles d'objets et les cibles exécutables, comme j'ai essayé de le faire dans mon fichier.

Répondre

1

Je suis surpris que Make soit capable de construire TS_CG quand les UTILITIES n'existent pas déjà, puisque je ne m'attendrais pas à ce qu'il sache que TS_CG en a besoin.

Quoi qu'il en soit, lorsque Make essaie de trouver une règle pour TS_CG, tout ce qu'il trouve sont des règles implicites (rien de spécifique à TS_CG). En particulier, il a %: %.cpp $(UTILITIES), que vous avez fourni, et %: %.cpp, qui est intégré. Si $ (UTILITIES) existe, il utilisera la première règle, sinon il sera déplacé vers le bas de la liste, à la recherche d'une règle dont les prérequis existe, et trouve la seconde. Ce n'est que s'il ne trouve aucune règle dont les prérequis existent qu'il aura recours à des règles pour créer les prérequis.

+0

Merci pour votre réponse Bêta, que je suppose est la bonne réponse. Cela semble contraire à ce qui a été cité dans le manuel make de mon article, mais je suppose que c'est parce que la règle intégrée n'est pas écrasée par ma règle (ce que je pensais que ce serait). – Patrick

Questions connexes