2016-01-21 55 views
2

我想要定時執行make規則,但無法獲得有效的開始和停止時間以及獲得簡單的算術(減法)工作。如何計時執行gnu make規則?

$ make money 
sleep 2 
echo "money: 1453412887" > logfile 
echo "money: 1453412887" >> logfile 
echo "money: 1453412887" >> logfile 

Makefile

money: 
     $(eval start := $(shell date +%s)) 
     sleep 2 
     $(eval end := $(shell date +%s)) 
     echo "[email protected]: ${start}" > logfile 
     echo "[email protected]: ${end}" >> logfile 
     echo "[email protected]: $(shell date +%s)" >> logfile 

回答

2

埃裏克的回答是一個很好的答案,如果你想追蹤一個目標的時間。雖然,沒有理由設置一個單獨的變量;僅回顯命令的輸出就簡單多了。此外,如果你使用的老派反引號,而不是較新的$(...)格式的shell命令可能更容易在一個makefile配方讀取:

test: 
     echo [email protected]: `date +%s` > test.log 
     @sleep 2 
     echo [email protected]: `date +%s` >> test.log 

的原因,你的嘗試不起作用的是,化妝都將評估在配方的行開始第一行之前。因此,整個配方中的所有制造變量和功能(如evalshell等)都會在配方的任何部分開始之前預先展開。因此多次運行date命令的結果將始終相同。

如果您嘗試對所有命令進行計時,並且您不想更改所有配方以保存日誌,則另一種選擇是編寫一個特殊的腳本或程序,它將命令行作爲參數,然後在一個shell中運行該命令。然後設置make SHELL變量來使用該腳本/程序而不是真正的shell。如果你有複雜的食譜(你必須保留所有的引用等),讓它正確地工作將會有點棘手。實際編寫一個C程序並使用fork/exec最簡單:不要在那裏引用問題。但是,這是對它做的最可靠和侵入性最小的方式。

2

請再試以下示例中,

test: 
     @start=$$(date +%s); \ 
     echo [email protected]: $$start > test.log 
     @sleep 2 
     @end=$$(date +%s); \ 
     echo [email protected]: $$end >> test.log 

,一個關鍵產品,殼變量賦值應與echo命令同一條線上。