iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 28

[Day 28] [cmake] 測試與持續整合 (CTest + CPack + CI/CD)

  • 分享至 

  • xImage
  •  

今天會學到:

如何在 CMake 專案中加上 單元測試(CTest)

如何用 cpack 打包專案(例如壓縮檔 / deb / rpm)

如何把 CMake 專案放到 CI/CD pipeline(如 GitHub Actions)裡自動編譯與測試

步驟

  1. 啟用 CTest

在 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 這個測試。

  1. 執行測試
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

  1. 打包(CPack)

在 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
  1. 串接 CI/CD(GitHub Actions 範例)

在專案 .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 後,整個專案從編譯、測試、打包 → 全自動化


上一篇
[Day 27] [cmake] 總整理
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言