Makefile目录规则依赖项重建

时间:2018-05-25 12:49:33

标签: makefile compilation gnu-make

我有像这样的Makefile

all: sub-dir my-rule

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

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

.PHONY sub-dir

所以基本上我想在构建my-rule之前等待sub-dir完成,但每次都会重建my-rule - 即使sub-dir没有变化。

如果sub-dir发生变化,我怎样才能让它等待sub-dir并重建my-rule?

1 个答案:

答案 0 :(得分:0)

当您编写如下规则时:

my-rule: sub-dir

如果先决条件(my-rule)较新,则将重建目标(sub-dir)。让目前并不关心目标或先决条件是文件是目录,只关心它们的最后修改时间是什么。

你的makefile有很多问题。最简单的一个是你永远不会创建一个目标my-rule,所以就make来说,目标总是过时(不存在==过时)。

您必须像这样编写规则,以便配方更新目标:

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

当然,如果您不想创建该计划,请更改my-rule

其次,当目录更改时,目录修改时间会更新。当重命名,添加或删除该目录中的某些内容时,该目录会更改。因此,如果您调用sub-make并且sub-make重命名,添加或删除该目录中的某些内容,则my-rule目标将过期。如果没有重命名,添加或删除任何内容,则my-rule NOT 将过期。

通常,您几乎不希望将目录列为先决条件。相反,您应该列出sub-make创建的目标作为先决条件,如下所示(假设sub-make创建libfoo.):

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

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

即使FORCE已存在,sub-dir/libfoo.a规则也会强制调用子品牌。