冗长的制定规则

时间:2015-06-22 08:57:27

标签: makefile

通常我们在Makefile中有这个

%.o:%.c
    $(cc) $(flags) -o $@ -c $<

当标志数量巨大时,我觉得最好写这个

%.o:%.c
    $(info $(cc):   $<  --> $@)
    @$(cc) $(flags) -o $@ -c $<

然而,有时看到一切都很有用。所以我为此定义了一个变量:

at=@

%.o:%.c
    $(info $(cc):   $<  --> $@)
    $(at)$(cc) $(flags) -o $@ -c $<

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

$ make verbose all
$ make verbose=1 all

使用第一个解决方案,我会这样做

ifeq (,$(filter verbose,$(MAKECMDGOALS)))
at=@
dummy:=$(filter-out verbose,$(MAKECMDGOALS)))
endif

第二个我可能会这样做

ifeq (,$(filter 1,$(verbose)))
at=@
endif

两种解决方案都可以接受,还是我可以做得更好?

1 个答案:

答案 0 :(得分:3)

我通常设置我的makefile:

  • 我知道的配方行我永远不会希望看到报告的命令以@开头(通常这只是任何echo语句或其他类似的元声明。)
  • 所有其他食谱行不以@为前缀。
  • 我添加了.SILENT:伪目标,默认情况下使输出无声。
  • 我使用变量引用作为.SILENT:伪目标的前缀(或后缀),例如$V

所以,像这样:

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

$V.SILENT:

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