2016-08-10 91 views
12

有沒有方法可以檢查cmake在失敗的運行中正在做什麼?例如,我有一個程序取決於libbacktrace,我可以鏈接到gcc foo.c -lbacktrace。但是,當我寫一個CMakeLists.txt如何跟蹤CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 
find_library (BACKTRACE_LIBRARY backtrace) 
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY}) 

,並鍵入cmake <path>,它打印出BACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUND

我該如何解決問題出在哪裏?在放棄尋找libbacktrace之前執行了哪些命令cmake?它執行任何事情嗎?在autoconf中,這些命令全部記錄在config.log中,但本例中的CMakeOutput.log爲空。同樣,cmake --trace只會在一堆系統cmake文件之後迴應CMakeLists.txt的內容,在這種情況下無用。

請注意,我沒有在尋找一種方法來調用find_library這個特定的工作 - 這只是一個例子。我的問題是:我有一個CMakeLists.txt不能按預期工作;有什麼工具可以幫助我找出失敗的原因和原因?

+0

只是一個提示:我爲這些問題啓動了一個[「測試和調試」文檔主題](http://stackoverflow.com/documentation/cmake/4098/test-and-debug)。 – Florian

回答

7

no CMake debugger or similar¹。你可以做的是:

  1. 閱讀CMake的輸出,有時它已經提供了類似「失蹤INCLUDE_MYLIB_DIR」)的提示。刪除你CMakeCache.txt和/或刪除build目錄,確保你不會錯過輸出,因爲結果被緩存了。重複並檢查緩存是否有影響。你可以用-Wdev得到更多的警告(對於CMake腳本的作者/開發者,而不是用戶)。更有用的選項是--warn-uninitialized,--warn-unused-vars--check-system-vars,請參閱documentation瞭解更多詳情。

  2. 檢查生成的文件,如CMakeCache.txt以及您生成的其他文件,如config.h或Doxygen的輸入文件。具有您期望值不同的值的變量是進一步研究的指標。

  3. 查看CMakeFiles子目錄中的CMakeError.log和CMakeOuput.log。不幸的是,許多測試不會寫入這些文件,但有些可以。例如,C編譯器運行將編譯器輸出放在那裏,這有助於發現意外標誌或錯誤(交叉)編譯器的問題。使用printf進行調試。這意味着當您大致瞭解問題所在的位置時,請輸入message的中間變量。如果您不知道分支或子表達式(帶有AND或OR的表達式的一部分)是如何評估的,那麼這很有用。此外,您可以將消息如「在mylib版本大於3.2的分支中」以遵循工作流程。

  4. 降低複雜性。拋出你不知道的所有東西,直到你的問題消失。再次添加這些東西,直到問題再次出現。有時候用一個最小的例子開始一個新的模塊來重現問題會更容易。令人驚訝的是,這通常有助於查明問題。

  5. 使用--debug-output(用於調試輸出)--trace(完整跟蹤)和--trace-expand(跟蹤和擴展變量)進行調試。對於這些,在第5點中取得進展是非常有幫助的,因爲否則輸出將會讓你感到不適。

¹,好的,有steveire的CMake Daemon Tools。我自己並沒有使用它們,但他們聲稱提供了內省的可能性,這似乎與調試器非常接近。
編輯:他們現在被稱爲CMake-server並將成爲CMake 3.7的一部分。您可以預期許多工具和IDE都會選擇並改進我們開發CMake的方式。

3

除了提到的國旗--trace(和它的可變擴展兄弟--trace-expand)有--debug-output

從文檔:在調試模式

--debug-output
認沽cmake的。

使用消息(send_error)調用在cmake運行期間打印額外信息,如堆棧跟蹤。

這可能會給你想要的信息。也許與--trace結合使用。

+0

不幸的是,'--trace-expand --debug-output'只是以更多不同的方式迴應'CMakeLists.txt'中的行,這可能有助於確定cmake失敗的位置。但我更感興趣的是我已經知道哪一行失敗了,我想了解更多關於cmake在後臺執行哪些操作的信息。 –

+0

你可以做的唯一事情就是,根據'find_library'確實是什麼的知識,手動(不在CMake中)查找記錄的路徑。 ' -NOTFOUND'是所有CMake都會在腳本中給你的。 –