抑制“make: Nothing to be done for 'target'”

4
根据GNUmake手册的5.9 使用空配方,我可以执行以下操作来创建一个空配方:
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'.

不知何故,我认为一个空规则会是静默的(显然是错误的)。有没有办法抑制消息 "Nothing to be done for 'target'"?如果有,怎么做?


尝试一下make -s - tripleee
2个回答

2
您已经通过将$(info)行放在system目标下,为该目标提供了一个配方。然而,Make并不关心它们是否都是make上下文而不是shell上下文的配方行。这就是为什么添加;没有任何作用。您的配方已经不是空的了。
总之,您可以选择不在那里使用$(info),而是使用@echo(或其他命令),这样就可以避免该消息。
或者,您可以选择只使用system: ;,然后在MAKECMDGOALS中对system进行make级别的条件判断,然后使用$(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(空配方不会)。因此,您需要在其中进行权衡决策。


在Cygwin和OS X上,我得到了 make: 'system' is up to date(并且它不打印信息)。我是否将缺失的括号放在了正确的位置?或者我还做错了其他什么事情?(我也删除了 .PHONY)。 - jww
用什么版本的make?我把完全相同的内容粘贴到一个makefile文件中,顶部加上了all: ; echo $@,运行make会得到all的输出,但是运行make system却得到系统的输出。尽管它也报告了make: \system' is up to date.。要防止这种情况发生,你需要一个真正的配方体来阻止它,比如system: ;@:`,但这会生成一个shell。 - Etan Reisner
Cygwin使用4.1版本,而OS X提供3.81版本。两者都是GNU make。 - jww

0

我曾经处于同样的情况,通过在规则中添加一个“no-op”recipe,我实现了自己想要的结果。

: 命令对于 Bash/Bourne shell 来说就是一个空操作。

.PHONY: vars
vars:  # print Makefile variables and values
⇥   @:
⇥   @$(foreach V, \
⇥   ⇥   $(sort $(.VARIABLES)), \
⇥   ⇥   $(if $(filter-out environment% default automatic,$(origin $V)), \
⇥   ⇥   ⇥   $(info $V=$($V) ($(value $V))) \
⇥   ⇥   ␣) \
⇥   ␣␣)

由于$(info ...)会将结果输出到标准输出,但实际上并不会为规则本身创建任何工作,因此make将其视为一个空目标,因此会出现警告信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接