Makefile - 最新规则,不是文件

时间:2013-10-10 10:19:32

标签: makefile dependencies rules

考虑这个(非常)简单的Makefile,

all: a b
    @echo done
a:
    touch $@
b:
    touch $@

我没有得到我期望的行为。

事实上,我希望我的规则“all”只有在其中一个依赖关系不是最新的时才能执行。

然而,在第一个$ make我得到

touch a
touch b
done

以及其他人

done

我断然认为“最新”通常会限定文件,但...... 有什么方法可以将所有依赖的“全部”规则考虑在内吗?

非常感谢,

ps:我知道诀窍$ touch all,但那不是重点

1 个答案:

答案 0 :(得分:1)

没有。如果目标不存在,则make将始终运行配方。

您的all食谱可以检查是否存在任何先决条件,并且如果是这样,则会有不同的行为方式。至少,如果你正在使用GNU make。

ETA:

一种方法是向每个目标添加$(eval BUILT = 1),然后在all目标中,您可以查看是否设置了BUILT。这需要适度的GNU make版本:

BUILT =

all: a b
        @[ -n '$(BUILT)' ] && echo done
a:
        touch $@ $(eval BUILT = 1)
b:
        touch $@ $(eval BUILT = 1)