通常我们在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
两种解决方案都可以接受,还是我可以做得更好?
答案 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:
,这不是什么特别的事情,因此基本上被忽略了,而且我的所有命令都没有以@
为前缀印刷。