考虑到这个(非常)简单的Makefile,
all: a b
@echo done
a:
touch $@
b:
touch $@
我没有得到我期望的行为。
事实上,我希望我的规则“all”只有在其中一个依赖关系不是最新的时才能执行。
然而,在第一个$ make我得到
touch a
touch b
done
还有其他人
done
我认为“最新”通常会限定一个文件,但是...有什么方法可以让所有依赖的“全部”规则被认为是最新的?
非常感谢,
ps:我知道诀窍$ touch all,但那不是重点
不。如果目标不存在,则make将始终运行配方。
您的all
配方可以检查是否存在任何先决条件,并且如果有,则表现出不同的行为。至少,如果你正在使用GNU make。
AND:
一种方法是将$(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)