Make:动态执行规则

Make: execute rule dynamically

使用 GNU-Make,

假设我这样写:

.PHONY: foo bar

foo:
    $(eval foo:=1)
    @echo foo

bar:
ifneq (${foo},)
    @echo bar
endif

然后我执行以下命令:

$: make foo
foo

$: make bar
bar

$: make bar foo
bar
foo

$: make foo bar
foo
bar

但是,我试图让最后两个命令出现以下结果,最好不要放入 shell 代码:

$: make foo bar
foo

$: make bar foo
bar
foo

如何使 if 守卫动态禁止 bar 规则?

首先,您误用了 ifneq --- 它总是在第一遍处理,即在任何 recipe-related 之前处理。所以这不是一个选择。

其次,在 make foo barmake bar foo 上表现不同是一个糟糕的设计,因为它破坏了 -jN 选项的并行处理。你应该修改你的逻辑:要么 foo 必须依赖于 bar,要么 bar 依赖于 foo,或者它们必须完全相互独立。