2010-10-05 81 views

回答

16

作出這樣的具有@默認值的變量:

AT := @ 

,然後用它在你的Makefile

foo: 
    $(AT)fooc -o [email protected] 

然後運行make作爲make AT=。你可以得到比愛好者,如果你喜歡:

V := 0 
AT_0 := @ 
AT_1 := 
AT = $(AT_$(V)) 

這將使無聲的命令,除非V設置爲1(例如,make V=1)。這使用非POSIX,但遞歸變量擴展的共同特徵。

+0

您也可以在'AT ='行中使用':='而不是'='。我不記得了。 – 2010-10-06 11:23:16

+0

+1爲酷招 – 2010-10-10 12:18:27

2

在GNU Make中,這是不可能的。有一個Makefile這是非可配置的完全沉默只是不好的做法。刪除@標誌並使用-s運行是獲得靜默構建的最簡單方法(可能的echo命令除外)。

+0

使用可配置的冗長來製作Makefile是可能的(也是容易的)。 linux內核執行此操作,就像'automake'生成的帶'AM_SILENT_RULES'的'Makefile'一樣。 – 2010-10-05 13:37:08

+0

不錯的訣竅和值得接受的答案,但我的言論立場。 – 2010-10-06 12:16:47

+0

是的。如果你做了一些微不足道的修改,我會刪除我的downvote。 – 2010-10-10 04:55:01

7

你可以有化妝告訴別人打印的命令,它們被執行,這是同樣的事情:

make SHELL='/bin/sh -x' ...your make arguments... 

但是這不會工作這麼好,如果你的makefile包含shell腳本片段作爲配方,而不是單獨的簡單命令序列,因爲在調用它們時遇到單個shell命令而不是整個片段。

或者,你實際上可以利用GNU自由軟件的性質製作並砍了自己的版本,忽略@跡象。清理GNU Make的源代碼COMMANDS_SILENT很快就會告訴你只要在message()調用的參數中添加1 ||?:的條件中就可以了start_job_command()job.c。任務完成!

+0

+1表示願意潛入源碼。免費軟件非常棒。 – 2010-10-10 04:55:47

2

取出所有的@這行添加到Makefile:

.SILENT:

當你要調試,註釋掉.SILENT線。

+0

也是一個不錯的主意。 +1 – 2011-07-22 10:07:35

0

在make腳本前禁用@是有用的,但是當make腳本非常長時,它有時會過於嘈雜。另一種調試技術是打開一個shell命令,在它們執行之前回應命令。這消除了操作@或.SILENT的需要。考慮這樣一個例子生成文件:

這可能是不可移植的,因爲它依賴於存在於執行腳本的外殼的功能,但便攜性是不是真的用於調試那麼重要(如果你的作品)。

0

爲了使事情更具可配置性,允許make開關啓用詳細程度。它默認情況下正常靜音模式。只有具有-e VERBOSE = 1模式,這將是冗長的,當然:

## 
# Verbose ENABLE/DISABLE 
# invoke make -e VERBOSE=1 
## 
[email protected] 
ifeq ($(VERBOSE),1) 
    V= 
endif 

all: 
    $(V)echo test 
    echo test 

感謝您對這個主題是對我的工作有很大的幫助。