CMake เจ…เจคเฉ‡ C++ เจนเจฎเฉ‡เจธเจผเจพ เจฒเจˆ เจญเจฐเจพ เจนเจจ

CMake เจ…เจคเฉ‡ C++ เจนเจฎเฉ‡เจธเจผเจพ เจฒเจˆ เจญเจฐเจพ เจนเจจ

เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจฎเฉˆเจ‚ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ, เจฎเฉ‹เจก เจฌเจฃเจพเจ‰เจฃเจพ, เจจเจฟเจฐเจญเจฐเจคเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจ•เจฐเจจเจพ, เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจเจพ, เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจจเฉ‚เฉฐ เจฎเจพเจชเจฃเจพ, เจ•เจตเจฐเฉ‡เจœ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ, เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ, เจ†เจฆเจฟ เจ•เจฐเจจเจพ เจชเจธเฉฐเจฆ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš เจธเฉ€เจฎเฉ‡เจ• เจจเฉ‚เฉฐ เจชเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจน เจธเจญ เจ•เฉเจ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจฎเฉˆเจ‚ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚.

เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เจ• เจธเฉ€เจฎเฉ‡เจ• เจฆเฉ€ เจ†เจฒเฉ‹เจšเจจเจพ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ…เจ•เจธเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจนเฉฑเจ•เจฆเจพเจฐ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจชเจฐ เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจธเจญ เจ•เฉเจ เจ‡เฉฐเจจเจพ เจฌเฉเจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจฌเจฟเจฒเจ•เฉเจฒ เจตเฉ€ เจฌเฉเจฐเจพ เจจเจนเฉ€เจ‚, เจ…เจคเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ€ เจฆเจฟเจธเจผเจพ เจ•เจพเจซเจผเฉ€ เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจนเฉˆ.

เจ‡เจธ เจจเฉ‹เจŸ เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจฆเฉฑเจธเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจธเฉ€เจฎเฉ‡เจ• เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš C++ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฟเจฐเจฒเฉ‡เจ– เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ:

  1. เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€;
  2. เจ†เจŸเฉ‹เจฐเจจ เจŸเฉˆเจธเจŸ;
  3. เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจฎเจพเจช;
  4. เจธเจฅเจพเจชเจจเจพ;
  5. เจธเจตเฉˆ-เจฆเจธเจคเจพเจตเฉ‡เจœเจผ;
  6. เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจชเฉ€เฉœเฉเจนเฉ€;
  7. เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ.

เจ•เฉ‹เจˆ เจตเฉ€ เจœเฉ‹ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจซเจพเจ‡เจฆเฉ‡ เจจเฉ‚เฉฐ เจธเจฎเจเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเฉ€-เจฎเฉ‡เจ• เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹เฅค


เจธเจฎเฉฑเจ—เจฐเฉ€

  1. เจ…เฉฐเจฆเจฐเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ
    1. เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจคเจฐ
    2. เจฎเฉเฉฑเจ– CMake เจซเจพเจˆเจฒ (./CMakeLists.txt)
      1. เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€
      2. เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเจ•เจฒเจช
      3. เจธเฉฐเจ•เจฒเจจ เจตเจฟเจ•เจฒเจช
      4. เจฎเฉเฉฑเจ– เจฎเฉฐเจคเจต
      5. เจธเฉˆเจŸเจฟเฉฐเจ—
      6. เจŸเฉˆเจธเจŸ
      7. เจฆเจธเจคเจพเจตเฉ‡เจœเจผ
      8. เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเจพเจ•เจธ
    3. เจŸเฉˆเจธเจŸ เจธเจ•เฉเจฐเจฟเจชเจŸ (test/CMakeLists.txt)
      1. เจŸเฉˆเจธเจŸเจฟเฉฐเจ—
      2. เจ•เฉ‹เจŸเจฟเฉฐเจ—
    4. เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸ (doc/CMakeLists.txt)
    5. เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸ (online/CMakeLists.txt)
  2. เจฌเจพเจนเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ
    1. เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€
      1. เจชเฉ€เฉœเฉเจนเฉ€
      2. เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€
    2. เจšเฉ‹เจฃเจพเจ‚
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจŸเฉ€เจšเฉ‡
      1. เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš
      2. mylib-unit-tests
      3. เจšเฉˆเฉฑเจ•
      4. เจ•เจตเจฐเฉ‡เจœ
      5. doc
      6. เจตเฉˆเจ‚เจกเจฌเจพเจ•เจธ
    4. เจฎเจฟเจธเจพเจฒ
  3. เจธเฉฐเจฆ
  4. เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ
  5. เจฌเจพเจ…เจฆ

เจ…เฉฐเจฆเจฐเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจคเจฐ

.
โ”œโ”€โ”€ CMakeLists.txt
โ”œโ”€โ”€ README.en.md
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ doc
โ”‚   โ”œโ”€โ”€ CMakeLists.txt
โ”‚   โ””โ”€โ”€ Doxyfile.in
โ”œโ”€โ”€ include
โ”‚   โ””โ”€โ”€ mylib
โ”‚       โ””โ”€โ”€ myfeature.hpp
โ”œโ”€โ”€ online
โ”‚   โ”œโ”€โ”€ CMakeLists.txt
โ”‚   โ”œโ”€โ”€ mylib-example.cpp
โ”‚   โ””โ”€โ”€ wandbox.py
โ””โ”€โ”€ test
    โ”œโ”€โ”€ CMakeLists.txt
    โ”œโ”€โ”€ mylib
    โ”‚   โ””โ”€โ”€ myfeature.cpp
    โ””โ”€โ”€ test_main.cpp

เจ…เจธเฉ€เจ‚ เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจธเฉ€เจฎเฉ‡เจ• เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ‰เจนเจจเจพเจ‚ เจฌเจพเจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค เจฌเจพเจ•เฉ€ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉ‹เจˆ เจตเฉ€ เจธเจฟเฉฑเจงเจพ เจฆเฉ‡เจ– เจธเจ•เจฆเจพ เจนเฉˆ เจŸเฉˆเจฎเจชเจฒเฉ‡เจŸ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจชเฉฐเจจเฉ‡ 'เจคเฉ‡.

เจฎเฉเฉฑเจ– CMake เจซเจพเจˆเจฒ (./CMakeLists.txt)

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจคเฉเจนเจพเจจเฉ‚เฉฐ CMake เจธเจฟเจธเจŸเจฎ เจฆเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ. CMake เจตเจฟเจ•เจธเจฟเจค เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ, เจตเฉฑเจ–-เจตเฉฑเจ– เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ•เจฎเจพเจ‚เจก เจฆเฉ‡ เจฆเจธเจคเจ–เจค เจ…เจคเฉ‡ เจตเจฟเจนเจพเจฐ เจฌเจฆเจฒ เจฐเจนเฉ‡ เจนเจจเฅค CMake เจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจ‡เจน เจธเจฎเจเจฃ เจฒเจˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจคเฉ‹เจ‚ เจ•เฉ€ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚, เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฒเจˆ เจธเจพเจกเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจฐเจฟเจ•เจพเจฐเจก เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

cmake_minimum_required(VERSION 3.13)

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ, เจ‡เจธเจฆเจพ เจจเจพเจฎ, เจธเฉฐเจธเจ•เจฐเจฃ, เจตเจฐเจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจญเจพเจธเจผเจพเจตเจพเจ‚, เจ†เจฆเจฟ เจจเฉ‚เฉฐ เจฎเจจเฉ‹เจจเฉ€เจค เจ•เจฐเจพเจ‚เจ—เฉ‡ (เจฆเฉ‡เจ–เฉ‹. ะบะพะผะฐะฝะดัƒ project).

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจญเจพเจธเจผเจพ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ CXX (เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ C++) เจคเจพเจ‚ เจ•เจฟ CMake C เจญเจพเจธเจผเจพ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฆเฉ€ เจ–เฉ‹เจœ เจจเจพ เจ•เจฐเฉ‡ (เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, CMake เจตเจฟเฉฑเจš เจฆเฉ‹ เจญเจพเจธเจผเจพเจตเจพเจ‚ เจธเจผเจพเจฎเจฒ เจนเจจ: C เจ…เจคเฉ‡ C++)เฅค

project(Mylib VERSION 1.0 LANGUAGES CXX)

เจ‡เฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจคเฉเจฐเฉฐเจค เจœเจพเจ‚เจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เฉ€ เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจธเจฌ-เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจนเฉˆ เจœเจพเจ‚ เจจเจนเฉ€เจ‚เฅค เจ‡เจน เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพ.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเจ•เจฒเจช

เจ…เจธเฉ€เจ‚ เจฆเฉ‹ เจตเจฟเจ•เจฒเจช เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจชเจนเจฟเจฒเจพ เจตเจฟเจ•เจฒเจช เจนเฉˆ MYLIB_TESTING - เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆเฅค เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจธเจพเจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจ เจนเฉˆ เจ•เจฟ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจนเฉˆ, เจชเจฐ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ เจœเจพเจ‚ เจชเฉˆเจ•เฉ‡เจœ เจ•เจฐเจจเจพเฅค เจœเจพเจ‚ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฌเจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ - เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจพเจกเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹, เจ•เฉ€ เจคเฉเจธเฉ€เจ‚?

option(MYLIB_TESTING "ะ’ะบะปัŽั‡ะธั‚ัŒ ะผะพะดัƒะปัŒะฝะพะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธะต" ON)

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจตเจฟเจ•เจฒเจช เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ MYLIB_COVERAGE เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจจเฉ‚เฉฐ เจฎเจพเจชเจฃ เจฒเจˆ, เจชเจฐ เจ‡เจธ เจจเฉ‚เฉฐ เจตเจพเจงเฉ‚ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€, เจ‡เจธ เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

option(MYLIB_COVERAGE "ะ’ะบะปัŽั‡ะธั‚ัŒ ะธะทะผะตั€ะตะฝะธะต ะฟะพะบั€ั‹ั‚ะธั ะบะพะดะฐ ั‚ะตัั‚ะฐะผะธ" OFF)

เจธเฉฐเจ•เจฒเจจ เจตเจฟเจ•เจฒเจช

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ…เจธเฉ€เจ‚ เจ•เฉ‚เจฒ เจชเจฒเฉฑเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจนเจพเจ‚, เจ‡เจธเจฒเจˆ เจ…เจธเฉ€เจ‚ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจคเฉ‹เจ‚ เจ•เฉฐเจชเจพเจˆเจฒ-เจŸเจพเจˆเจฎ เจกเจพเจ‡เจ—เจจเฉŒเจธเจŸเจฟเจ•เจธ เจฆเจพ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจชเฉฑเจงเจฐ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เฉฑเจ• เจตเฉ€ เจšเฉ‚เจนเจพ เจ‡เจธ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ–เจฟเจธเจ•เฉ‡เจ—เจพเฅค

add_compile_options(
    -Werror

    -Wall
    -Wextra
    -Wpedantic

    -Wcast-align
    -Wcast-qual
    -Wconversion
    -Wctor-dtor-privacy
    -Wenum-compare
    -Wfloat-equal
    -Wnon-virtual-dtor
    -Wold-style-cast
    -Woverloaded-virtual
    -Wredundant-decls
    -Wsign-conversion
    -Wsign-promo
)

เจ…เจธเฉ€เจ‚ C++ เจญเจพเจธเจผเจพ เจฆเฉ‡ เจฎเจฟเจ†เจฐ เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจชเจพเจฒเจฃเจพ เจ•เจฐเจจ เจฒเจˆ เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉ€ เจ…เจฏเฉ‹เจ— เจ•เจฐ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡เฅค เจ‰เจน CMake เจตเจฟเฉฑเจš เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจฎเจฐเฉฑเจฅ เจนเจจเฅค

if(NOT CMAKE_CXX_EXTENSIONS)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

เจฎเฉเฉฑเจ– เจฎเฉฐเจคเจต

เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจธเจฟเจฐเจฒเฉ‡เจ– เจซเจพเจˆเจฒเจพเจ‚ เจนเจจ, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจฅเจฟเจฐ เจœเจพเจ‚ เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจจเจฟเจ•เจพเจธเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจคเจฃ เจฒเจˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ‡เจธเจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจ–เฉ‹เจœเจฃ เจฏเฉ‹เจ— เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฒ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ…เจคเฉ‡ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เจน เจ‰เจนเฉ€ เจธเจฟเจฐเจฒเฉ‡เจ–, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจธเฉฐเจญเจต เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉเจ เจตเจพเจงเฉ‚, เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจ เจนเจจเฅค

เจ‡เจธ เจฎเฉฐเจคเจต เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค

add_library(mylib INTERFACE)

เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจธเจพเจกเฉ€ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเจพเจฒ เจฌเฉฐเจจเฉเจนเจฆเฉ‡ เจนเจพเจ‚เฅค

เจธเฉ€เจฎเฉ‡เจ• เจฆเฉ€ เจ†เจงเฉเจจเจฟเจ•, เจซเฉˆเจธเจผเจจเฉ‡เจฌเจฒ, เจจเฉŒเจœเจตเจพเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจธเจฟเจฐเจฒเฉ‡เจ–, เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚, เจ†เจฆเจฟเฅค เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจŸเฉ€เจšเฉ‡ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจธเจพเจฐเจฟเจค. เจ‡เจธ เจฒเจˆ เจ‡เจน เจ•เจนเจฟเจฃเจพ เจ•เจพเจซเฉ€ เจนเฉˆ target_link_libraries(target PRIVATE dependency), เจ…เจคเฉ‡ เจธเจพเจฐเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจœเฉ‹ เจŸเฉ€เจšเฉ‡ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจ เจนเจจ dependency, เจŸเฉ€เจšเฉ‡ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจธเจฐเฉ‹เจคเจพเจ‚ เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจนเฉ‹เจตเฉ‡เจ—เจพ target. เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ [target_]include_directories. เจ‡เจน เจนเฉ‡เจ เจพเจ‚ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจพเจ‚ เจฒเจˆ CMake เจธเจ•เฉเจฐเจฟเจชเจŸ.

เจ‡เจน เจ…เจ–เฉŒเจคเฉ€ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฆเฉ€ เจตเฉ€ เจ•เฉ€เจฎเจค เจนเฉˆ. ะฒั‹ั€ะฐะถะตะฝะธั-ะณะตะฝะตั€ะฐั‚ะพั€ั‹: $<...>.

เจ‡เจน เจ•เจฎเจพเจ‚เจก เจธเจพเจกเฉ€ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเจพเจฒ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจ‰เจธเฉ‡ CMake เจฒเฉœเฉ€ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ•เจฟเจธเฉ‡ เจŸเฉ€เจšเฉ‡ เจจเจพเจฒ เจœเฉเฉœเฉ€ เจนเฉ‹เจˆ เจนเฉˆ, เจคเจพเจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฆเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจ‡เจธ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจฃเจ—เฉ‡เฅค ${CMAKE_CURRENT_SOURCE_DIR}/include, เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจธเจฟเจธเจŸเจฎ เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจนเฉˆ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฒ เจœเฉเฉœเฉ€ เจนเฉ‹เจˆ เจนเฉˆ find_package, เจซเจฟเจฐ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฆเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจ‡เจธ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจฃเจ—เฉ‡ include เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐเฉ€.

target_include_directories(mylib INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

เจ†เจ“ เจ‡เฉฑเจ• เจญเจพเจธเจผเจพ เจฆเจพ เจฎเจฟเจ†เจฐ เจคเฉˆเจ… เจ•เจฐเฉ€เจเฅค เจฌเฉ‡เจธเจผเฉฑเจ•, เจฌเจนเฉเจค เจนเฉ€ เจ†เจ–เจฐเฉ€. เจ‡เจธ เจฆเฉ‡ เจจเจพเจฒ เจนเฉ€, เจ…เจธเฉ€เจ‚ เจจเจพ เจธเจฟเจฐเจซเจผ เจฎเจฟเจ†เจฐ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจธเจ—เฉ‹เจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจฒเฉ‹เจ•เจพเจ‚ เจคเฉฑเจ• เจตเฉ€ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจ—เฉ‡เฅค เจ‡เจน เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ•เจฟ เจจเจฟเจฐเจงเจพเจฐเจค เจธเฉฐเจชเฉฑเจคเฉ€ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจนเฉˆ INTERFACE (เจฆเฉ‡เจ–เฉ‹ target_compile_features เจ•เจฎเจพเจ‚เจก).

target_compile_features(mylib INTERFACE cxx_std_17)

เจ†เจ“ เจ†เจชเจฃเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจชเจจเจพเจฎ เจฌเจฃเจพเจˆเจเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเฉเฉฐเจฆเจฐเจคเจพ เจฒเจˆ, เจ‡เจน เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ "เจจเฉ‡เจฎเจธเจชเฉ‡เจธ" เจตเจฟเฉฑเจš เจนเฉ‹เจตเฉ‡เจ—เจพ. เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚ เจธเจพเจกเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจคเฉ‹เจ‚ เจธเฉเจคเฉฐเจคเจฐ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚เฅค เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฌเจธเจŸเจพ เจตเจฟเฉฑเจš, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ.

add_library(Mylib::mylib ALIAS mylib)

เจธเฉˆเจŸเจฟเฉฐเจ—

เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพเฅค เจ‡เฉฑเจฅเฉ‡ เจธเจญ เจ•เฉเจ เจธเจงเจพเจฐเจจ เจนเฉˆ. เจ…เจธเฉ€เจ‚ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจธเจพเจฐเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจตเจพเจฒเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจจเฉ‚เฉฐ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ include เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจธเจฅเจพเจจ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐเฉ€.

install(DIRECTORY include/mylib DESTINATION include)

เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒเจก เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ find_package(Mylib) เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจŸเฉ€เจšเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹ Mylib::mylib.

install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

เจ…เจ—เจฒเฉ‡ เจธเจชเฉˆเจฒ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจฎเจเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ find_package(Mylib 1.2.3 REQUIRED), เจ…เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเจพ เจ…เจธเจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ 1.2.3CMake เจ†เจชเจฃเฉ‡ เจ†เจช เจ‡เฉฑเจ• เจคเจฐเฉเฉฑเจŸเฉ€ เจชเฉˆเจฆเจพ เจ•เจฐเฉ‡เจ—เจพเฅค เจญเจพเจต, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจŸเฉเจฐเฉˆเจ• เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake"
    VERSION
        ${PROJECT_VERSION}
    COMPATIBILITY
        AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake" DESTINATION share/Mylib/cmake)

เจŸเฉˆเจธเจŸ

เจœเฉ‡เจ•เจฐ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจ…เจฏเฉ‹เจ— เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ เจ…เจจเฉเจธเจพเจฐเฉ€ เจตเจฟเจ•เจฒเจช เจœเจพเจ‚ เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ‡เฉฑเจ• เจธเจฌเจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจนเฉˆ, เจฏเจพเจจเฉ€ เจ‡เจน เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ CMake เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ add_subdirectory, เจ…เจธเฉ€เจ‚ เจฒเฉœเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ…เฉฑเจ—เฉ‡ เจจเจนเฉ€เจ‚ เจตเจงเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจธเจ•เจฐเจฟเจชเจŸ, เจœเฉ‹ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจฌเจธ เจจเจนเฉ€เจ‚ เจšเฉฑเจฒเจฆเฉ€เฅค

if(NOT MYLIB_TESTING)
    message(STATUS "ะขะตัั‚ะธั€ะพะฒะฐะฝะธะต ะฟั€ะพะตะบั‚ะฐ Mylib ะฒั‹ะบะปัŽั‡ะตะฝะพ")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib ะฝะต ั‚ะตัั‚ะธั€ัƒะตั‚ัั ะฒ ั€ะตะถะธะผะต ะฟะพะดะผะพะดัƒะปั")
else()
    add_subdirectory(test)
endif()

เจฆเจธเจคเจพเจตเฉ‡เจœเจผ

เจธเจฌ-เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจตเฉ€ เจคเจฟเจ†เจฐ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡เฅค

if(NOT IS_SUBPROJECT)
    add_subdirectory(doc)
endif()

เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเจพเจ•เจธ

เจ‡เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚, เจธเจฌ-เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจ•เฉ‹เจˆ เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจตเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

if(NOT IS_SUBPROJECT)
    add_subdirectory(online)
endif()

เจŸเฉˆเจธเจŸ เจธเจ•เฉเจฐเจฟเจชเจŸ (test/CMakeLists.txt)

เจŸเฉˆเจธเจŸเจฟเฉฐเจ—

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ…เจธเฉ€เจ‚ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจŸเฉˆเจธเจŸ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจฒเฉฑเจญเจฆเฉ‡ เจนเจพเจ‚ (เจคเฉเจนเจพเจกเฉ‡ เจฎเจจเจชเจธเฉฐเจฆ เจจเจพเจฒ เจฌเจฆเจฒเฉ‹)เฅค

find_package(doctest 2.3.3 REQUIRED)

เจ†เจ‰ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเจพเจฒ เจธเจพเจกเฉ€ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจซเจพเจˆเจฒ เจฌเจฃเจพเจˆเจเฅค เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเฉˆเจ‚ เจธเจฟเฉฑเจงเฉ‡ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจŸเฉ‡เจฌเจฒ เจฌเจพเจˆเจจเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจ‰เจนเฉ€ เจซเจพเจˆเจฒ เจœเฉ‹เฉœเจฆเจพ เจนเจพเจ‚ เจœเจฟเจธ เจตเจฟเฉฑเจš เจซเฉฐเจ•เจธเจผเจจ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ main.

add_executable(mylib-unit-tests test_main.cpp)

เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ‰เจนเจจเจพเจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเจพ เจนเจพเจ‚ เจœเจฟเจธ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ. เจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)

เจ…เจธเฉ€เจ‚ เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚เฅค เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจงเจฟเจ†เจจ เจฆเจฟเจ‰ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจธเฉ€เจฎเฉ‡เจ• เจŸเฉ€เจšเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ€ เจฌเจพเจˆเจจเจฐเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเจฟเจ† เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ€ เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจ•เจพเจฒ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ target_include_directories. เจŸเฉˆเจธเจŸ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจคเฉ‹เจ‚ เจธเจฟเจฐเจฒเฉ‡เจ– Mylib::mylib, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจฌเจฟเจฒเจก เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ (เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เจน C++ เจญเจพเจธเจผเจพ เจฆเจพ เจฎเจฟเจ†เจฐ เจนเฉˆ) เจ‡เจนเจจเจพเจ‚ เจŸเฉ€เจšเจฟเจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ†เจ‡เจ† เจนเฉˆเฅค

target_link_libraries(mylib-unit-tests
    PRIVATE
        Mylib::mylib
        doctest::doctest
)

เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจกเจฎเฉ€ เจŸเฉ€เจšเจพ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚, เจœเจฟเจธเจฆเจพ "เจฌเจฟเจฒเจก" เจšเฉฑเจฒ เจฐเจนเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธ เจŸเฉ€เจšเฉ‡ เจจเฉ‚เฉฐ เจกเจฟเจซเฉŒเจฒเจŸ เจฌเจฟเจฒเจก เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚ (เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค ALL). เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจกเจฟเจซเฉŒเจฒเจŸ เจฌเจฟเจฒเจก เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจŸเจฐเจฟเฉฑเจ—เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจญเจพเจต เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ เจ•เจฆเฉ‡ เจจเจนเฉ€เจ‚ เจญเฉเฉฑเจฒเจพเจ‚เจ—เฉ‡เฅค

add_custom_target(check ALL COMMAND mylib-unit-tests)

เจ•เฉ‹เจŸเจฟเฉฐเจ—

เจ…เฉฑเจ—เฉ‡, เจœเฉ‡เจ•เจฐ เจขเฉเจ•เจตเจพเจ‚ เจตเจฟเจ•เจฒเจช เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจฎเจพเจช เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจฎเฉˆเจ‚ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจœเจพเจตเจพเจ‚เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจธเฉ€เจฎเฉ‡เจ• เจฆเฉ€ เจฌเจœเจพเจ เจ•เจตเจฐเฉ‡เจœ เจจเฉ‚เฉฐ เจฎเจพเจชเจฃ เจฒเจˆ เจ‡เฉฑเจ• เจธเจพเจงเจจ เจจเจพเจฒ เจตเจงเฉ‡เจฐเฉ‡ เจธเจฌเฉฐเจงเจค เจนเจจ. เจ‡เจน เจธเจฟเจฐเจซ เจจเฉ‹เจŸ เจ•เจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ เจ•เจฟ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจ‡เฉฑเจ• เจŸเฉ€เจšเจพ เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡เจ—เจพ coverage, เจœเจฟเจธ เจจเจพเจฒ เจ•เจตเจฐเฉ‡เจœ เจจเฉ‚เฉฐ เจฎเจพเจชเจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจเจพ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆเฅค

find_program(GCOVR_EXECUTABLE gcovr)
if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
    message(STATUS "ะ˜ะทะผะตั€ะตะฝะธะต ะฟะพะบั€ั‹ั‚ะธั ะบะพะดะฐ ั‚ะตัั‚ะฐะผะธ ะฒะบะปัŽั‡ะตะฝะพ")

    target_compile_options(mylib-unit-tests PRIVATE --coverage)
    target_link_libraries(mylib-unit-tests PRIVATE gcov)

    add_custom_target(coverage
        COMMAND
            ${GCOVR_EXECUTABLE}
                --root=${PROJECT_SOURCE_DIR}/include/
                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS
            check
    )
elseif(MYLIB_COVERAGE AND NOT GCOVR_EXECUTABLE)
    set(MYLIB_COVERAGE OFF)
    message(WARNING "ะ”ะปั ะทะฐะผะตั€ะพะฒ ะฟะพะบั€ั‹ั‚ะธั ะบะพะดะฐ ั‚ะตัั‚ะฐะผะธ ั‚ั€ะตะฑัƒะตั‚ัั ะฟั€ะพะณั€ะฐะผะผะฐ gcovr")
endif()

เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸ (doc/CMakeLists.txt)

เจกเฉŒเจ•เจธเฉ€เจœเจจ เจฎเจฟเจฒเฉ€.

find_package(Doxygen)

เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‡ เจญเจพเจธเจผเจพ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจนเฉˆ เจœเจพเจ‚ เจจเจนเฉ€เจ‚เฅค เจœเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจ›เฉ‚เจนเจฆเฉ‡, เจœเฉ‡ เจจเจนเฉ€เจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจฐเฉ‚เจธเฉ€ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจกเฉŒเจ•เจธเฉ€เจœเจจ เจธเจฟเจธเจŸเจฎ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจญเจพเจธเจผเจพ เจธเจฎเฉ‡เจค เจธเจพเจฐเฉ‡ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ, เจธเฉฐเจฐเจšเจจเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจ‰เฉฑเจฅเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ (เจตเฉ‡เจ–เฉ‹. ะบะพะผะฐะฝะดัƒ configure_file).

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจŸเฉ€เจšเจพ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ doc, เจœเฉ‹ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฌเจฃเจพเจ‰เจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจตเจฟเจ•เจพเจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฌเจฃเจพเจ‰เจฃเจพ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจกเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจŸเฉ€เจšเจพ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจฎเจฐเฉฑเจฅ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ; เจ‡เจธเจจเฉ‚เฉฐ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

if (Doxygen_FOUND)
    if (NOT MYLIB_DOXYGEN_LANGUAGE)
        set(MYLIB_DOXYGEN_LANGUAGE Russian)
    endif()
    message(STATUS "Doxygen documentation will be generated in ${MYLIB_DOXYGEN_LANGUAGE}")
    configure_file(Doxyfile.in Doxyfile)
    add_custom_target(doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
endif ()

เจ”เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸ (online/CMakeLists.txt)

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจคเฉ€เจœเจพ เจชเจพเจˆเจฅเจจ เจฒเฉฑเจญเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจฟเจธเจผเจพเจจเจพ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ wandbox, เจœเฉ‹ เจธเฉ‡เจตเจพ API เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐเฉ€ เจ‡เฉฑเจ• เจฌเฉ‡เจจเจคเฉ€ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจตเฉˆเจ‚เจกเจฌเจพเจ•เจธ, เจ…เจคเฉ‡ เจ‰เจธเจจเฉ‚เฉฐ เจฆเฉ‚เจฐ เจญเฉ‡เจœเจฆเจพ เจนเฉˆเฅค เจœเจตเจพเจฌ เจฎเฉเจ•เฉฐเจฎเจฒ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจฆเฉ‡ เจฒเจฟเฉฐเจ• เจจเจพเจฒ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

find_program(PYTHON3_EXECUTABLE python3)
if(PYTHON3_EXECUTABLE)
    set(WANDBOX_URL "https://wandbox.org/api/compile.json")

    add_custom_target(wandbox
        COMMAND
            ${PYTHON3_EXECUTABLE} wandbox.py mylib-example.cpp "${PROJECT_SOURCE_DIR}" include |
            curl -H "Content-type: application/json" -d @- ${WANDBOX_URL}
        WORKING_DIRECTORY
            ${CMAKE_CURRENT_SOURCE_DIR}
        DEPENDS
            mylib-unit-tests
    )
else()
    message(WARNING "ะ”ะปั ัะพะทะดะฐะฝะธั ะพะฝะปะฐะนะฝ-ะฟะตัะพั‡ะฝะธั†ั‹ ั‚ั€ะตะฑัƒะตั‚ัั ะธะฝั‚ะตั€ะฟั€ะตั‚ะฐั‚ะพั€ ะฏะŸ python 3-ะน ะฒะตั€ัะธะธ")
endif()

เจฌเจพเจนเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ

เจนเฉเจฃ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจธ เจธเจญ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเฉ€เจเฅค

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€

เจ‡เจธ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃเจพ, เจธเฉ€เจฎเฉ‡เจ• เจฌเจฟเจฒเจก เจธเจฟเจธเจŸเจฎ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจพเจ‚เจ—, เจฆเฉ‹ เจชเฉœเจพเจตเจพเจ‚ เจฆเฉ‡ เจธเจผเจพเจฎเจฒ เจนเจจ:

เจชเฉ€เฉœเฉเจนเฉ€

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ [ะพะฟั†ะธะธ ...]

เจœเฉ‡เจ•เจฐ เจ‰เจชเจฐเฉ‹เจ•เจค เจ•เจฎเจพเจ‚เจก CMake เจฆเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ›เฉฑเจกเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ‹ -S:

cmake ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ [ะพะฟั†ะธะธ ...]

เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ.

เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจจเจฟเจฐเจฎเจพเจฃ

cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ [--target target]

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจŸเฉ€เจšเจฟเจ†เจ‚ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ.

เจšเฉ‹เจฃเจพเจ‚

MYLIB_COVERAGE

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [ะฟั€ะพั‡ะธะต ะพะฟั†ะธะธ ...]

เจŸเฉ€เจšเจพ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉˆ coverage, เจœเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจจเฉ‚เฉฐ เจฎเจพเจชเจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

MYLIB_TESTING

cmake -S ... -B ... -DMYLIB_TESTING=OFF [ะฟั€ะพั‡ะธะต ะพะฟั†ะธะธ ...]

เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸ เจฌเจฟเจฒเจก เจ…เจคเฉ‡ เจŸเฉ€เจšเฉ‡ เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ check. เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจฆเจพ เจฎเจพเจช เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจตเฉ‡เจ–เฉ‹. MYLIB_COVERAGE).

เจœเฉ‡เจ•เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเจฌ-เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ เจคเจพเจ‚ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจตเฉ€ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจ…เจธเจฎเจฐเฉฑเจฅ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [ะฟั€ะพั‡ะธะต ะพะฟั†ะธะธ ...]

เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ€ เจญเจพเจธเจผเจพ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉˆ เจœเฉ‹ เจŸเฉ€เจšเจพ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ doc เจฆเจฟเฉฑเจคเฉ‡ เจ—เจ เจจเฉ‚เฉฐ. เจ‰เจชเจฒเจฌเจง เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฒเจˆ, เจตเฉ‡เจ–เฉ‹ เจกเฉŒเจ•เจธเฉ€เจœเจจ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ.

เจฐเฉ‚เจธเฉ€ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจฎเจฐเฉฑเจฅ เจนเฉˆเฅค

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจŸเฉ€เจšเฉ‡

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš

cmake --build path/to/build/directory
cmake --build path/to/build/directory --target all

เจœเฉ‡เจ•เจฐ เจŸเฉ€เจšเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจœเฉ‹ เจ•เจฟ เจŸเฉ€เจšเฉ‡ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆ all), เจ‰เจน เจธเจญ เจ•เฉเจ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เจน เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจŸเฉ€เจšเฉ‡ เจจเฉ‚เฉฐ เจตเฉ€ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ check.

mylib-unit-tests

cmake --build path/to/build/directory --target mylib-unit-tests

เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจชเฉ‚เจฐเจต-เจจเจฟเจฐเจงเจพเจฐเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฎเจฐเจฅเจฟเจคเฅค

เจšเฉˆเฉฑเจ•

cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target check

เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉ€เจคเฉ‡ (เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉ€เจคเฉ‡, เจœเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚) เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจชเฉ‚เจฐเจต-เจจเจฟเจฐเจงเจพเจฐเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฎเจฐเจฅเจฟเจคเฅค

เจ‡เจน เจตเฉ€ เจตเฉ‡เจ–เฉ‹ mylib-unit-tests.

เจ•เจตเจฐเฉ‡เจœ

cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target coverage

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ•เฉ‹เจก เจ•เจตเจฐเฉ‡เจœ เจฒเจˆ เจšเฉฑเจฒ เจฐเจนเฉ‡ (เจฐเจจ, เจœเฉ‡เจ•เจฐ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚) เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ gcovr.

เจ•เฉ‹เจŸเจฟเฉฐเจ— เจเจ—เจœเจผเฉŒเจธเจŸ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ:

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp                            2       2   100%   
------------------------------------------------------------------------------
TOTAL                                          2       2   100%
------------------------------------------------------------------------------

เจŸเจพเจฐเจ—เจฟเจŸ เจธเจฟเจฐเจซ เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจ‰เจชเจฒเจฌเจง เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจตเจฟเจ•เจฒเจช เจธเจฎเจฐเฉฑเจฅ เจนเฉเฉฐเจฆเจพ เจนเฉˆ MYLIB_COVERAGE.

เจ‡เจน เจตเฉ€ เจตเฉ‡เจ–เฉ‹ check.

doc

cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target doc

เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ‹เจก เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฌเจฃเจพเจ‰เจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆ เจ†เจ•เจธเฉ€เจœเจจ.

เจตเฉˆเจ‚เจกเจฌเจพเจ•เจธ

cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target wandbox

เจธเฉ‡เจตเจพ เจคเฉ‹เจ‚ เจœเจตเจพเจฌ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

{
    "permlink" :    "QElvxuMzHgL9fqci",
    "status" :  "0",
    "url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}

เจ‡เจธ เจฒเจˆ เจธเฉ‡เจตเจพ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจตเฉˆเจ‚เจกเจฌเจพเจ•เจธ. เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจธเจฐเจตเจฐ เจ•เจฟเฉฐเจจเฉ‡ เจฒเจšเจ•เจฆเจพเจฐ เจนเจจ, เจชเจฐ เจฎเฉˆเจ‚ เจธเฉ‹เจšเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ‡เจธ เจฎเฉŒเจ•เฉ‡ เจฆเฉ€ เจฆเฉเจฐเจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€.

เจฎเจฟเจธเจพเจฒ

เจ•เจตเจฐเฉ‡เจœ เจฎเจพเจช เจจเจพเจฒ เจกเฉ€เจฌเฉฑเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ“

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target coverage --parallel 16

เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=ะฟัƒั‚ัŒ/ะบ/ัƒัั‚ะฐะฝะพะฒะพะนะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ
cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target install

เจฆเจฟเฉฑเจคเฉ‡ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจจเจพเจฒ เจฐเฉ€เจฒเฉ€เจœเจผ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฃเจพเจ“

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=ะฟัƒั‚ัŒ/ะบ/ะดะธั€ะตะบั‚ะพั€ะธะธ/ะบัƒะดะฐ/ัƒัั‚ะฐะฝะพะฒะปะตะฝั‹/ะทะฐะฒะธัะธะผะพัั‚ะธ
cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --parallel 4

เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจš เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ --target doc

เจธเฉฐเจฆ

  1. เจฎเฉเฉฑเจ– เจฎเฉฐเจคเจฐเฉ€ 3.13

    เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, CMake เจธเฉฐเจธเจ•เจฐเจฃ 3.13 เจจเฉ‚เฉฐ เจธเจฟเจฐเจซ เจ‡เจธ เจฎเจฆเจฆ เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจ•เฉเจ เจ•เฉฐเจธเฉ‹เจฒ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆเฅค CMake เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจŸเฉˆเจ•เจธ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจธเฉฐเจธเจ•เจฐเจฃ 3.8 เจ•เจพเจซเจผเฉ€ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจชเฉ€เฉœเฉเจนเฉ€ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

  2. เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ doctest

    เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ (เจตเฉ‡เจ–เฉ‹ ะพะฟั†ะธัŽ MYLIB_TESTING).

  3. เจ†เจ•เจธเฉ€เจœเจจ

    เจ‰เจธ เจญเจพเจธเจผเจพ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฒเจˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡, เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจช เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ MYLIB_DOXYGEN_LANGUAGE.

  4. เจญเจพเจธเจผเจพ เจ…เจจเฉเจตเจพเจฆเจ• เจชเจพเจ‡เจฅเจจ 3

    เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจชเฉ€เฉœเฉเจนเฉ€ เจฒเจˆ เจ†เจจเจฒเจพเจˆเจจ เจธเฉˆเจ‚เจกเจฌเจพเจ•เจธ.

เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ

CMake เจ…เจคเฉ‡ เจ•เฉเจ เจšเฉฐเจ—เฉ‡ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจจเจพเจฒ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจธเฉ€เจชเฉ€เจชเฉ€เจšเฉˆเจ•

CMake เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจŸเฉ‚เจฒ เจฒเจˆ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจธเจฎเจฐเจฅเจจ เจนเฉˆ เจธเฉ€เจชเฉ€เจชเฉ€เจšเฉˆเจ•.

เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเจ•เจฒเจช เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ CMAKE_CXX_CPPCHECK:

cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ/include"

เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจœเจฆเฉ‹เจ‚ เจตเฉ€ เจธเจฐเฉ‹เจค เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ…เจคเฉ‡ เจฆเฉเจฌเจพเจฐเจพ เจ•เฉฐเจชเจพเจˆเจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจตเจพเจงเฉ‚ เจ•เฉเจ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจตเฉฑเจœเจฃเจพ

เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจธเฉฐเจฆ เจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ scan-build เจคเฉเจธเฉ€เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจตเฉ€ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

scan-build cmake -S ะฟัƒั‚ัŒ/ะบ/ะธัั…ะพะดะฝะธะบะฐะผ -B ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build ะฟัƒั‚ัŒ/ะบ/ัะฑะพั€ะพั‡ะฝะพะน/ะดะธั€ะตะบั‚ะพั€ะธะธ

เจ‡เฉฑเจฅเฉ‡, Cppcheck เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจฆเฉ‡ เจ‰เจฒเจŸ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเจฐ เจตเจพเจฐ เจฌเจฟเจฒเจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ scan-build.

เจฌเจพเจ…เจฆ

CMake เจ‡เฉฑเจ• เจฌเจนเฉเจค เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจ…เจคเฉ‡ เจฒเจšเจ•เจฆเจพเจฐ เจธเจฟเจธเจŸเจฎ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเจฐ เจธเจตเจพเจฆ เจ…เจคเฉ‡ เจฐเฉฐเจ— เจฒเจˆ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ…เจคเฉ‡, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจธเฉฐเจŸเฉˆเจ•เจธ เจ•เจˆ เจตเจพเจฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจนเฉ‹เจฃ เจฒเจˆ เจฌเจนเฉเจค เจ•เฉเจ เจ›เฉฑเจก เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจธเจผเฉˆเจคเจพเจจ เจ…เจœเฉ‡ เจตเฉ€ เจ“เจจเจพ เจญเจฟเจ†เจจเจ• เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเจฟเฉฐเจจเจพ เจ‰เจธเจจเฉ‚เฉฐ เจชเฉ‡เจ‚เจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ. เจธเจฎเจพเจœ เจ…เจคเฉ‡ เจธเจฟเจนเจค เจฆเฉ‡ เจซเจพเจ‡เจฆเฉ‡ เจฒเจˆ เจธเฉ€เจฎเฉ‡เจ• เจฌเจฟเจฒเจก เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค

โ†’ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจŸเฉˆเจฎเจชเจฒเฉ‡เจŸ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‹

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹