禁止“制作:'目标'无所事事”

时间:2015-07-31 15:06:27

标签: makefile gnu-make

根据GNUmake手册5.9 Using Empty Recipes,我可以执行以下操作来创建空配方:

target: ;

我有一个空的配方打印系统信息以帮助进行故障排除:

.PHONY: system
system: ;
    $(info CXX: $(CXX))
    $(info CXXFLAGS: $(CXXFLAGS))
    $(info GCC_COMPILER: $(GCC_COMPILER))
    $(info CLANG_COMPILER: $(CLANG_COMPILER))
    $(info INTEL_COMPILER: $(INTEL_COMPILER))
    $(info SUN_COMPILER: $(SUN_COMPILER))
    ...

然而,它以:

结束
...
IS_MINGW: 0
IS_CYGWIN: 1
IS_OPENBSD: 0
IS_SUN: 0
make: Nothing to be done for 'system'.

出于某种原因,我做出了一个空洞的规则将是沉默的(显然是错误的)。有没有办法抑制消息“没有为'目标'做什么”?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:2)

您已通过在其下放置system行,为$(info)目标指定了食谱。尽管如此,并不关心它们都是上下文而不是shell上下文配方行。这就是为什么添加;并不做任何事情的原因。你的食谱已经不是空的。

所有人都说你可以在那里使用$(info)并使用@echo(或其他),而你将避免这条消息。

或者您可以使用 system: ;,然后在system中使用MAKECMDGOALS生成有条件的条件,然后使用$(info)显示信息。

ifneq ($(filter system,$(MAKECMDGOALS)),)
    $(info CXX: $(CXX))
    $(info CXXFLAGS: $(CXXFLAGS))
    $(info GCC_COMPILER: $(GCC_COMPILER))
    $(info CLANG_COMPILER: $(CLANG_COMPILER))
    $(info INTEL_COMPILER: $(INTEL_COMPILER))
    $(info SUN_COMPILER: $(SUN_COMPILER))
endif

system: ;

然后,您可以使用make target1 target2 system并在目标运行之前打印系统输出。

以上输出

make: `system' is up to date.
但最后却结束了。为了避免这种情况,你需要给规则一个配方。

system: ;@:

但实际上会运行一个shell(空配方不会)。所以你可以决定那里的权衡。