Что означает символ% в Makefile

11

Я играю с make-файлами и наткнулся на % .o или % .c . Из того, что я понял, это указывает все c или o файлы. Но почему эта работа:

%.o: %.c
        $(CC) -c $^  -o $@  

и это не работает

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Оба выражения указывают все файлы. так что делает символ % .o: в файле make?

Меро
источник

Ответы:

9

Оба выражения указывают все файлы.

Нет, первое правило говорит, makeкак получить .oфайл с учетом соответствующего .cфайла. Обратите внимание на единственное число: один файл.

Второе правило (утверждает, что) рассказывает, makeкак получить группу .oфайлов, учитывая другую группу соответствующих .cфайлов. Обратите внимание на множественное число: все .cфайлы, полученные в результате *.cслияния.

С другой стороны, %.o: %cэто расширение GNU.

С другой стороны, вы не будете учиться использовать makeв StackOverflow. Вы должны рассмотреть вопрос о чтении книги.

Сату Кацура
источник
RTFM, правда? Я думал, что цель стека обмена состояла в том, чтобы очистить этот менталитет.
daknowles
12

Конструкция:

%.o: %.c
        $(CC) -c $^  -o $@  

это шаблонное правило , которое является типом неявного правила. Он определяет одну цель и одну зависимость и вызывает один вызов $(CC)для каждой цели. Пока это:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

это стандартное правило, но у него (возможно) много целей и много зависимостей. Тем не менее, для всего этого, это будет вызывать только $(CC)один раз.

Стивен Раух
источник