2011-05-11 99 views
10

我需要找出哪些翻譯單元需要重新編譯以提高編譯時間,我如何使用cmake爲我的翻譯單元獲得編譯時間?cmake:編譯統計

+0

正如我一直認爲'cmake'只爲本機構建系統(make,nmake等)生成conf文件。所以cmake實際上並沒有涉及編譯/鏈接過程。也許你應該在你的本地構建系統中尋找這樣的選項。 – beduin 2011-05-11 11:06:37

+0

這是一個相當常見的用例。但是,如果你知道如何爲標準的linux製作,那將是最有幫助的。 – 2011-05-11 12:24:07

+2

不幸的是,我不知道有任何製作選項可以實現這一點。我想到的第一個解決方案是修改'Makefiles'來爲每個'gcc'命令調用'time'。 – beduin 2011-05-11 13:18:12

回答

8

我希望用'time original-cmd'代替編譯器(和/或連接器)。使用簡單的'make',我會說:

make CC="time gcc" 

'時間'程序將運行命令並報告所花費的時間。等效機制將與'cmake'一起工作。如果你需要捕獲命令和時間,那麼你可以編寫你自己的類似於時間的命令(一個shell腳本會這樣做),以你想要的方式記錄你想要的數據。

+0

通常'時間'是內置命令。要使用詳細模式,需要鍵入'make CC =「/ usr/bin/time -v gcc」'命令。 – Orient 2015-12-07 11:49:32

+0

您不能通過編譯器以這種方式爲CMake生成的make文件傳遞編譯器。通常它不起作用。 – usr1234567 2017-06-29 14:54:33

4

要在以前的答案擴大,這裏就是我剛寫了一個具體的解決方案 - 這是說,在實踐中肯定工程,不僅在理論上,而且大約三分鐘已經使用僅由一人,所以它可能有一些不足之處。

#!/bin/bash 
{ time clang "[email protected]"; } 2> >(cat <(echo "clang [email protected]") - >> /tmp/results.txt) 

我把/tmp/time-clang上述兩行,然後跑

chmod +x /tmp/time-clang 
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang 
make 

您可以使用-DCMAKE_CXX_COMPILER=掛鉤C++編譯器在完全相同的方式。

  • 我沒有使用make -j8,因爲我不想要的結果,以怪異的方式獲得交錯。

  • 我不得不在我的腳本上放置一個明確的hashbang #!/bin/bash,因爲Ubuntu 12.04上的默認shell(dash,我想?)對這些重定向操作符不滿意。

+0

這對我很好,謝謝!然而,我試圖(並且掙扎)只從'time'中提取'real'輸出,並將它和clang命令*一起打印到* results.txt中? – 2017-06-28 22:13:33

11

以下屬性可以用來實時編譯器和鏈接器調用:

,這些屬性可以全局設置,每個目錄和每個目標。這樣你就只能有一部分目標(比如測試)受到這個屬性的影響。你也可以爲每個目標有不同的「發射器」,這也可能是有用的。

請記住,在使用「時間」並不能直接移植,因爲這個實用程序不可由CMake的支持的所有平臺。但是,CMake在其command-line tool mode中提供了「時間」功能。例如:

# Set global property (all targets are impacted) 
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 
# Set property for my_target only 
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") 

例CMake的輸出:

[ 65%] Built target my_target 
[ 67%] Linking C executable my_target 
Elapsed time: 0 s. (time), 0.000672 s. (clock) 

注意,作爲CMake的3.4的僅生成文件和忍發電機支持此性質。

還要注意,因爲CMake的3.4 cmake -E time的具有內部參數的空間問題。例如:

cmake -E time cmake "-GUnix" "Makefiles" 

我提交patch修復此問題:

cmake -E time cmake "-GUnix Makefiles" 

會被解釋。

+0

接受的答案對我來說沒有任何作用,但是這個做了。 – fpnick 2017-01-16 20:36:48

+0

這有另一個問題:'$ {CMAKE_COMMAND}'在窗口上有空格,並且不會按建議工作 – Pavel 2017-03-05 21:34:59

+0

@Pavel你可以加引號:'set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE「\」$ {CMAKE_COMMAND} \「-E time 「)' – 865719 2017-11-10 17:12:01