忽略makefile中的(@)符号

时间:2010-10-05 08:15:19

标签: makefile

在makefile中,前缀为at符号disables the print of the output的行。我有一个makefile,其中每一行都以at为前缀,但是对于调试我需要看看发生了什么。有没有办法告诉make忽略at并输出该行?调试过多,-n选项打印它们,但没有做任何事情(这是干运行)

6 个答案:

答案 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

感谢您提供这个主题,这对我的工作有很大的帮助。