2011-05-13 38 views
2

我想在make文件中的每個shell命令上注入一個透明的包裝命令。類似於time shell命令。 (然而,time命令,這是一個完全不同的命令。)你可以在GNU的make中封裝每個命令嗎?

是否有指定某種包裝的或decorator爲GMAKE會針對每shell命令的方法嗎?

+0

當然,適用的包裝中的每個命令。我真的不認爲你可以用一個手勢包裝所有的命令。 – Beta 2011-05-13 22:33:51

+2

你可能會替換你自己的shell來完成包裝(每行)。每個命令都很棘手,因爲這些行是由shell解析的,而不是由make解析的。 – jdigital 2011-05-13 22:34:30

+0

啊,就是這樣做,jdigital。 Bash提供了一種重新轉義命令的方法 - '「$ @」'。我只需要做一些像'my_cmd「$ @」' – 2011-05-13 22:50:23

回答

3

的種類。你可以告訴make使用不同的shell。

SHELL = myshell 

其中myshell就像

#!/bin/sh 
time /bin/sh "$0" "[email protected]" 

但是一個包裝,通常的方式做到這一點是一個可變的參數放在所有命令撥打電話。雖然我看不到SHELL方法的任何顯示停止符,但前綴方法的優點是更靈活(您可以爲不同的命令指定不同的前綴並覆蓋命令行中的前綴值),並且可以更快地顯示。

# Set [email protected] to not display command names 
TIME = time 
foo: 
    $(Q)$(TIME) foo_compiler 

而這裏的一個殼包裝的完整,工作示例:

#!/bin/bash 

RESULTZ=/home/rbroger1/repos/knl/results 
if [ "$1" == "-c" ] ; then 
    shift 
fi 

strace -f -o `mktemp $RESULTZ/result_XXXXXXX` -e trace=open,stat64,execve,exit_group,chdir /bin/sh -c "[email protected]" | awk '{if (match("Process PID=\d+ runs in (64|32) bit",$0) == 0) {print $0}}' 

# EOF 
1

我不認爲有一種方法可以在GNUMake本身內做到你想要的。

我已經做了一些事情,如修改PATH環境變量在Makefile所以用我的腳本鏈接到我想要的包裹箱被執行,而不是實際斌所有名的目錄。然後腳本會查看它是如何調用的,並用包裝的命令執行實際的bin。

即。 exec time "$0" "[email protected]"

這些天,我通常只是更新在Makefile本身的目標。保持對一個文件的所有修改通常比管理鏈接目錄更好。

更新

我推遲到吉爾的回答。這是比我更好的答案。

0

GNU make(1)用於運行命令的程序由SHELL make變量指定。它將運行每個命令

$SHELL -c <command> 

你不能做出不放入-c,因爲這是最需要的炮彈。 -c作爲第一個參數傳遞($1),並且<command>作爲單個參數字符串作爲第二個參數傳遞($2)。

您可以編寫自己的外殼包裝,預先考慮所需的命令,考慮到-c

#!/bin/sh 
eval time "$2" 

這將導致time在每個命令前運行。您需要eval,因爲$2通常不會是單個命令,並且可以包含需要展開或處理的各種shell元字符。

相關問題