Makefile 为冗长制定规则
通常,我们在一个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 这两种解决方案都可以接受还是
%.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
- 所有其他配方行不以
作为前缀@
- 我添加了
psuedo目标,使输出在默认情况下保持静默.SILENT:
- 我使用变量引用作为
psuedo目标的前缀(或后缀),如.SILENT:
$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
- 所有其他配方行不以
作为前缀@
- 我添加了
psuedo目标,使输出在默认情况下保持静默.SILENT:
- 我使用变量引用作为
psuedo目标的前缀(或后缀),如.SILENT:
$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
- 所有其他配方行不以
作为前缀@
- 我添加了
psuedo目标,使输出在默认情况下保持静默.SILENT:
- 我使用变量引用作为
psuedo目标的前缀(或后缀),如.SILENT:
$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
- 所有其他配方行不以
作为前缀@
- 我添加了
psuedo目标,使输出在默认情况下保持静默.SILENT:
- 我使用变量引用作为
psuedo目标的前缀(或后缀),如.SILENT:
$V
%.o: %.c
@echo '$(cc): $< --> $@'
$(cc) $(flags) -o $@ -c $<
$V.SILENT:
%.o:%.c
@回显“$(cc):$<-->$@”
$(cc)$(标志)-o$@-c$<
$V.SILENT:
现在默认情况下未设置
V
,因此最后一行扩展到,并且不显示配方命令。如果我运行make V=1
(或任何其他值),那么目标将扩展到1。无提示:
,这没有什么特别之处,因此基本上被忽略,并且所有没有前缀@
的命令都会被打印出来。太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢。太好了,这正是我想要的。谢谢