Поиск…


Использование .PHONY для целей без файлов

Используйте .PHONY чтобы указать цели, которые не являются файлами, например, clean или mrproper .

Хороший пример

.PHONY: clean
clean:
    rm *.o temp

Плохой пример

clean:
    rm *.o temp

В хорошем примере make знает, что clean не является файлом, поэтому он не будет искать, если он есть или не обновляется и будет выполнять рецепт.

В плохом примере make будет искать файл с именем clean . Если он не существует или не обновляется, он будет выполнять рецепт, но если он существует и обновлен, рецепт не будет выполнен.

Использование .PHONY для рекурсивных вызовов команды make

Рекурсивное использование make означает использование make в качестве команды в make-файле. Этот метод полезен, когда большой проект содержит подкаталоги, каждый из которых имеет свои файлы make-файлов. Следующий пример поможет понять преимущество использования .PHONY с рекурсивным make.

/main
     |_ Makefile
     |_ /foo
            |_ Makefile
            |_ ... // other files
     |_ /bar
            |_ Makefile
            |_ ... // other files
     |_ /koo
            |_ Makefile
            |_ ... // other files

Чтобы запустить make-файл подкаталога из make-файла main, make-файл main будет иметь петлю, как показано ниже (есть другие способы, которыми это может быть достигнуто, но это выходит за рамки текущего раздела)

SUBDIRS = foo bar koo

subdirs:
        for dir in $(SUBDIRS); do \
          $(MAKE) -C $$dir; \
        done

Однако с этим методом существуют подводные камни.

  1. Любая ошибка, обнаруженная в под-маке, игнорируется этим правилом, поэтому она будет продолжать строить остальные каталоги, даже если один из них не выполняется.
  2. Способность Make выполнять параллельное выполнение нескольких целей сборки не используется, поскольку используется только одно правило.

Объявляя подкаталоги как .PHONY-мишени (вы должны сделать это, так как подкаталог, очевидно, всегда существует, иначе он не будет построен), эти проблемы могут быть преодолены.

SUBDIRS = foo bar koo

.PHONY: subdirs $(SUBDIRS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
        $(MAKE) -C $@


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow