2014-07-11 67 views
3

在我的庫代碼中我有一堆static_asserts。我想測試他們是否在預期條件下開火。如何使用cmake測試我的庫中的static_assert?

我還想寫了一系列的測試文件和

  • 確保他們無法編譯
  • 檢查從靜態斷言編譯嘗試的預期消息的輸出

有誰知道如何用cmake做到這一點?

AFAICT,try_compile不是答案,因爲它是在運行cmake時執行的。我需要在製作過程中執行這些檢查。

回答

0

幾個實驗,這就是我現在所做的:

add_executable(
    fail_test 
    EXCLUDE_FROM_ALL 
    fail_test.cpp 
) 

add_custom_command(OUTPUT fail_test.out 
    COMMAND ${CMAKE_MAKE_PROGRAM} fail_test > ${CMAKE_CURRENT_BINARY_DIR}/fail_test.out 2>&1 || true 
    COMMAND grep "int i = row.alpha" ${CMAKE_CURRENT_BINARY_DIR}/fail_test.out > /dev/null 
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/fail_test.cpp 
    COMMENT "fail_test" 
    ) 

add_custom_target(test_constraints DEPENDS fail_test.out COMMAND true) 

這是它做什麼:

  1. 編制是應該在編譯失敗的代碼創建目標時間。從默認版本中排除此目標,以免它造成混亂。
  2. 添加一個自定義命令,該命令調用make來執行此故障目標,將編譯器指令流入文件,忽略結果代碼,然後對預期的編譯器消息執行grep s指示由於預期原因導致編譯失敗。
  3. 使自定義命令依賴於源文件,以便在源文件結束時再次測試編譯。
  4. 將自定義命令作爲依賴項添加到自定義目標。

當然,對於更多的測試,步驟1,2和4將進入功能。

所以,現在我可以打電話

make test_constraints 

以測試的東西,我想失敗編譯實際上這樣做。如果事情沒有按預期那樣失敗,我甚至可以撥打

make fail_test 

調整測試或其基礎,直到它失敗爲止。

對於平臺獨立性,自定義命令可能必須進行調整。建議歡迎。

+1

這不是一個跨平臺的解決方案,如果你想在Windows上運行這個代碼,你需要重新設計所有從零開始 –

+0

@ruslo這就是我寫在底部我的文本:-)我仍然認爲這是要走的路,也許使用python腳本而不是當前的bash命令。 – Rumburak

2

您可以爲這些測試設置一個「嵌套」項目,將其配置爲CMake運行的一部分,然後使用cmake --build進行構建;是這樣的:

你正常的CMakeLists.txt:

# ... 
execute_process(
    COMMAND ${CMAKE_COMMAND} path/to/test/project 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/TestProject 
) 

add_test(
    NAME StaticAsserts 
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/TestProject 
    COMMAND ${CMAKE_COMMAND} --build . 
) 
# ... 

當然,測試命令實際上可能是一個包裝腳本運行cmake --build內部和處理它的輸出。

作爲替代方案,您也可以將嵌套項目的配置移動到測試中,也許使用CTest來驅動配置&構建。

+0

由於編譯將失敗TestProject中的每個源文件(我需要失敗),不會'cmake --build'只是救助並讓StaticAsserts測試失敗? – Rumburak

+0

@Rumburak你可以在我提到的包裝腳本中處理它;或者簡單地通過'static_assert()'做一個'add_test()'並且使用像'WILL_FAIL'和'PASS_REGULAR_EXPRESSION'這樣的測試屬性。 – Angew

+0

我承認我希望有一個較少開銷的解決方案,但這肯定會有效:-) – Rumburak

相關問題