поведение по умолчанию в make-файле, без команды - PullRequest
1 голос
/ 26 апреля 2020

Я написал этот Makefile:

.PHONY: all clean test                                                          

all: my_grep                                                                    

clean:                                                                          
        -rm my_grep *.o                                                         
test:                                                                           
        ~/grep_tests/beta.sh                                         

my_grep: main.o line.o input.o                                                  
         gcc -o my_grep main.o line.o input.o                                   

main.o: main.c input.h line.h                                                   

line.o: line.c line.h                                                           

input.o: input.c input.h   

Когда пишу следующую команду в терминале:

make line.o

Я получаю это сообщение:

cc    -c -o line.o line.c

Как пришел Makefile знает что делать? После строки не написано никаких инструкций:

line.o: line.c line.h

, поэтому я ожидал, что ничего не произойдет. Любое объяснение?

1 Ответ

0 голосов
/ 26 апреля 2020

make автоматически предоставляет набор правил, которые всегда доступны, даже если Makefile вообще не существует. Спецификации POSIX для make называют их "правилами по умолчанию", а документация GNU make называет их "встроенными правилами". Это суффиксные правила или по существу эквивалентные шаблонные правила, которые сопоставляют цели с предварительными условиями и назначают рецепты сборки на основе суффиксов имен файлов, и, следовательно, подходят для многих случаев.

Кроме того, необходимо понимать, что правило make без рецепт не express, что нигде нет рецепта для цели. Скорее, такое правило «только для предварительных требований» определяет неисключительный список предварительных условий для цели, не обращаясь к рецепту для создания цели. Это позволяет использовать несколько правил для указания предпосылок для цели при условии, что не более одного явного правила определяет рецепт для цели. В частности, он позволяет определить дополнительные предпосылки для целей, рецепты которых предоставляются по умолчанию / встроенными правилами.

Среди правил по умолчанию GNU make и, по существу, каждая реализация make, соответствующая POSIX, один для построения .o файлов из соответствующих .c файлов, и это правило является тем, которое обеспечивает рецепт в этом случае. GNU предоставляет шаблонное правило, эквивалентное этому для этой цели:

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

Это немного отличается от спецификации POSIX, в которой для этой цели $(CPPFLAGS) исключено из правила по умолчанию, хотя это не имеет значения для цели поставленного вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...