2010-12-01 42 views
16

Supposons que je travaille sur un makefile et j'ai la déclaration variable suivante en haut:Comment utiliser une liste de variables en tant que cible dans un Makefile?

FILES = file1.cpp file2.cpp file3.cpp 

Supposons maintenant que je veux compiler chacun de ceux qui ont une commande spéciale sans spécifier chaque cible comme ceci:

file1.o : file1.cpp 
    custom_command file1.cpp 
file2.o : file2.cpp 
    custom_command file2.cpp 
file3.o : file3.cpp 
    custom_command file3.cpp 

Existe-t-il un meilleur moyen de le faire en utilisant la variable $(FILES) I déclarée ci-dessus?

Quelque chose comme:

$(FILES:.cpp=.o) : $(FILES) 
    custom_command $(FILES) 

... seulement il a besoin de faire cela pour chaque fichier dans la variable $(FILES).

Répondre

29

Oui. Il y a ce qu'on appelle règles de modèle. Un exemple est le plus facile à comprendre:

%.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

(rappelez-vous que Makefiles nécessitent onglets). Cette règle décrit comment créer un fichier objet à partir d'un fichier cpp.

Si vous ne voulez pas une règle générale, vous pouvez utiliser ce qu'on appelle des modèles statiques:

objects = file1.o file2.o file3.o 

all: $(objects) 

$(objects): %.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

Voici la section sur static pattern rules et pattern rules dans le Manuel GNU Make.

6

Vous peut faire, selon les éléments suivants:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

$(OBJS): $(SRCS) 
     cc -c -o a.o a.c 
     cc -c -o b.o b.c 

mais vous devez vous rappeler que les dépendances sont - il suppose que a.o dépend de b.c et qui est probablement pas le cas.

Qu'est-ce que vous êtes probablement après une seule règle sur la façon de transformer un type de fichier dans un autre:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 

.c.o: 
     gcc -c -o [email protected] $< 

.c.o est une règle qui stipule que les commandes à exécuter pour transformer un fichier .c dans un .o fichier. Dans la commande actuelle, [email protected] est remplacée par la cible spécifique et $< est remplacé par le nom du premier prérequis.

Il y a beaucoup d'autres variables automatiques vous pouvez utiliser, les regarder avec info make ou venir chercher un bon livre sur make si vous ne disposez pas du info disponibles.

+0

Ya, c'est à peu près ce que j'essaie de faire. –

+0

Une autre façon de spécifier exactement les dépendances consiste à utiliser [expansion secondaire] (https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html) des conditions préalables (fonction spécifique GNU Make). – ruvim

1
SRCS = a.c b.c 
OBJS = $(SRCS:.c=.o) 

.c.o: 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

Bien que $< n'est pas tout à fait portable (IIRC, a le sens vers bsdmake de $^ et $< exactement swappée à ce que gmake utilisations), telle est la recette par défaut pour .c.o qui serait en vigueur dans les deux la mise en œuvre.