1

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

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

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

事实上,我希望我的规则“全部”仅在其依赖项之一不是最新的情况下才被执行。

但是在第一个 $ make 我得到

touch a
touch b
done

和其他人

done

我不理解“最新”通常限定一个文件,但是......有没有办法让规则“所有”在其所有依赖项都被认为是最新的?

非常感谢,

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

4

1 回答 1

1

不。如果目标不存在,那么 make 将始终运行配方。

您的all配方可以通过一些奇怪的方法检查是否已构建任何先决条件,如果是,则行为会有所不同。至少,如果您使用的是 GNU make。

预计到达时间:

一种方法是$(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)
于 2013-10-10T13:54:34.830 回答