Makefile - 最新规则,不是文件

问题描述 投票:1回答:1

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

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

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

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

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

touch a
touch b
done

还有其他人

done

我认为“最新”通常会限定一个文件,但是...有什么方法可以让所有依赖的“全部”规则被认为是最新的?

非常感谢,

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

makefile dependencies rules
1个回答
1
投票

不。如果目标不存在,则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)
© www.soinside.com 2019 - 2024. All rights reserved.