考虑这个(非常)简单的Makefile,
all: a b
@echo done
a:
touch $@
b:
touch $@
我没有得到我期望的行为。
事实上,我希望我的规则“all”只有在其中一个依赖关系不是最新的时才能执行。
然而,在第一个$ make我得到
touch a
touch b
done
以及其他人
done
我断然认为“最新”通常会限定文件,但...... 有什么方法可以将所有依赖的“全部”规则考虑在内吗?
非常感谢,
ps:我知道诀窍$ touch all,但那不是重点
答案 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)