Как использовать список переменных в качестве цели в Makefile? - PullRequest
23 голосов
/ 01 декабря 2010

Предположим, я работаю над 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).

Ответы [ 3 ]

40 голосов
/ 01 декабря 2010

Да.Существуют так называемые шаблонные правила .Самый простой для понимания пример:

%.o: %.cpp
       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

(помните, что Makefiles требуют вкладок).Это правило описывает, как сделать объектный файл из файла cpp.

Если вам не нужно такое широкое правило, вы можете использовать так называемые статические шаблоны:

objects = file1.o file2.o file3.o

all: $(objects)

$(objects): %.o: %.cpp
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

Вотраздел правила статических шаблонов и правила шаблонов в руководстве по GNU Make.

7 голосов
/ 01 декабря 2010

Вы можете сделать это, как указано ниже:

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 $@ $<

.c.o такойправило, в котором указывается, какие команды нужно выполнить, чтобы превратить файл .c в файл .o.В действующей команде $@ заменяется конкретной целью, а $< заменяется именем первой предпосылки.

Существует множество других автоматических переменных , которые вы можете использовать,найдите их с помощью info make или найдите хорошую книгу на make, если у вас нет info доступных материалов.

1 голос
/ 01 декабря 2010
SRCS = a.c b.c
OBJS = $(SRCS:.c=.o)

.c.o:
        ${CC} ${CFLAGS} -c -o $@ $<

Хотя $< не совсем переносимо (IIRC, bsdmake имеет значение $^ и $< точно соответствует тому, что использует gmake), это рецепт по умолчанию для .c.o, который будетдействует в любой реализации.

...