根据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'.
出于某种原因,我做出了一个空洞的规则将是沉默的(显然是错误的)。有没有办法抑制消息“没有为'目标'做什么”?如果是这样,怎么样?
答案 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(空配方不会)。所以你可以决定那里的权衡。