我想在make文件中的每個shell命令上注入一個透明的包裝命令。類似於time
shell命令。 (然而,不的time
命令,這是一個完全不同的命令。)你可以在GNU的make中封裝每個命令嗎?
是否有指定某種包裝的或decorator爲GMAKE會針對每shell命令的方法嗎?
我想在make文件中的每個shell命令上注入一個透明的包裝命令。類似於time
shell命令。 (然而,不的time
命令,這是一個完全不同的命令。)你可以在GNU的make中封裝每個命令嗎?
是否有指定某種包裝的或decorator爲GMAKE會針對每shell命令的方法嗎?
的種類。你可以告訴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
我不認爲有一種方法可以在GNUMake本身內做到你想要的。
我已經做了一些事情,如修改PATH環境變量在Makefile所以用我的腳本鏈接到我想要的包裹箱被執行,而不是實際斌所有名的目錄。然後腳本會查看它是如何調用的,並用包裝的命令執行實際的bin。
即。 exec time "$0" "[email protected]"
這些天,我通常只是更新在Makefile本身的目標。保持對一個文件的所有修改通常比管理鏈接目錄更好。
更新
我推遲到吉爾的回答。這是比我更好的答案。
GNU make(1)
用於運行命令的程序由SHELL
make變量指定。它將運行每個命令
$SHELL -c <command>
你不能做出不放入-c
,因爲這是最需要的炮彈。 -c
作爲第一個參數傳遞($1
),並且<command>
作爲單個參數字符串作爲第二個參數傳遞($2
)。
您可以編寫自己的外殼包裝,預先考慮所需的命令,考慮到-c
:
#!/bin/sh
eval time "$2"
這將導致time
在每個命令前運行。您需要eval
,因爲$2
通常不會是單個命令,並且可以包含需要展開或處理的各種shell元字符。
當然,適用的包裝中的每個命令。我真的不認爲你可以用一個手勢包裝所有的命令。 – Beta 2011-05-13 22:33:51
你可能會替換你自己的shell來完成包裝(每行)。每個命令都很棘手,因爲這些行是由shell解析的,而不是由make解析的。 – jdigital 2011-05-13 22:34:30
啊,就是這樣做,jdigital。 Bash提供了一種重新轉義命令的方法 - '「$ @」'。我只需要做一些像'my_cmd「$ @」' – 2011-05-13 22:50:23