Перестройка зависимостей правил каталога Makefile - PullRequest
0 голосов
/ 25 мая 2018

У меня есть Makefile вот так

all: sub-dir my-rule

sub-dir:
    $(MAKE) -C $@

my-rule: sub-dir
    g++ main.cpp

.PHONY sub-dir

Так что в основном я хочу дождаться окончания работы с sub-dir, прежде чем строить my-rule, но my-rule перестраивается каждый раз - даже если там, где нет изменений в sub-dir.

Как мне сделать так, чтобы он ожидал sub-dir и перестроил my-rule только при изменениях в sub-dir?

1 Ответ

0 голосов
/ 25 мая 2018

Когда вы пишете правило вроде:

my-rule: sub-dir

цель (my-rule) будет перестроена, если условие (sub-dir) новее.Make не заботится о том, являются ли файлы или целевые файлы каталогами, только то, что их время последнего изменения было изменено.

В вашем make-файле много проблем.Самый простой из них заключается в том, что вы никогда не создаете цель my-rule, поэтому, поскольку make обеспокоена тем, что цель всегда устарела (не существует == устарела).

Вы должны написать свое правило так, чтобы рецепт обновлял цель:

my-rule: sub-dir
        g++ main.cpp -o $@

Конечно, измените my-rule, если это не та программа, которую вы хотите создать.

Во-вторых,Время изменения каталога обновляется при изменении каталога .Каталог изменяется, когда что-то в этом каталоге переименовывается, добавляется или удаляется.Поэтому, если вы вызываете суб-марку и суб-марку переименовываете, добавляете или удаляете что-то в этом каталоге, то цель my-rule будет устаревшей.Если ничего не переименовано, не добавлено или не удалено, то my-rule будет NOT устаревшим.

В общем случае вы почти никогда не хотите указывать каталог как обязательное условие.Вместо этого вы должны перечислить цели, которые создает подмодель, как предварительное условие, например так (предположим, что подмодель создает libfoo.):

sub-dir/libfoo.a: FORCE
        $(MAKE) -C $(@D)
FORCE:

my-rule: sub-dir/libfoo.a
        ...

Правило FORCE существует, чтобы заставитьsub-make вызывается, даже если sub-dir/libfoo.a уже существует.

...