Makefile 为冗长制定规则

Makefile 为冗长制定规则,makefile,Makefile,通常,我们在一个Makefile中有这个文件 %.o:%.c $(cc) $(flags) -o $@ -c $< 对于第一个解决方案,我会这样做 ifeq (,$(filter verbose,$(MAKECMDGOALS))) at=@ dummy:=$(filter-out verbose,$(MAKECMDGOALS))) endif 第二次我可能会这么做 ifeq (,$(filter 1,$(verbose))) at=@ endif 这两种解决方案都可以接受还是

通常,我们在一个Makefile中有这个文件

%.o:%.c
    $(cc) $(flags) -o $@ -c $<
对于第一个解决方案,我会这样做

ifeq (,$(filter verbose,$(MAKECMDGOALS)))
at=@
dummy:=$(filter-out verbose,$(MAKECMDGOALS)))
endif
第二次我可能会这么做

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

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

我通常会这样设置我的makefile:

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

$V.SILENT:
  • 我知道我永远不想看到报告的命令以
    @
    开头的配方行(通常这只是任何
    echo
    语句或其他类似的元语句)
  • 所有其他配方行不以
    @
    作为前缀
  • 我添加了
    .SILENT:
    psuedo目标,使输出在默认情况下保持静默
  • 我使用变量引用作为
    .SILENT:
    psuedo目标的前缀(或后缀),如
    $V
比如说:

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

$V.SILENT:
%.o:%.c
@回显“$(cc):$<-->$@”
$(cc)$(标志)-o$@-c$<
$V.SILENT:

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

我通常会这样设置我的make文件:

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

$V.SILENT:
  • 我知道我永远不想看到报告的命令以
    @
    开头的配方行(通常这只是任何
    echo
    语句或其他类似的元语句)
  • 所有其他配方行不以
    @
    作为前缀
  • 我添加了
    .SILENT:
    psuedo目标,使输出在默认情况下保持静默
  • 我使用变量引用作为
    .SILENT:
    psuedo目标的前缀(或后缀),如
    $V
比如说:

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

$V.SILENT:
%.o:%.c
@回显“$(cc):$<-->$@”
$(cc)$(标志)-o$@-c$<
$V.SILENT:

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

我通常会这样设置我的make文件:

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

$V.SILENT:
  • 我知道我永远不想看到报告的命令以
    @
    开头的配方行(通常这只是任何
    echo
    语句或其他类似的元语句)
  • 所有其他配方行不以
    @
    作为前缀
  • 我添加了
    .SILENT:
    psuedo目标,使输出在默认情况下保持静默
  • 我使用变量引用作为
    .SILENT:
    psuedo目标的前缀(或后缀),如
    $V
比如说:

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

$V.SILENT:
%.o:%.c
@回显“$(cc):$<-->$@”
$(cc)$(标志)-o$@-c$<
$V.SILENT:

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

我通常会这样设置我的make文件:

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

$V.SILENT:
  • 我知道我永远不想看到报告的命令以
    @
    开头的配方行(通常这只是任何
    echo
    语句或其他类似的元语句)
  • 所有其他配方行不以
    @
    作为前缀
  • 我添加了
    .SILENT:
    psuedo目标,使输出在默认情况下保持静默
  • 我使用变量引用作为
    .SILENT:
    psuedo目标的前缀(或后缀),如
    $V
比如说:

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

$V.SILENT:
%.o:%.c
@回显“$(cc):$<-->$@”
$(cc)$(标志)-o$@-c$<
$V.SILENT:

现在默认情况下未设置
V
,因此最后一行扩展到,并且不显示配方命令。如果我运行
make V=1
(或任何其他值),那么目标将扩展到
1。无提示:
,这没有什么特别之处,因此基本上被忽略,并且所有没有前缀
@
的命令都会被打印出来。

太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢