CMake va C++ abadiy birodardir

CMake va C++ abadiy birodardir

Rivojlanish jarayonida men kompilyatorlarni o'zgartirishni, rejimlarni, qaramlik versiyalarini yaratishni, statik tahlil qilishni, ishlashni o'lchashni, qamrovni to'plashni, hujjatlarni yaratishni va hokazolarni yoqtiraman. Va men CMake-ni juda yaxshi ko'raman, chunki u menga xohlagan hamma narsani qilishimga imkon beradi.

Ko'pchilik CMake-ni tanqid qiladi va ko'pincha bunga loyiqdir, lekin agar qarasangiz, hamma narsa unchalik yomon emas va yaqinda umuman yomon emas, va rivojlanish yo'nalishi ancha ijobiy.

Ushbu eslatmada men sizga quyidagi funksiyalarni olish uchun CMake tizimida C++ da sarlavhalar kutubxonasini qanday tashkil qilishni aytmoqchiman:

  1. Yig'ish;
  2. Autorun testlari;
  3. Kod qamrovini o'lchash;
  4. O'rnatish;
  5. Avtomatik hujjatlashtirish;
  6. Onlayn sinov muhitini yaratish;
  7. Statik tahlil.

Afzalliklarni va C-makeni tushunadigan har bir kishi buni oddiygina qila oladi Loyiha shablonini yuklab olish va undan foydalanishni boshlang.


Mundarija

  1. Ichkaridan loyiha
    1. Loyiha tuzilishi
    2. Asosiy CMake fayli (./CMakeLists.txt)
      1. Loyiha haqida ma'lumot
      2. Loyiha imkoniyatlari
      3. Kompilyatsiya imkoniyatlari
      4. asosiy maqsad
      5. sozlama
      6. Sinovlar
      7. hujjatlar
      8. Onlayn sandbox
    3. Sinov skripti (test/CMakeLists.txt)
      1. Viktorina
      2. Qoplama
    4. Hujjatlar uchun skript (doc/CMakeLists.txt)
    5. Onlayn sinov muhiti uchun skript (online/CMakeLists.txt)
  2. Tashqarida loyiha
    1. O'rnatish
      1. Generatsiya
      2. O'rnatish
    2. Tanlovlar
      1. MYLIB_QAMLASH
      2. MYLIB_TEST
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Assambleya maqsadlari
      1. sukut
      2. mylib-birlik sinovlari
      3. nazorat
      4. qamrov
      5. doc
      6. tayoqchalar qutisi
    4. misollar
  3. asboblar
  4. Statik tahlil
  5. So'zdan keyin

Ichkaridan loyiha

Loyiha tuzilishi

.
β”œβ”€β”€ 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

Biz asosan CMake skriptlarini qanday tashkil qilish haqida gaplashamiz, shuning uchun ular batafsil muhokama qilinadi. Har kim qolgan fayllarni bevosita ko'rishi mumkin shablon loyihasi sahifasida.

Asosiy CMake fayli (./CMakeLists.txt)

Loyiha haqida ma'lumot

Avvalo, siz CMake tizimining kerakli versiyasini so'rashingiz kerak. CMake rivojlanmoqda, buyruq imzolari va turli sharoitlarda xatti-harakatlari o'zgarib bormoqda. CMake biz undan nimani xohlayotganimizni darhol tushunishi uchun biz unga bo'lgan talablarimizni darhol yozib olishimiz kerak.

cmake_minimum_required(VERSION 3.13)

Keyin biz loyihamizni, uning nomini, versiyasini, ishlatiladigan tillarni va hokazolarni belgilaymiz (qarang. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Bu holda biz tilni ko'rsatamiz CXX (va bu C++ degan ma'noni anglatadi), shuning uchun CMake C tili kompilyatorini izlamaydi va izlamaydi (sukut bo'yicha CMake ikkita tilni o'z ichiga oladi: C va C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Bu yerda siz bizning loyihamiz boshqa loyihaga kichik loyiha sifatida kiritilganligini darhol tekshirishingiz mumkin. Bu kelajakda ko'p yordam beradi.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Loyiha imkoniyatlari

Biz ikkita variantni taqdim etamiz.

Birinchi variant MYLIB_TESTING β€” birlik testlarini o'chirish uchun. Sinovlar bilan hamma narsa tartibda ekanligiga ishonchimiz komil bo'lsa, bu kerak bo'lishi mumkin, lekin biz faqat, masalan, loyihamizni o'rnatish yoki paketlashni xohlaymiz. Yoki bizning loyihamiz kichik loyiha sifatida kiritilgan - bu holda loyihamiz foydalanuvchisi bizning testlarimizni o'tkazishdan manfaatdor emas. Siz foydalanadigan bog'liqliklarni sinab ko'rmaysiz, shunday emasmi?

option(MYLIB_TESTING "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС" ON)

Bundan tashqari, biz alohida variantni qilamiz MYLIB_COVERAGE testlar orqali kod qamrovini o'lchash uchun, lekin u qo'shimcha vositalarni talab qiladi, shuning uchun uni aniq yoqish kerak bo'ladi.

option(MYLIB_COVERAGE "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ покрытия ΠΊΠΎΠ΄Π° тСстами" OFF)

Kompilyatsiya imkoniyatlari

Albatta, biz ajoyib dasturchilarmiz, shuning uchun kompilyatordan kompilyatsiya vaqtidagi diagnostikaning maksimal darajasini istaymiz. Birorta ham sichqonchadan sirg'alib o'tmaydi.

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++ tili standartiga toΚ»liq mos kelish uchun biz kengaytmalarni ham oΚ»chirib qoΚ»yamiz. Ular CMake-da sukut bo'yicha yoqilgan.

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

asosiy maqsad

Bizning kutubxonamiz faqat sarlavhali fayllardan iborat, ya'ni bizda statik yoki dinamik kutubxonalar ko'rinishidagi chiqindi yo'q. Boshqa tomondan, kutubxonamizdan tashqarida foydalanish uchun uni o'rnatish kerak, u tizimda aniqlanishi va loyihangizga ulangan bo'lishi kerak va shu bilan birga xuddi shu sarlavhalar, shuningdek, ba'zi qo'shimchalar, xususiyatlari unga biriktirilgan.

Shu maqsadda biz interfeys kutubxonasini yaratamiz.

add_library(mylib INTERFACE)

Biz sarlavhalarni interfeys kutubxonamizga bog'laymiz.

Zamonaviy, moda, yoshlar uchun CMake-dan foydalanish sarlavhalar, xususiyatlar va boshqalarni anglatadi. bitta maqsad orqali uzatiladi. Shuning uchun aytish kifoya target_link_libraries(target PRIVATE dependency), va maqsad bilan bog'langan barcha sarlavhalar dependency, maqsadga tegishli manbalar uchun mavjud bo'ladi target. Va sizga hech narsa kerak emas [target_]include_directories. Bu quyida tahlilda ko'rsatiladi Birlik testlari uchun CMake skripti.

Bundan tashqari, deb ataladigan narsaga ham e'tibor qaratish lozim. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Ushbu buyruq bizga kerak bo'lgan sarlavhalarni interfeys kutubxonamiz bilan bog'laydi va agar kutubxonamiz bir xil CMake ierarxiyasidagi istalgan maqsadga ulangan bo'lsa, katalogdagi sarlavhalar u bilan bog'lanadi. ${CMAKE_CURRENT_SOURCE_DIR}/include, va agar kutubxonamiz tizimga o'rnatilgan bo'lsa va buyruq yordamida boshqa loyihaga ulangan bo'lsa find_package, keyin katalogdagi sarlavhalar u bilan bog'lanadi include o'rnatish katalogiga nisbatan.

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

Keling, til standartini belgilaylik. Albatta, eng oxirgisi. Shu bilan birga, biz nafaqat standartni o'z ichiga olamiz, balki uni kutubxonamizdan foydalanadiganlar uchun ham kengaytiramiz. Bunga o'rnatilgan xususiyat toifaga ega bo'lganligi sababli erishiladi INTERFACE (Sm. target_compile_features buyrug'i).

target_compile_features(mylib INTERFACE cxx_std_17)

Keling, kutubxonamiz uchun taxallus yarataylik. Bundan tashqari, go'zallik uchun u maxsus "nomlar maydonida" bo'ladi. Bu bizning kutubxonamizda turli xil modullar paydo bo'lganda foydali bo'ladi va biz ularni bir-biridan mustaqil ravishda ulashga o'tamiz. Masalan, Bustadagi kabi.

add_library(Mylib::mylib ALIAS mylib)

sozlama

Sarlavhalarimizni tizimga o'rnatish. Bu erda hamma narsa oddiy. Biz barcha sarlavhalari bo'lgan papka katalogga kirishi kerakligini aytamiz include o'rnatish joyiga nisbatan.

install(DIRECTORY include/mylib DESTINATION include)

Keyinchalik, biz qurish tizimiga uchinchi tomon loyihalarida buyruqqa qo'ng'iroq qilishimiz mumkinligini xabar qilamiz find_package(Mylib) va maqsadga erishing Mylib::mylib.

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

Keyingi afsunni shu tarzda tushunish kerak. Uchinchi tomon loyihasida biz buyruqni chaqiramiz find_package(Mylib 1.2.3 REQUIRED), va o'rnatilgan kutubxonaning haqiqiy versiyasi versiyaga mos kelmaydi 1.2.3CMake avtomatik ravishda xato hosil qiladi. Ya'ni, versiyalarni qo'lda kuzatishingiz shart emas.

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)

Sinovlar

Agar testlar yordamida aniq o'chirilgan bo'lsa mos keladigan variant yoki bizning loyihamiz kichik loyihadir, ya'ni buyruq yordamida boshqa CMake loyihasiga ulanadi add_subdirectory, biz ierarxiya bo'ylab harakat qilmaymiz va testlarni yaratish va ishga tushirish buyruqlarini tavsiflovchi skript oddiygina ishlamaydi.

if(NOT MYLIB_TESTING)
    message(STATUS "ВСстированиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Mylib Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib Π½Π΅ тСстируСтся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ подмодуля")
else()
    add_subdirectory(test)
endif()

hujjatlar

Hujjatlar kichik loyihada ham yaratilmaydi.

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

Onlayn sandbox

Xuddi shunday, kichik loyihada ham onlayn sinov maydoni bo'lmaydi.

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

Sinov skripti (test/CMakeLists.txt)

Viktorina

Avvalo, biz kerakli test tizimiga ega paketni topamiz (sevimli bilan almashtiring).

find_package(doctest 2.3.3 REQUIRED)

Keling, testlar bilan bajariladigan faylimizni yarataylik. Odatda men to'g'ridan-to'g'ri bajariladigan ikkilik faylga faqat funktsiyani o'z ichiga olgan faylni qo'shaman main.

add_executable(mylib-unit-tests test_main.cpp)

Va men testlarning o'zlari keyinroq tasvirlangan fayllarni qo'shaman. Lekin buni qilish shart emas.

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

Biz bog'liqliklarni bog'laymiz. E'tibor bering, biz faqat o'zimizga kerak bo'lgan CMake maqsadlarini ikkilik tizimimizga bog'ladik va buyruqni chaqirmadik target_include_directories. Sinov tizimidan va bizdan sarlavhalar Mylib::mylib, shuningdek, qurish parametrlari (bizning holatda, bu C++ tili standarti) ushbu maqsadlar bilan birga keldi.

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

Va nihoyat, biz "qurilishi" ishlaydigan testlarga teng bo'lgan soxta maqsadni yaratamiz va bu maqsadni standart tuzilishga qo'shamiz (atribut bu uchun javobgardir. ALL). Bu shuni anglatadiki, standart tuzilish sinovlarni ishga tushirishni boshlaydi, ya'ni biz ularni bajarishni hech qachon unutmaymiz.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Qoplama

Keyinchalik, tegishli variant ko'rsatilgan bo'lsa, biz kod qamrovini o'lchashni yoqamiz. Men tafsilotlarga kirmayman, chunki ular CMake-dan ko'ra qamrovni o'lchash vositasiga ko'proq tegishli. Shuni ta'kidlash kerakki, natijalar asosida maqsad yaratiladi coverage, uning yordamida qamrovni o'lchashni boshlash qulay.

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

Hujjatlar uchun skript (doc/CMakeLists.txt)

Doksigen topildi.

find_package(Doxygen)

Keyinchalik, foydalanuvchi til o'zgaruvchisini o'rnatganligini tekshiramiz. Ha bo'lsa, biz unga tegmaymiz, bo'lmasa, rus tilini olamiz. Keyin biz Doxygen tizim fayllarini sozlaymiz. Barcha kerakli o'zgaruvchilar, shu jumladan til, konfiguratsiya jarayonida u erga boradi (qarang. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Keyin biz maqsadni yaratamiz doc, bu hujjatlarni yaratishni boshlaydi. Hujjatlarni yaratish ishlab chiqish jarayonida eng katta ehtiyoj emasligi sababli, maqsad sukut bo'yicha yoqilmaydi; u aniq ishga tushirilishi kerak.

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

Onlayn sinov muhiti uchun skript (online/CMakeLists.txt)

Bu erda biz uchinchi Pythonni topamiz va maqsadni yaratamiz wandbox, bu API xizmatiga mos keladigan so'rovni yaratadi Tayoqchalar qutisi, va uni jo'natadi. Javob tayyor sandboxga havola bilan birga keladi.

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

Tashqarida loyiha

Endi bularning barchasidan qanday foydalanishni ko'rib chiqaylik.

O'rnatish

Ushbu loyihani qurish, CMake qurish tizimidagi boshqa har qanday loyiha kabi, ikki bosqichdan iborat:

Generatsiya

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [ΠΎΠΏΡ†ΠΈΠΈ ...]

Agar yuqoridagi buyruq CMake-ning eski versiyasi tufayli ishlamasa, o'tkazib yuborib ko'ring -S:

cmake ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [ΠΎΠΏΡ†ΠΈΠΈ ...]

Variantlar haqida ko'proq.

Loyihani qurish

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [--target target]

Yig'ilish maqsadlari haqida ko'proq.

Tanlovlar

MYLIB_QAMLASH

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

Maqsadni o'z ichiga oladi coverage, uning yordamida siz testlar orqali kod qamrovini o'lchashni boshlashingiz mumkin.

MYLIB_TEST

cmake -S ... -B ... -DMYLIB_TESTING=OFF [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

Birlik sinovini qurish va maqsadni o'chirish imkoniyatini beradi check. Natijada, testlar bilan kod qamrovini o'lchash o'chiriladi (qarang. MYLIB_COVERAGE).

Agar loyiha boshqa loyihaga buyruq yordamida kichik loyiha sifatida ulangan bo'lsa, sinov ham avtomatik ravishda o'chiriladi add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

Maqsad yaratadigan hujjat tilini almashtiradi doc berilganiga. Mavjud tillar ro'yxati uchun qarang Doksigen tizimi veb-sayti.

Rus tili sukut bo'yicha yoqilgan.

Assambleya maqsadlari

sukut

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

Agar maqsad ko'rsatilmagan bo'lsa (bu maqsadga teng all), mumkin bo'lgan hamma narsani to'playdi, shuningdek, maqsadni chaqiradi check.

mylib-birlik sinovlari

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

Birlik testlarini tuzadi. Sukut bo'yicha yoqilgan.

nazorat

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target check

Yig'ilgan (to'plangan, agar bo'lmasa) birlik testlarini bajaradi. Sukut bo'yicha yoqilgan.

Shuningdek qarang mylib-unit-tests.

qamrov

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target coverage

Dastur yordamida testlar orqali kodni qamrab olish uchun ishlaydigan (agar hali bo'lmasa) birlik testlarini tahlil qiladi gcovr.

Qoplama egzosi quyidagicha ko'rinadi:

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

Maqsad faqat parametr yoqilganda mavjud bo'ladi MYLIB_COVERAGE.

Shuningdek qarang check.

doc

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target doc

Tizim yordamida kod hujjatlarini yaratishni boshlaydi Kislorod.

tayoqchalar qutisi

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target wandbox

Xizmatdan javob quyidagicha ko'rinadi:

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

Buning uchun xizmatdan foydalaniladi Tayoqchalar qutisi. Men ularning serverlari qanchalik moslashuvchanligini bilmayman, lekin menimcha, bu imkoniyatni suiiste'mol qilmaslik kerak.

misollar

Loyihani qamrovni o'lchash bilan disk raskadrovka rejimida yarating

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target coverage --parallel 16

Loyihani dastlabki yig'ish va sinovdan o'tkazmasdan o'rnatish

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=ΠΏΡƒΡ‚ΡŒ/ΠΊ/установойной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target install

Berilgan kompilyator bilan reliz rejimida tuzing

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=ΠΏΡƒΡ‚ΡŒ/ΠΊ/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ/ΠΊΡƒΠ΄Π°/установлСны/зависимости
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --parallel 4

Ingliz tilida hujjatlarni yaratish

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target doc

asboblar

  1. CMake 3.13

    Aslida, CMake 3.13 versiyasi faqat ushbu yordamda tasvirlangan ba'zi konsol buyruqlarini bajarish uchun talab qilinadi. CMake skriptlarining sintaksisi nuqtai nazaridan, agar generatsiya boshqa yo'llar bilan chaqirilsa, 3.8 versiyasi etarli.

  2. Sinov kutubxonasi doktest

    Sinov o'chirib qo'yilishi mumkin (qarang ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. Kislorod

    Hujjatlar yaratiladigan tilni almashtirish uchun variant taqdim etiladi MYLIB_DOXYGEN_LANGUAGE.

  4. Til tarjimoni Python 3

    Avtomatik ishlab chiqarish uchun onlayn sandboxlar.

Statik tahlil

CMake va bir nechta yaxshi vositalar yordamida siz minimal harakat bilan statik tahlilni ta'minlay olasiz.

Cppcheck

CMake statik tahlil vositasi uchun o'rnatilgan yordamga ega Cppcheck.

Buning uchun siz variantni ishlatishingiz kerak CMAKE_CXX_CPPCHECK:

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-IΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам/include"

Shundan so'ng, har safar manba kompilyatsiya qilinganda va qayta kompilyatsiya qilinganida statik tahlil avtomatik ravishda ishga tushiriladi. Qo'shimcha hech narsa qilishning hojati yo'q.

Jiringlash

Ajoyib vosita yordamida scan-build Siz qisqa vaqt ichida statik tahlilni ham bajarishingiz mumkin:

scan-build cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ

Bu erda, Cppcheck-dan farqli o'laroq, siz har safar qurilishni ishga tushirishingiz kerak scan-build.

So'zdan keyin

CMake - bu har qanday lazzat va rang uchun funksionallikni amalga oshirish imkonini beruvchi juda kuchli va moslashuvchan tizim. Va, garchi sintaksis ba'zida juda ko'p narsani xohlasa ham, shayton hali ham u bo'yalgandek dahshatli emas. Jamiyat va salomatlik manfaati uchun CMake qurish tizimidan foydalaning.

β†’ Loyiha shablonni yuklab olish

Manba: www.habr.com

a Izoh qo'shish