J'ai un binaire que j'ai besoin de construire plusieurs fois avec différents drapeaux de compilateur. Par conséquent, j'ai un Makefile qui dit quelque chose comme:Makefile cibles multiples à partir du même fichier source, avec différents drapeaux
OBJECTS_A := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.a.o))
OBJECTS_B := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.b.o))
OBJECTS_C := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.c.o))
Je définis aussi une règle de changer les drapeaux pour chaque OBJECTS_x:
$(OBJECTS_B): DEFINES+=-D_B
$(OBJECTS_C): DEFINES+=-D_C
Et c'est là le problème se produit: Si je déclare la cibles séparément, en tant que:
$(OBJFOLDER)/%.a.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected]
$(OBJFOLDER)/%.b.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected]
$(OBJFOLDER)/%.c.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected]
Toutes les œuvres. Cependant, si je fusionne toutes les règles en une seule, seule la première est évaluée:
$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected]
Ce que je reçois sur une marche à sec est que seulement $ (objFolder) /% objets ao sont construits, mais la règle de liaison. chaque binaire requiert ses objets (et les binaires b et c échouent donc à construire).
Des idées? Merci!
Une règle de modèle avec plusieurs modèles cibles signifie exactement comme vous avez vécu: il attend un appel de la recette pour construire _tous_ les cibles . Il est utilisé lorsqu'un programme crée plusieurs fichiers de sortie. Voir https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html (dernier paragraphe) – MadScientist