У меня есть двоичный файл, который мне нужно создать несколько раз с разными флагами компилятора. Поэтому, у меня есть Makefile, который гласит, что-то вроде:Makefile несколько целей из того же исходного файла, с разными флагами
OBJECTS_A := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.a.o))
OBJECTS_B := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.b.o))
OBJECTS_C := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.c.o))
Я также определить правила, чтобы изменить флаги для каждого OBJECTS_x:
$(OBJECTS_B): DEFINES+=-D_B
$(OBJECTS_C): DEFINES+=-D_C
И это где проблема происходит: Если я заявить Цели отдельно, как:
$(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]
Все работы. Однако, если я объединить все правила в один, только первый оценивается:
$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o [email protected]
Что я получаю на всухую, что только $ (OBJFOLDER) /% объектов ао строятся, но на правиле связывания. поэтому каждый бинарный объект требует своих объектов (и двоичные файлы b и c не могут быть построены, следовательно).
Любые идеи? Спасибо!
Правило модели с несколькими целевых шаблонами означает, точно так, как вы испытали: он ожидает один вызова рецепта для создания _все_ целей , Он используется, когда программа создает несколько выходных файлов. См. Https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html (последний абзац) – MadScientist