2015-06-22 63 views
0

的美容规则通常我们有这样的一个Makefile为冗长

%.o:%.c 
    $(cc) $(flags) -o [email protected] -c $< 

当标志的量是巨大的,我感觉好多了写这个不是

%.o:%.c 
    $(info $(cc): $< --> [email protected]) 
    @$(cc) $(flags) -o [email protected] -c $< 

但是它可以是有用的有时会看到一切。所以我定义的变量为:

[email protected] 

%.o:%.c 
    $(info $(cc): $< --> [email protected]) 
    $(at)$(cc) $(flags) -o [email protected] -c $< 

我的问题是如何正确,轻松设置或命令行取消设置$(at)。我看到了两个解决方案:

$ make verbose all 
$ make verbose=1 all 

随着第一个解决方案,我会做这个

ifeq (,$(filter verbose,$(MAKECMDGOALS))) 
[email protected] 
dummy:=$(filter-out verbose,$(MAKECMDGOALS))) 
endif 

随着第二我可以这样做

ifeq (,$(filter 1,$(verbose))) 
[email protected] 
endif 

是这两种解决方案可以接受或者我可以做的更好?

回答

2

我一般设置我的生成文件是这样的:

  • 方行,我知道我将永远不会希望看到报道的命令与@开始(通常这只是任何echo陈述或其它类似的元语句)。
  • 所有其他配方行不用前缀@
  • 我添加了.SILENT: psuedo-target以使输出默认为无声。
  • 我使用可变引用前缀(或后缀).SILENT:伪目标,如$V

所以,这样的事情:

%.o: %.c 
     @echo '$(cc): $< --> [email protected]' 
     $(cc) $(flags) -o [email protected] -c $< 

$V.SILENT: 

现在默认V没有设置,所以最后一行扩展到.SILENT special target并没有配方命令显示。如果我运行make V=1(或任何其他值),那么目标扩大到1.SILENT:,这是没有什么特别的,因此基本上被忽略,并且我的所有命令都没有前缀@被打印。

+0

非常好,这就是我一直在寻找的。谢谢。 – nowox