步驟 5:安裝與測試¶
練習 1 - 安裝規則¶
通常,僅僅構建一個可執行檔是不夠的,它還應該是可安裝的。使用 CMake,我們可以透過 install()
命令來指定安裝規則。在 CMake 中支援本地安裝通常就像指定安裝位置以及要安裝的目標和檔案一樣簡單。
目標¶
安裝 Tutorial
可執行檔和 MathFunctions
函式庫。
有用的材料¶
要編輯的檔案¶
MathFunctions/CMakeLists.txt
CMakeLists.txt
開始入門¶
起始程式碼在 Step5
目錄中提供。在本練習中,完成 TODO 1
到 TODO 4
。
首先,更新 MathFunctions/CMakeLists.txt
以將 MathFunctions
和 tutorial_compiler_flags
函式庫安裝到 lib
目錄。在同一個檔案中,指定安裝規則,將 MathFunctions.h
安裝到 include
目錄。
然後,更新頂層的 CMakeLists.txt
以將 Tutorial
可執行檔安裝到 bin
目錄。最後,任何標頭檔都應安裝到 include
目錄。請記住,TutorialConfig.h
位於 PROJECT_BINARY_DIR
中。
建置與執行¶
建立一個名為 Step5_build
的新目錄。執行 cmake
可執行檔或 cmake-gui
來配置專案,然後使用您選擇的建置工具來建置它。
然後,使用 --install
選項的 cmake
命令(在 3.15 中引入,舊版本的 CMake 必須使用 make install
)從命令列執行安裝步驟。此步驟將安裝適當的標頭檔、函式庫和可執行檔。例如
cmake --install .
對於多配置工具,別忘了使用 --config
參數來指定配置。
cmake --install . --config Release
如果使用 IDE,只需建置 INSTALL
目標即可。您可以從命令列建置相同的安裝目標,如下所示
cmake --build . --target install --config Debug
CMake 變數 CMAKE_INSTALL_PREFIX
用於確定檔案將要安裝的根目錄。如果使用 cmake --install
命令,則可以使用 --prefix
參數覆蓋安裝前綴。例如
cmake --install . --prefix "/home/myuser/installdir"
導覽到安裝目錄並驗證已安裝的 Tutorial
是否可以執行。
解決方案¶
我們專案的安裝規則相當簡單
對於
MathFunctions
,我們希望將函式庫和標頭檔分別安裝到lib
和include
目錄。對於
Tutorial
可執行檔,我們希望將可執行檔和已配置的標頭檔分別安裝到bin
和include
目錄。
因此,在 MathFunctions/CMakeLists.txt
的末尾,我們新增
TODO 1:點擊以顯示/隱藏答案
set(installable_libs MathFunctions tutorial_compiler_flags)
if(TARGET SqrtLibrary)
list(APPEND installable_libs SqrtLibrary)
endif()
install(TARGETS ${installable_libs} DESTINATION lib)
以及
TODO 2:點擊以顯示/隱藏答案
install(FILES MathFunctions.h DESTINATION include)
用於 Tutorial
可執行檔和已配置標頭檔的安裝規則類似。在頂層 CMakeLists.txt
的末尾,我們新增
TODO 3,4:點擊以顯示/隱藏答案
install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)
這就是建立教學課程基本本地安裝所需的一切。
練習 2 - 測試支援¶
CTest 提供了一種輕鬆管理專案測試的方法。可以透過 add_test()
命令新增測試。儘管本教學課程未明確涵蓋,但 CTest 與其他測試框架(例如 GoogleTest
)之間存在許多相容性。
目標¶
使用 CTest 為我們的可執行檔建立單元測試。
有用的材料¶
要編輯的檔案¶
CMakeLists.txt
開始入門¶
起始原始碼在 Step5
目錄中提供。在本練習中,完成 TODO 5
到 TODO 9
。
首先,我們需要啟用測試。接下來,開始使用 add_test()
將測試新增到我們的專案中。我們將逐步完成新增 3 個簡單的測試,然後您可以根據需要新增其他測試。
建置與執行¶
導覽到建置目錄並重新建置應用程式。然後,執行 ctest 可執行檔:ctest -N
和 ctest -VV
。對於多配置產生器(例如 Visual Studio),必須使用 -C <mode>
旗標指定配置類型。例如,若要在 Debug 模式下執行測試,請從建置目錄(而不是 Debug 子目錄!)使用 ctest -C Debug -VV
。Release 模式將從相同位置執行,但使用 -C Release
。或者,從 IDE 建置 RUN_TESTS
目標。
解決方案¶
讓我們測試我們的應用程式。在頂層 CMakeLists.txt
檔案的末尾,我們首先需要使用 enable_testing()
命令啟用測試。
TODO 5:點擊以顯示/隱藏答案
enable_testing()
啟用測試後,我們將新增一些基本測試,以驗證應用程式是否正常運作。首先,我們使用 add_test()
建立一個測試,該測試使用傳入的參數 25 執行 Tutorial
可執行檔。對於此測試,我們不打算檢查可執行檔計算出的答案。此測試將驗證應用程式是否執行、是否沒有區段錯誤或其他崩潰,並且具有零傳回值。這是 CTest 測試的基本形式。
TODO 6:點擊以顯示/隱藏答案
add_test(NAME Runs COMMAND Tutorial 25)
接下來,讓我們使用 PASS_REGULAR_EXPRESSION
測試屬性來驗證測試的輸出是否包含某些字串。在本例中,驗證在提供不正確的參數數量時是否列印了使用訊息。
TODO 7:點擊以顯示/隱藏答案
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
)
我們將新增的下一個測試驗證計算值是否確實是平方根。
TODO 8:點擊以顯示/隱藏答案
add_test(NAME StandardUse COMMAND Tutorial 4)
set_tests_properties(StandardUse
PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2"
)
單單這一個測試不足以讓我們確信它適用於所有傳入的值。我們應該新增更多測試來驗證這一點。為了輕鬆新增更多測試,我們建立一個名為 do_test
的函式,該函式執行應用程式並驗證針對給定輸入計算出的平方根是否正確。對於每次調用 do_test
,都會根據傳遞的參數向專案新增另一個具有名稱、輸入和預期結果的測試。
TODO 9:點擊以顯示/隱藏答案
function(do_test target arg result)
add_test(NAME Comp${arg} COMMAND ${target} ${arg})
set_tests_properties(Comp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result}
)
endfunction()
# do a bunch of result based tests
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is (-nan|nan|0)")
do_test(Tutorial 0.0001 "0.0001 is 0.01")