Подтвердить что ты не робот

Как использовать список переменных в качестве цели в 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).

4b9b3361

Ответ 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, который будет действовать в либо реализация.