在makefile中,前缀为at符号disables the print of the output的行。我有一个makefile,其中每一行都以at为前缀,但是对于调试我需要看看发生了什么。有没有办法告诉make忽略at并输出该行?调试过多,-n选项打印它们,但没有做任何事情(这是干运行)
答案 0 :(得分:16)
创建一个默认值为@
的变量:
AT := @
然后在Makefile
:
foo:
$(AT)fooc -o $@
然后将make
作为make AT=
运行。如果你愿意,你可以得到比这更好的东西:
V := 0
AT_0 := @
AT_1 :=
AT = $(AT_$(V))
这会使命令保持沉默,除非V
设置为1
(例如make V=1
)。这使用非POSIX,但是递归变量扩展的常见特征。
答案 1 :(得分:7)
你可以告诉别人在执行命令时打印命令,这是完全相同的:
make SHELL='/bin/sh -x' ...your make arguments...
但是,如果你的makefile包含shell脚本片段作为配方而不是单独的简单命令序列,那么这将不会很好地工作,因为你会看到遇到的单个shell命令而不是整个片段。被调用。
或者,您实际上可以利用GNU Make的自由软件特性并破解您自己的忽略@
标志的版本。 Grepping GNU Make COMMANDS_SILENT
的源代码将很快向您显示,1 ||
调用?:
调用的message()
条件中的start_job_command()
条件就足够了在 job.c 中。完成工作!
答案 2 :(得分:2)
在GNU Make中,这不是开箱即用的。让Makefile
完全无声的完全沉默只是不好的做法。删除@
符号并使用-s
运行是获得静默构建的最简单方法(可能的echo
命令除外)。
答案 3 :(得分:2)
取出所有@并将此行添加到Makefile:
.SILENT:
如果要调试,请注释掉.SILENT行。
答案 4 :(得分:0)
在make脚本前面禁用@是很有用的,但是有时在make脚本很长的时候太吵了。另一种调试技术是打开一个在执行命令之前回显命令的shell功能。这消除了操纵@或.SILENT的需要。考虑一个示例Makefile:
test: @blah; \ : ... lots of script commands ... ; \ : Start debugging here ; \ set -x; \ : ... script segment to debug ... ; \ set +x; \ : Stop debugging here ; \ : ... lots of script commands ... ;
这可能是非可移植的,因为它依赖于执行脚本的shell中存在的功能,但是可移植性对于调试来说并不是那么重要(如果它适用于你)。
答案 5 :(得分:0)
为了使事情更具可配置性,允许make开关启用详细程度。它默认为静音模式。只有-e VERBOSE = 1模式,它当然会详细:
##
# Verbose ENABLE/DISABLE
# invoke make -e VERBOSE=1
##
V=@
ifeq ($(VERBOSE),1)
V=
endif
all:
$(V)echo test
echo test
感谢您提供这个主题,这对我的工作有很大的帮助。