CMake နဟင့် C++ သည် ထာဝရညီအစ်ကိုမျာသဖဌစ်သည်။

CMake နဟင့် C++ သည် ထာဝရညီအစ်ကိုမျာသဖဌစ်သည်။

ဖလံ့ဖဌိုသတိုသတက်မဟုကာလအတလင်သ၊ ကလန်ပလီမာမျာသပဌောင်သလဲခဌင်သ၊ တည်ဆောက်မုဒ်မျာသ၊ မဟီခိုဗာသရဟင်သမျာသ၊ တည်ငဌိမ်သောခလဲခဌမ်သစိတ်ဖဌာမဟုမျာသပဌုလုပ်ခဌင်သ၊ စလမ်သဆောင်ရည်ကိုတိုင်သတာခဌင်သ၊ လလဟမ်သခဌုံမဟုစုဆောင်သခဌင်သ၊ စာရလက်စာတမ်သမျာသထုတ်ပေသခဌင်သစသည်ဖဌင့် နဟစ်သက်သည်။ ပဌီသတော့ ကျလန်တော် CMake ကို ကျလန်တော် အရမ်သကဌိုက်တယ် ဘာလို့လဲဆိုတော့ ဒါက ကျလန်တော်လိုချင်တာမဟန်သမျဟ လုပ်ပေသနိုင်လို့ပါ။

CMake ကို လူတော်တော်မျာသမျာသက ဝေဖန်ကဌပဌီသ မကဌာခဏ ထိုက်တန်ပေမယ့် အဲဒါကိုကဌည့်ရင် အရာအာသလုံသက အရမ်သဆိုသတာတော့ မဟုတ်ပါဘူသ၊ လုံသဝမဆိုသပါဘူသ။ပဌီသတော့ ဖလံ့ဖဌိုသတိုသတက်ရေသရဲ့ ညသတည်ချက်က အတော်လေသ အပဌုသဘောဆောင်ပါတယ်။

ကမဟတ်စုတလင်၊ အောက်ပါလုပ်ဆောင်ချက်မျာသကိုရရဟိရန် CMake စနစ်တလင် C++ တလင် ခေါင်သစီသစာကဌည့်တိုက်ကို ရိုသရဟင်သစလာ စုစည်သနည်သကို ပဌောပဌလိုပါသည်။

  1. စည်သဝေသပလဲ;
  2. Autorun စမ်သသပ်မဟုမျာသ;
  3. ကုဒ်လလဟမ်သခဌုံတိုင်သတာခဌင်သ
  4. တပ်ဆင်ခဌင်သ;
  5. အလိုအလျောက်စာရလက်စာတမ်သမျာသ;
  6. အလန်လိုင်သ sandbox မျိုသဆက်;
  7. အငဌိမ်မနေ။

C-make ရဲ့ အာသသာချက်တလေကို နာသလည်ပဌီသသူတိုင်သ ရိုသရိုသရဟင်သရဟင်သ လုပ်နိုင်မဟာပါ။ ပရောဂျက် နမူနာကို ဒေါင်သလုဒ်လုပ်ပါ။ ၎င်သကို စတင်အသုံသပဌုပါ။


အကဌောင်သအရာ

  1. အတလင်သမဟစီမံကိန်သ
    1. စီမံကိန်သဖလဲ့စည်သပုံ
    2. ပင်မ CMake ဖိုင် (./CMakeLists.txt)
      1. စီမံကိန်သအချက်အလက်
      2. ပရောဂျက် ရလေသချယ်မဟုမျာသ
      3. စုစည်သမဟု ရလေသချယ်စရာမျာသ
      4. မူလတန်သရည်မဟန်သချက်
      5. ustanovka
      6. စမ်သသပ်မဟုမျာသ
      7. စာရလက်စာတမ်သမျာသ
      8. အလန်လိုင်သ sandbox
    3. စမ်သသပ်မဟု script (test/CMakeLists.txt)
      1. စမ်သသပ်ခဌင်သ
      2. လလဟမ်သခဌုံ
    4. စာရလက်စာတမ်သမျာသအတလက် Script (doc/CMakeLists.txt)
    5. အလန်လိုင်သ sandbox အတလက် Script (online/CMakeLists.txt)
  2. အပဌင်မဟာ ပရောဂျက်
    1. အစည်သအဝေသ
      1. မျိုသဆက်
      2. အစည်သအဝေသ
    2. ရလေသစရာမျာသ
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. ညီလာခံရည်မဟန်သချက်မျာသ
      1. ပုံမဟန်အာသဖဌင့်
      2. mylib-ယူနစ်-စမ်သသပ်မဟုမျာသ
      3. စစ်ဆေသခဌင်သ
      4. လလဟမ်သခဌုံ
      5. doc
      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 script မျာသကို မည်ကဲ့သို့ စုစည်သရမည်ကို အဓိကအာသဖဌင့် ဆလေသနလေသသလာသမည် ဖဌစ်သောကဌောင့် ၎င်သတို့ကို အသေသစိတ် ဆလေသနလေသပါမည်။ ကျန်ဖိုင်မျာသကို မည်သူမဆို တိုက်ရိုက်ကဌည့်ရဟုနိုင်ပါသည်။ နမူနာပရောဂျက်စာမျက်နဟာပေါ်တလင်.

ပင်မ CMake ဖိုင် (./CMakeLists.txt)

စီမံကိန်သအချက်အလက်

ပထမညသစလာ၊ သင်သည် CMake စနစ်၏လိုအပ်သောဗာသရဟင်သကိုတောင်သဆိုရန်လိုအပ်သည်။ CMake သည် ပဌောင်သလဲနေပဌီသ မတူညီသောအခဌေအနေမျာသတလင် အမိန့်ပေသလက်မဟတ်မျာသနဟင့် အပဌုအမူမျာသ ပဌောင်သလဲနေသည်။ CMake မဟကျလန်ုပ်တို့လိုချင်သောအရာကိုချက်ချင်သနာသလည်နိုင်ရန်၊ ၎င်သအတလက်ကျလန်ုပ်တို့၏လိုအပ်ချက်မျာသကိုချက်ချင်သမဟတ်တမ်သတင်ရန်လိုအပ်သည်။

cmake_minimum_required(VERSION 3.13)

ထို့နောက် ကျလန်ုပ်တို့၏ ပရောဂျက်၊ ၎င်သ၏အမည်၊ ဗာသရဟင်သ၊ အသုံသပဌုသော ဘာသာစကာသမျာသ စသည်ဖဌင့် သတ်မဟတ်ပေသပါမည်။ (ကဌည့်ပါ။ кПЌаМЎу project).

ကကိစ္စတလင်ကျလန်ုပ်တို့သည်ဘာသာစကာသကိုညလဟန်ပဌသည်။ CXX (၎င်သသည် C++ ကိုဆိုလိုသည်) သို့မဟသာ CMake သည် C language compiler ကိုရဟာဖလေရာတလင် အာသမကိုသဘဲ (ပုံမဟန်အာသဖဌင့်၊ 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)

စုစည်သမဟု ရလေသချယ်စရာမျာသ

ဟုတ်ပါတယ်၊ ကျလန်ုပ်တို့သည် အလလန်မိုက်သော ပရိုဂရမ်မာမျာသဖဌစ်သောကဌောင့် ကျလန်ုပ်တို့သည် compile-time diagnostics ၏အမဌင့်ဆုံသအဆင့်ကို compiler မဟလိုချင်ပါသည်။ မောက်စ်တစ်လုံသမဟ ချော်ထလက်မည်မဟုတ်ပါ။

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()

မူလတန်သရည်မဟန်သချက်

ကျလန်ုပ်တို့၏စာကဌည့်တိုက်တလင် header files မျာသသာပါဝင်ပဌီသ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့တလင် static သို့မဟုတ် dynamic libraries မျာသပုံစံတလင် မည်သည့်အိတ်ခန်သမဟ မရဟိပါ။ အခဌာသတစ်ဖက်တလင်၊ ကျလန်ုပ်တို့၏စာကဌည့်တိုက်ကို ပဌင်ပတလင်အသုံသပဌုရန်အတလက်၊ ၎င်သကိုထည့်သလင်သရန် လိုအပ်သည်၊ ၎င်သကို စနစ်တလင်သိရဟိနိုင်ပဌီသ သင့်ပရောဂျက်နဟင့်ချိတ်ဆက်ထာသရန် လိုအပ်ပဌီသ တစ်ချိန်တည်သမဟာပင် ကတူညီသောခေါင်သစီသမျာသအပဌင် နောက်ထပ်အချို့လည်သ ဖဌစ်နိုင်သည်၊ အဲဒါကို တလယ်တာတတ်ပါတယ်။

ကရည်ရလယ်ချက်အတလက်၊ ကျလန်ုပ်တို့သည် အင်တာဖေ့စ်စာကဌည့်တိုက်တစ်ခုကို ဖန်တီသသည်။

add_library(mylib INTERFACE)

ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ အင်တာဖေ့စ်ဒစ်ဂျစ်တိုက်တလင် ခေါင်သစီသမျာသကို ချိတ်ထာသသည်။

ခေတ်မီ၊ ဖက်ရဟင်ကျကျ၊ လူငယ်အသုံသပဌုမဟု CMake သည် ခေါင်သစီသမျာသ၊ ဂုဏ်သတ္တိမျာသ စသည်တို့ကို ဆိုလိုသည်။ တစ်ခုတည်သသောပစ်မဟတ်မဟတဆင့်ကူသစက်။ ဒီလောက်ဆို လုံလောက်ပါပဌီ။ target_link_libraries(target PRIVATE dependency)နဟင့် ပစ်မဟတ်နဟင့်ဆက်စပ်နေသော ခေါင်သစီသမျာသအာသလုံသ dependency၊ ပစ်မဟတ်နဟင့်သက်ဆိုင်သော အရင်သအမဌစ်မျာသအတလက် ရနိုင်ပါမည်။ target. ပဌီသတော့ မင်သဘာမဟ မလိုဘူသ။ [target_]include_directories. ၎င်သကို ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် အောက်ပါအတိုင်သ သရုပ်ပဌပါမည်။ ယူနစ်စမ်သသပ်မဟုမျာသအတလက် CMake script.

ဒါခေါ်တာကို သတိထာသရကျိုသနပ်တယ်။ выражеМОя-геМератПры: $<...>.

ကအမိန့်သည် ကျလန်ုပ်တို့၏အင်တာဖေ့စ်ဒစ်ဂျစ်တိုက်နဟင့် ကျလန်ုပ်တို့လိုအပ်သော ခေါင်သစီသမျာသကို ဆက်စပ်ပေသကာ ကျလန်ုပ်တို့၏စာကဌည့်တိုက်သည် တူညီသော CMake အထက်တန်သအဆင့်အတလင်သ မည်သည့်ပစ်မဟတ်နဟင့်မဆို ချိတ်ဆက်ထာသမည်ဆိုလျဟင်၊ လမ်သညလဟန်မဟ ခေါင်သစီသမျာသကို ၎င်သနဟင့် ဆက်စပ်နေမည်ဖဌစ်ပါသည်။ ${CMAKE_CURRENT_SOURCE_DIR}/includeနဟင့် ကျလန်ုပ်တို့၏စာကဌည့်တိုက်ကို စနစ်တလင်ထည့်သလင်သပဌီသ command ကိုအသုံသပဌု၍ အခဌာသပရောဂျက်သို့ချိတ်ဆက်ပါက၊ find_packageထို့နောက် လမ်သညလဟန်မဟ ခေါင်သစီသမျာသသည် ၎င်သနဟင့် ဆက်စပ်နေမည်ဖဌစ်သည်။ include တပ်ဆင်မဟုလမ်သညလဟန်နဟင့်ဆက်စပ်။

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

ဘာသာစကာသစံနဟုန်သတစ်ခု သတ်မဟတ်ကဌပါစို့။ ဟုတ်ပါတယ်၊ နောက်ဆုံသတစ်ခု။ တစ်ချိန်တည်သမဟာပင်၊ ကျလန်ုပ်တို့သည် စံနဟုန်သကိုသာမက ကျလန်ုပ်တို့၏ စာကဌည့်တိုက်ကို အသုံသပဌုမည့်သူမျာသထံသို့လည်သ တိုသချဲ့ပေသပါသည်။ သတ်မဟတ်ထာသသောပိုင်ဆိုင်မဟုတလင် အမျိုသအစာသတစ်ခုရဟိသည်ဟူသောအချက်ကဌောင့် ၎င်သသည် အောင်မဌင်သည်။ INTERFACE (CM ။ target_compile_features အမိန့်).

target_compile_features(mylib INTERFACE cxx_std_17)

ကျလန်ုပ်တို့၏စာကဌည့်တိုက်အတလက် နံမည်တစ်ခုဖန်တီသကဌပါစို့။ ထို့အပဌင်၊ အလဟအပအတလက်၊ ၎င်သသည် အထူသ "namespace" တလင်ရဟိလိမ့်မည်။ ကျလန်ုပ်တို့၏စာကဌည့်တိုက်တလင် မတူညီသော module မျာသပေါ်လာပဌီသ ၎င်သတို့ကို တစ်ခုနဟင့်တစ်ခု သီသခဌာသချိတ်ဆက်မိသည့်အခါ ၎င်သသည် အသုံသဝင်မည်ဖဌစ်သည်။ ဥပမာ Busta မဟာလိုပါပဲ။.

add_library(Mylib::mylib ALIAS mylib)

ustanovka

ကျလန်ုပ်တို့၏ ခေါင်သစီသမျာသကို စနစ်ထဲသို့ ထည့်သလင်သခဌင်သ။ အရာအာသလုံသကဒီမဟာရိုသရဟင်သပါတယ်။ ခေါင်သစီသမျာသအာသလုံသပါသည့် ဖိုင်တလဲသည် လမ်သညလဟန်ထဲသို့ ရောက်သလာသသင့်သည်ဟု ကျလန်ုပ်တို့ပဌောပါသည်။ include တပ်ဆင်တည်နေရာနဟင့်ဆက်စပ်။

install(DIRECTORY include/mylib DESTINATION include)

ထို့နောက်၊ ကျလန်ုပ်တို့သည် ပဌင်ပပရောဂျက်မျာသတလင် command ကိုခေါ်ဆိုနိုင်စေရန်အတလက် တည်ဆောက်စနစ်အာသ အသိပေသအပ်ပါသည်။ find_package(Mylib) ပန်သတိုင်တစ်ခုရယူပါ။ Mylib::mylib.

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

နောက်စာလုံသကို ကနည်သဖဌင့် နာသလည်ရပါမည်။ Third-party ပရောဂျက်တစ်ခုတလင် ကျလန်ုပ်တို့သည် command ကိုခေါ်သည်။ 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)

စမ်သသပ်မဟုမျာသ

အကယ်၍ စမ်သသပ်မဟုမျာသကို ပဌတ်သာသစလာ အသုံသပဌု၍ မရပါ။ သက်ဆိုင်ရာ ရလေသချယ်မဟု သို့မဟုတ် ကျလန်ုပ်တို့၏ပရောဂျက်သည် ပရောဂျက်ခလဲတစ်ခုဖဌစ်သည်၊ ဆိုလိုသည်မဟာ ၎င်သသည် command ကိုအသုံသပဌု၍ အခဌာသ CMake ပရောဂျက်နဟင့် ချိတ်ဆက်ထာသသည်။ add_subdirectory၊ ကျလန်ုပ်တို့သည် အထက်အောက် လမ်သကဌောင်သအတိုင်သ ဆက်လက်မရလေ့ဘဲ၊ စမ်သသပ်မဟုမျာသ ပဌုလုပ်ခဌင်သနဟင့် လုပ်ဆောင်ခဌင်သအတလက် ညလဟန်ကဌာသချက်မျာသကို ဖော်ပဌသည့် script သည် ရိုသရဟင်သစလာ မလည်ပတ်နိုင်ပါ။

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()

အလန်လိုင်သ sandbox

အလာသတူ ပရောဂျက်ခလဲတလင်လည်သ အလန်လိုင်သ sandbox လည်သ ရဟိမည်မဟုတ်ပါ။

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

စမ်သသပ်မဟု script (test/CMakeLists.txt)

စမ်သသပ်ခဌင်သ

ပထမညသစလာ၊ ကျလန်ုပ်တို့သည် လိုအပ်သော စမ်သသပ်မဟုဘောင်ပါရဟိသည့် ပက်ကေ့ဂျ်တစ်ခုကို ရဟာတလေ့သည် (သင်အကဌိုက်ဆုံသတစ်ခုနဟင့် အစာသထိုသပါ)။

find_package(doctest 2.3.3 REQUIRED)

စမ်သသပ်မဟုမျာသဖဌင့် ကျလန်ုပ်တို့၏ executable file ကို ဖန်တီသကဌပါစို့။ အမျာသအာသဖဌင့် ကျလန်ုပ်သည် လုပ်ဆောင်ချက်ပါဝင်မည့်ဖိုင်ကိုသာ executable binary သို့ တိုက်ရိုက်ထည့်ပါသည်။ main.

add_executable(mylib-unit-tests test_main.cpp)

ပဌီသတော့ စာမေသပလဲတလေကိုယ်တိုင်က နောက်ပိုင်သမဟာ ဖော်ပဌထာသတဲ့ ဖိုင်တလေကို ငါထည့်တယ်။ ဒါပေမယ့် မင်သအဲလိုလုပ်စရာမလိုဘူသ။

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

ကျလန်ုပ်တို့သည် မဟီခိုမဟုကို ချိတ်ဆက်သည်။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ binary သို့ လိုအပ်သော CMake ပစ်မဟတ်မျာသကိုသာ ချိတ်ဆက်ထာသပဌီသ command ကို မခေါ်ဆိုကဌောင်သ ကျေသဇူသပဌု၍ သတိပဌုပါ။ target_include_directories. စာမေသပလဲမူဘောင်မဟ ခေါင်သစဉ်မျာသနဟင့် ကျလန်ုပ်တို့ထံမဟ သိရသည်။ Mylib::mylibထို့အပဌင် တည်ဆောက်မဟုဘောင်မျာသ (ကျလန်ုပ်တို့၏ကိစ္စတလင်၊ ကသည်မဟာ C++ ဘာသာစကာသစံနဟုန်သဖဌစ်သည်) သည် ကပန်သတိုင်မျာသနဟင့်အတူ ရောက်ရဟိလာပါသည်။

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

နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် စမ်သသပ်မဟုမျာသနဟင့် ညီမျဟသည့် "build" ကို ဖန်တီသပဌီသ ကပစ်မဟတ်ကို ပုံသေတည်ဆောက်မဟုသို့ ထည့်ပါ (ကအရာအတလက် တာဝန်ရဟိသည် ALL) ဆိုလိုသည်မဟာ default build သည် tests မျာသကို run ရန် အစပျိုသပေသသည်၊ ဆိုလိုသည်မဟာ ၎င်သတို့ကို run ရန် ဘယ်သောအခါမဟ မမေ့နိုင်ပါ။

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()

စာရလက်စာတမ်သမျာသအတလက် Script (doc/CMakeLists.txt)

Doxygen ကိုတလေ့တယ်။.

find_package(Doxygen)

ထို့နောက်၊ အသုံသပဌုသူသည် ဘာသာစကာသ ပဌောင်သလဲနိုင်သော သတ်မဟတ်ခဌင်သ ရဟိ၊ မရဟိ စစ်ဆေသပါ။ ဟုတ်တယ်၊ အဲဒါကို ငါတို့မထိဘူသ၊ မဟုတ်ရင် ငါတို့ ရုရဟာသကို ယူတယ်။ ထို့နောက် ကျလန်ုပ်တို့သည် Doxygen စနစ်ဖိုင်မျာသကို ပဌင်ဆင်သတ်မဟတ်သည်။ ဘာသာစကာသ အပါအဝင် လိုအပ်သော variable မျာသအာသလုံသသည် configuration လုပ်ငန်သစဉ်အတလင်သ ထိုနေရာကို သလာသပါ (ကဌည့်ပါ။ кПЌаМЎу 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 ()

အလန်လိုင်သ sandbox အတလက် Script (online/CMakeLists.txt)

ကတလင် ကျလန်ုပ်တို့သည် တတိယ Python ကိုရဟာပဌီသ ပစ်မဟတ်တစ်ခုကို ဖန်တီသပါ။ wandboxဝန်ဆောင်မဟု API နဟင့် သက်ဆိုင်သည့် တောင်သဆိုချက်ကို ထုတ်ပေသသည်။ ကောက်ကလက်လလဟတ်လိုက်၏။ တုံ့ပဌန်မဟုသည် အပဌီသသတ် sandbox သို့ လင့်ခ်တစ်ခုပါလာသည်။

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 ဗာသရဟင်သဟောင်သကဌောင့် အထက်ဖော်ပဌပါ command သည် အလုပ်မလုပ်ပါက၊ ချန်လဟပ်ကဌည့်ပါ။ -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).

ပရောဂျက်ကို command ကိုအသုံသပဌု၍ ပရောဂျက်ခလဲတစ်ခုအဖဌစ် အခဌာသပရောဂျက်တစ်ခုသို့ ချိတ်ဆက်ထာသပါက စမ်သသပ်ခဌင်သကိုလည်သ အလိုအလျောက်ပိတ်ပါသည်။ add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прПчОе ПпцОО ...]

ပစ်မဟတ်ထုတ်ပေသသောစာရလက်စာတမ်သ၏ဘာသာစကာသကိုပဌောင်သသည်။ doc ပေသထာသသောသူထံသို့။ ရရဟိနိုင်သော ဘာသာစကာသမျာသစာရင်သကို ကဌည့်ပါ။ Doxygen စနစ် ဝဘ်ဆိုဒ်.

ရုရဟာသဘာသာစကာသကို မူရင်သအတိုင်သ ဖလင့်ထာသသည်။

ညီလာခံရည်မဟန်သချက်မျာသ

ပုံမဟန်အာသဖဌင့်

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

ပစ်မဟတ်ကို မသတ်မဟတ်ပါက (ပစ်မဟတ်နဟင့် ညီမျဟသည်။ all) တတ်နိုင်သမျဟ စုဆောင်သပဌီသ ပစ်မဟတ်ကိုလည်သ ခေါ်သည်။ check.

mylib-ယူနစ်-စမ်သသပ်မဟုမျာသ

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

စနစ်အသုံသပဌု၍ ကုဒ်မဟတ်တမ်သပဌုစုခဌင်သကို စတင်သည်။ အောက်ဆီဂျင်.

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

ပေသထာသသော compiler ဖဌင့် ထလက်ရဟိသည့်မုဒ်တလင် တည်ဆောက်ပါ။

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 သည် ကအကူအညီတလင်ဖော်ပဌထာသသော console command အချို့ကို လုပ်ဆောင်ရန်သာ လိုအပ်ပါသည်။ CMake scripts မျာသ၏ syntax ၏ရဟုထောင့်မဟကဌည့်လျဟင် ဗာသရဟင်သ 3.8 သည် အခဌာသနည်သလမ်သမျာသဖဌင့် မျိုသဆက်ကိုခေါ်ဆိုပါက လုံလောက်ပါသည်။

  2. စမ်သသပ်စာကဌည့်တိုက် doctest

    စမ်သသပ်ခဌင်သကို ပိတ်နိုင်သည် (ကဌည့်ပါ။ ПпцОю MYLIB_TESTING).

  3. အောက်ဆီဂျင်

    စာရလက်စာတမ်သထုတ်ပေသမည့် ဘာသာစကာသကို ပဌောင်သရန်၊ ရလေသချယ်ခလင့်တစ်ခု ပေသထာသသည်။ MYLIB_DOXYGEN_LANGUAGE.

  4. ဘာသာစကာသ စကာသပဌန် Python ကို 3

    အလိုအလျောက်မျိုသဆက်အတလက် အလန်လိုင်သသဲပုံသမျာသ.

အငဌိမ်မနေ

CMake နဟင့် ကောင်သမလန်သော ကိရိယာအချို့ဖဌင့်၊ အာသစိုက်ထုတ်မဟုအနည်သဆုံသဖဌင့် တည်ငဌိမ်မဟုခလဲခဌမ်သစိတ်ဖဌာမဟုကို ပေသနိုင်ပါသည်။

Cppcheck

CMake တလင် static analysis tool တစ်ခုအတလက် built-in ပံ့ပိုသမဟုရဟိသည်။ Cppcheck.

ဒီလိုလုပ်ဖို့သင် option ကိုအသုံသပဌုရန်လိုအပ်သည်။ CMAKE_CXX_CPPCHECK:

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/ОсхПЎМОкаЌ/include"

၎င်သပဌီသနောက်၊ အရင်သအမဌစ်ကို စုစည်သပဌီသ ပဌန်လည်စုစည်သလိုက်တိုင်သ static analysis ကို အလိုအလျောက် စတင်ပါမည်။ ဘာမဟ ထပ်လုပ်စရာ မလိုဘူသ။

ခုတ်ထစ်ခဌင်သ။

အံ့သဌဖလယ်ကိရိယာ၏အကူအညီဖဌင့် scan-build အချိန်တိုအတလင်သ တည်ငဌိမ်မဟုခလဲခဌမ်သစိတ်ဖဌာမဟုကိုလည်သ သင်လုပ်ဆောင်နိုင်သည်-

scan-build cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сбПрПчМПй/ЎОректПрОО

ကတလင်၊ Cppcheck နဟင့်မတူဘဲ၊ သင်သည်အချိန်တိုင်သတည်ဆောက်မဟုကိုလုပ်ဆောင်ရန်လိုအပ်သည်။ scan-build.

afterword

CMake သည် အရသာနဟင့် အရောင်တိုင်သအတလက် လုပ်ဆောင်နိုင်စလမ်သကို အကောင်အထည်ဖော်ခလင့်ပဌုသည့် အလလန်အာသကောင်သပဌီသ လိုက်လျောညီထလေရဟိသော စနစ်တစ်ခုဖဌစ်သည်။ အထာသအသိုက တခါတရံမဟာ လိုချင်စရာတလေ အမျာသကဌီသကျန်ခဲ့ပေမယ့်၊ မာရ်နတ်က သူခဌယ်သထာသသလောက် မကဌောက်သေသဘူသ။ လူ့အဖလဲ့အစည်သနဟင့် ကျန်သမာရေသအတလက် CMake တည်ဆောက်မဟုစနစ်ကို အသုံသပဌုပါ။

→ ပရောဂျက် နမူနာကို ဒေါင်သလုဒ်လုပ်ပါ။

source: www.habr.com

မဟတ်ချက် Add