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