Как использовать список переменных в качестве цели в Makefile?
Предположим, что я работаю над make файлом, и у меня есть следующее объявление переменной вверху:
FILES = file1.cpp file2.cpp file3.cpp
Теперь предположим, что я хочу скомпилировать каждую из них с помощью специальной команды без указания каждой цели следующим образом:
file1.o : file1.cpp
custom_command file1.cpp
file2.o : file2.cpp
custom_command file2.cpp
file3.o : file3.cpp
custom_command file3.cpp
Есть ли лучший способ сделать это, используя переменную $(FILES)
, указанную выше?
Что-то вроде:
$(FILES:.cpp=.o) : $(FILES)
custom_command $(FILES)
... только это нужно сделать для каждого файла в переменной $(FILES)
.
Ответы
Ответ 1
Да. Есть так называемые шаблонные правила. Пример проще всего понять:
%.o: %.cpp
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected]
(помните, что Makefiles требует вкладки). Это правило описывает, как сделать объектный файл из файла cpp.
Если вы не хотите такого широкого правила, вы можете использовать так называемые статические шаблоны:
objects = file1.o file2.o file3.o
all: $(objects)
$(objects): %.o: %.cpp
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected]
Здесь раздел правила статического шаблона и правила шаблона в руководстве GNU Make.
Ответ 2
Вы можете сделать это, как описано ниже:
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
но вы должны помнить, что зависимости полны - он предполагает, что a.o
также зависит от b.c
, что, вероятно, не так.
То, что вы, вероятно, потом, является единственным правилом о том, как превратить один тип файла в другой:
SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)
all: $(OBJS)
.c.o:
gcc -c -o [email protected] $<
.c.o
- это такое правило, которое указывает, какие команды запускать, чтобы превратить файл .c
в файл .o
. В действительной команде [email protected]
заменяется на конкретную цель, а $<
заменяется на имя первого предварительного условия.
Есть много других автоматических переменных, которые вы можете использовать, посмотрите их с помощью info make
или найдите хорошую книгу на make
, если у вас нет доступных материалов info
.
Ответ 3
SRCS = a.c b.c
OBJS = $(SRCS:.c=.o)
.c.o:
${CC} ${CFLAGS} -c -o [email protected] $<
Хотя $<
не совсем портативен (IIRC, bsdmake имеет значение $^
и $<
точно поменяется на то, что использует gmake), это рецепт по умолчанию для .c.o
, который будет действовать в либо реализация.