今天會學到:
如何在 CMake 專案中加上 單元測試(CTest)
如何用 cpack 打包專案(例如壓縮檔 / deb / rpm)
如何把 CMake 專案放到 CI/CD pipeline(如 GitHub Actions)裡自動編譯與測試
步驟
在 CMakeLists.txt 裡加上:
include(CTest)
enable_testing()
add_executable(test_dog tests/test_dog.c)
target_link_libraries(test_dog PRIVATE dog_meme)
add_test(NAME dog_meme_add_test COMMAND test_dog)
這樣 ctest 就會知道要跑 test_dog 這個測試。
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
ctest --test-dir build --output-on-failure
ctest 會自動尋找 add_test() 註冊過的測試並執行
--output-on-failure 可以在測試失敗時輸出詳細 log
在 CMakeLists.txt 末尾加入:
include(CPack)
set(CPACK_PACKAGE_NAME "dog_meme")
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
set(CPACK_GENERATOR "TGZ") # 可改成 DEB;RPM;NSIS;DMG 等
打包指令:
cpack --config build/CPackConfig.cmake
會輸出類似:
dog_meme-1.0.0-Linux.tar.gz
在專案 .github/workflows/cmake.yml
放:
name: CMake CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Configure
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
- name: Build
run: cmake --build build --parallel
- name: Test
run: ctest --test-dir build --output-on-failure
- name: Package
run: cpack --config build/CPackConfig.cmake
這樣每次 push 就會:
➡ 自動跑 cmake 編譯
➡ 自動執行測試
➡ 自動打包產物
小結
CTest
= 測試框架(整合單元測試)
CPack
= 打包工具(跨平台支援多種格式)
串接 CI/CD 後,整個專案從編譯、測試、打包 → 全自動化