Когда вы пишете правило вроде:
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
уже существует.