CMake เด‰เด‚ C++ เด‰เด‚ เดŽเดจเตเดจเต‡เด•เตเด•เตเด‚ เดธเดนเต‹เดฆเดฐเด™เตเด™เดณเดพเดฃเต

CMake เด‰เด‚ C++ เด‰เด‚ เดŽเดจเตเดจเต‡เด•เตเด•เตเด‚ เดธเดนเต‹เดฆเดฐเด™เตเด™เดณเดพเดฃเต

เดตเดฟเด•เดธเดจ เดธเดฎเดฏเดคเตเดคเต, เด•เด‚เดชเตˆเดฒเดฑเตเด•เตพ เดฎเดพเดฑเตเดฑเดพเดจเตเด‚ เดฎเต‹เดกเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเดจเตเด‚ เดกเดฟเดชเตปเดกเตปเดธเดฟ เดชเดคเดฟเดชเตเดชเตเด•เตพ เดจเดŸเดคเตเดคเดพเดจเตเด‚ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเด‚ เดจเดŸเดคเตเดคเดพเดจเตเด‚ เดชเตเดฐเด•เดŸเดจเด‚ เด…เดณเด•เตเด•เดพเดจเตเด‚ เด•เดตเดฑเต‡เดœเต เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เดžเดพเตป CMake เดถเดฐเดฟเด•เตเด•เตเด‚ เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เดŽเดจเดฟเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต†เดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดฏเดพเตป เด‡เดคเต เดŽเดจเตเดจเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเดฒเดฐเตเด‚ CMake เดตเดฟเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจเต, เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เด…เดคเต เด…เตผเดนเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เด…เดคเต เดจเต‹เด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดŽเดฒเตเดฒเดพเด‚ เด…เดคเตเดฐ เดฎเต‹เดถเดฎเดฒเตเดฒ, เด…เดŸเตเดคเตเดคเดฟเดŸเต† เด’เดŸเตเดŸเตเด‚ เดฎเต‡เดพเดทเดฎเดฒเตเดฒ, ะธ ะฝะฐะฟั€ะฐะฒะปะตะฝะธะต ั€ะฐะทะฒะธั‚ะธั ะฒะฟะพะปะฝะต ะฟะพะทะธั‚ะธะฒะฝะพะต.

เดˆ เด•เตเดฑเดฟเดชเตเดชเดฟเตฝ, CMake เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ 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-เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ
      3. เดšเต†เด•เตเด•เต
      4. เด•เดตเดฑเต‡เดœเต
      5. เดกเต‹เด•เต
      6. wandbox
    4. เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ
  3. เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ
  4. เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเด‚
  5. Afterword

ะŸั€ะพะตะบั‚ ะธะทะฝัƒั‚ั€ะธ

เดชเดฆเตเดงเดคเดฟเดฏเตเดŸเต† เด˜เดŸเดจ

.
โ”œโ”€โ”€ 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 เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด‚ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเด‚, เด…เดคเดฟเดจเดพเตฝ เด…เดต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดšเตผเดšเตเดš เดšเต†เดฏเตเดฏเตเด‚. เดฌเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดซเดฏเดฒเตเด•เตพ เด†เตผเด•เตเด•เตเด‚ เดจเต‡เดฐเดฟเดŸเตเดŸเต เด•เดพเดฃเดพเดจเดพเด•เตเด‚ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเต‡เดœเดฟเตฝ.

เดชเตเดฐเดงเดพเดจ 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)

เดžเด™เตเด™เตพ เดคเดฒเด•เตเด•เต†เดŸเตเดŸเตเด•เตพ เดžเด™เตเด™เดณเตเดŸเต† เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

CMake-เดจเตเดฑเต† เด†เดงเตเดจเดฟเด•เดตเตเด‚, เดซเดพเดทเดจเตเด‚, เดฏเตเดตเดพเด•เตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เด‚ เดคเดฒเด•เตเด•เต†เดŸเตเดŸเตเด•เตพ, เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟเด•เตพ เดฎเตเดคเดฒเดพเดฏเดตเดฏเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเตŠเดฑเตเดฑ เดฒเด•เตเดทเตเดฏเดคเตเดคเดฟเดฒเต‚เดŸเต† เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด…เดคเตเด•เตŠเดฃเตเดŸเต เดชเดฑเดžเตเดžเดพเตฝ เดฎเดคเดฟ 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)

เดžเด™เตเด™เตพ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เดณเต† เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เดฌเตˆเดจเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ CMake เดŸเดพเตผเด—เต†เดฑเตเดฑเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดžเด™เตเด™เตพ เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตโ€ŒเดคเดฟเดŸเตเดŸเตเดณเตเดณเต‚ เดŽเดจเตเดจเดคเตเด‚ เด•เดฎเดพเตปเดกเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดณเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เดจเตเดจเดคเตเด‚ เดฆเดฏเดตเดพเดฏเดฟ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• 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)

ะŸะพะบั€ั‹ั‚ะธะต

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด‰เดšเดฟเดคเดฎเดพเดฏ เด“เดชเตเดทเตป เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดžเด™เตเด™เตพ เด•เต‹เดกเต เด•เดตเดฑเต‡เดœเต เด…เดณเด•เตเด•เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดžเดพเตป เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ CMake เดŽเดจเตเดจเดคเดฟเดจเต‡เด•เตเด•เดพเตพ เด•เดตเดฑเต‡เดœเต เด…เดณเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด‰เดชเด•เดฐเดฃเดตเตเดฎเดพเดฏเดฟ เด…เดต เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดซเดฒเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด’เดฐเต เดฒเด•เตเดทเตเดฏเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚ เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต 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, ัะพัั‚ะพะธั‚ ะธะท ะดะฒัƒั… ัั‚ะฐะฟะพะฒ:

เดคเดฒเดฎเตเดฑ

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-เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ

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.

เดกเต‹เด•เต

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

เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดกเต เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเตเดฑเต† เดœเดจเดฑเต‡เดทเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต เดกเต‹เด•เตเดธเดฟเดœเตป.

wandbox

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. CMake 3.13

    ะะฐ ัะฐะผะพะผ ะดะตะปะต ะฒะตั€ัะธั CMake 3.13 ั‚ั€ะตะฑัƒะตั‚ัั ั‚ะพะปัŒะบะพ ะดะปั ะทะฐะฟัƒัะบะฐ ะฝะตะบะพั‚ะพั€ั‹ั… ะบะพะฝัะพะปัŒะฝั‹ั… ะบะพะผะฐะฝะด, ะพะฟะธัะฐะฝะฝั‹ั… ะฒ ะดะฐะฝะฝะพะน ัะฟั€ะฐะฒะบะต. ะก ั‚ะพั‡ะบะธ ะทั€ะตะฝะธั ัะธะฝั‚ะฐะบัะธัะฐ CMake-ัะบั€ะธะฟั‚ะพะฒ ะดะพัั‚ะฐั‚ะพั‡ะฝะพ ะฒะตั€ัะธะธ 3.8, ะตัะปะธ ะณะตะฝะตั€ะฐั†ะธัŽ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ะดั€ัƒะณะธะผะธ ัะฟะพัะพะฑะฐะผะธ.

  2. เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดฒเตˆเดฌเตเดฐเดฑเดฟ เดกเต‹เด•เตเดŸเตผ

    เดชเดฐเดฟเดถเต‹เดงเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเด‚ (เด•เดพเดฃเตเด• ะพะฟั†ะธัŽ MYLIB_TESTING).

  3. เดกเต‹เด•เตเดธเดฟเดœเตป

    ะ”ะปั ะฟะตั€ะตะบะปัŽั‡ะตะฝะธั ัะทั‹ะบะฐ, ะฝะฐ ะบะพั‚ะพั€ะพะผ ะฑัƒะดะตั‚ ัะณะตะฝะตั€ะธั€ะพะฒะฐะฝะฐ ะดะพะบัƒะผะตะฝั‚ะฐั†ะธั, ะฟั€ะตะดัƒัะผะพั‚ั€ะตะฝะฐ ะพะฟั†ะธั MYLIB_DOXYGEN_LANGUAGE.

  4. เดญเดพเดทเดพ เดตเตเดฏเดพเด–เตเดฏเดพเดคเดพเดตเต เดชเตˆเดคเตเดคเตบ 3

    เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดœเดจเดฑเต‡เดทเดจเดพเดฏเดฟ เด“เตบเดฒเตˆเตป เดธเดพเตปเดกเตเดฌเต‹เด•เตเดธเตเด•เตพ.

เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเด‚

CMake เด•เต‚เดŸเดพเดคเต† เด•เตเดฑเดšเตเดšเต เดจเดฒเตเดฒ เดŸเต‚เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตเดฑเดžเตเดž เดชเตเดฐเดฏเดคเตเดจเดคเตเดคเดฟเตฝ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเด‚ เดจเตฝเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

Cppcheck

CMake เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด…เดจเดพเดฒเดฟเดธเดฟเดธเต เดŸเต‚เดณเดฟเดจเตเดณเตเดณ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดชเดฟเดจเตเดคเตเดฃเดฏเตเดฃเตเดŸเต Cppcheck.

เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด“เดชเตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต 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.

Afterword

CMake เดŽเดจเตเดจเดคเต เดตเดณเดฐเต† เดถเด•เตเดคเดตเตเด‚ เดตเดดเด•เตเด•เดฎเตเดณเตเดณเดคเตเดฎเดพเดฏ เด’เดฐเต เดธเด‚เดตเดฟเดงเดพเดจเดฎเดพเดฃเต, เด…เดคเต เด“เดฐเต‹ เดฐเตเดšเดฟเด•เตเด•เตเด‚ เดจเดฟเดฑเดคเตเดคเดฟเดจเตเด‚ เดตเต‡เดฃเตเดŸเดฟเดฏเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต‚เดŸเดพเดคเต†, เดตเดพเด•เตเดฏเด˜เดŸเดจ เดšเดฟเดฒเดชเตเดชเต‹เดดเตŠเด•เตเด•เต† เด†เด—เตเดฐเดนเดฟเด•เตเด•เดคเตเดคเด•เตเด•เดตเดฟเดงเด‚ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เดชเดฟเดถเดพเดšเต เด‡เดชเตเดชเต‹เดดเตเด‚ เด…เดตเตป เดตเดฐเดšเตเดšเดคเตเดชเต‹เดฒเต† เดญเดฏเด™เตเด•เดฐเดจเดฒเตเดฒ. เดธเดฎเต‚เดนเดคเตเดคเดฟเดจเตเด‚ เด†เดฐเต‹เด—เตเดฏเดคเตเดคเดฟเดจเตเด‚ เดตเต‡เดฃเตเดŸเดฟ CMake เดฌเดฟเตฝเดกเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.

โ†’ ะกะบะฐั‡ะฐั‚ัŒ ัˆะฐะฑะปะพะฝ ะฟั€ะพะตะบั‚ะฐ

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•