在我的庫代碼中我有一堆static_asserts。我想測試他們是否在預期條件下開火。如何使用cmake測試我的庫中的static_assert?
我還想寫了一系列的測試文件和
- 確保他們無法編譯
- 檢查從靜態斷言編譯嘗試的預期消息的輸出
有誰知道如何用cmake做到這一點?
AFAICT,try_compile不是答案,因爲它是在運行cmake時執行的。我需要在製作過程中執行這些檢查。
在我的庫代碼中我有一堆static_asserts。我想測試他們是否在預期條件下開火。如何使用cmake測試我的庫中的static_assert?
我還想寫了一系列的測試文件和
有誰知道如何用cmake做到這一點?
AFAICT,try_compile不是答案,因爲它是在運行cmake時執行的。我需要在製作過程中執行這些檢查。
幾個實驗,這就是我現在所做的:
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)
這是它做什麼:
make
來執行此故障目標,將編譯器指令流入文件,忽略結果代碼,然後對預期的編譯器消息執行grep
s指示由於預期原因導致編譯失敗。當然,對於更多的測試,步驟1,2和4將進入功能。
所以,現在我可以打電話
make test_constraints
以測試的東西,我想失敗編譯實際上這樣做。如果事情沒有按預期那樣失敗,我甚至可以撥打
make fail_test
調整測試或其基礎,直到它失敗爲止。
對於平臺獨立性,自定義命令可能必須進行調整。建議歡迎。
您可以爲這些測試設置一個「嵌套」項目,將其配置爲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來驅動配置&構建。
這不是一個跨平臺的解決方案,如果你想在Windows上運行這個代碼,你需要重新設計所有從零開始 –
@ruslo這就是我寫在底部我的文本:-)我仍然認爲這是要走的路,也許使用python腳本而不是當前的bash命令。 – Rumburak