CMake iyo C++ waa walaalo weligood

CMake iyo C++ waa walaalo weligood

Inta lagu jiro horumarinta, waxaan jeclahay in aan beddelo isku-dubaridyada, dhisidda hababka, noocyada ku-tiirsanaanta, sameeyaan falanqaynta joogtada ah, cabbirka waxqabadka, ururinta caymiska, abuurista dukumeenti, iwm. Runtii waan jeclahay CMake sababtoo ah waxay ii ogolaataa inaan sameeyo wax kasta oo aan rabo.

Dad badan ayaa dhaleeceeya CMake, oo inta badan u qalmaan sidaas, laakiin haddii aad eegto, wax walba ma aha mid aad u xun, iyo dhawaan ma xuma haba yaraatee, iyo jihada horumarku waa mid aad u wanaagsan.

Qoraalkan, waxaan rabaa inaan kuu sheego sida si fudud loo abaabulo maktabadda madaxa ee C++ ee nidaamka CMake si aad u hesho shaqeynta soo socota:

  1. Golaha;
  2. Imtixaannada Autorun;
  3. Cabbirka koodka caymiska;
  4. Rakibaadda;
  5. Auto-documentation;
  6. Jiilka sanduuqa ciidda ee khadka tooska ah;
  7. Falanqaynta taagan

Qof kasta oo hore u fahmay faa'iidooyinka iyo C-samaynta si fudud soo dejiso template mashruuca oo bilow isticmaalkeeda.


Tusmo

  1. Mashruuca gudaha
    1. Qaab dhismeedka mashruuca
    2. Faylka ugu weyn ee CMake (./CMakeLists.txt)
      1. Macluumaadka mashruuca
      2. Ikhtiyaarada Mashruuca
      3. Xulashada ururinta
      4. Ujeedada ugu weyn
      5. Ku rakibida
      6. Baaritaanno
      7. Dukumentiyada
      8. Sanduuqa ciidda ee khadka tooska ah
    3. Qoraalka tijaabada (test/CmakeLists.txt)
      1. Imtixaanka
      2. Caymiska
    4. Qoraal qoraal ah (doc/CmakeLists.txt)
    5. Qoraalka sanduuqa sanduuqa khadka tooska ah (online/CmakeLists.txt)
  2. Mashruuca dibadda
    1. Golaha
      1. Jiilkii
      2. Golaha
    2. Fursadaha
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Golaha bartilmaameedyada
      1. by default
      2. mylib-unit-tijaabooyin
      3. hubiso
      4. caymiska
      5. Doc
      6. sanduuqa gacanta
    4. tusaalooyin
  3. alaabtii
  4. Falanqaynta taagan
  5. Kadib

Mashruuca gudaha

Qaab dhismeedka mashruuca

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

Waxaan inta badan ka hadli doonaa sida loo habeeyo qoraallada CMake, markaa si faahfaahsan ayaa looga doodi doonaa. Qof kastaa si toos ah ayuu u arki karaa faylalka intiisa kale bogga mashruuca template.

Faylka ugu weyn ee CMake (./CMakeLists.txt)

Macluumaadka mashruuca

Marka hore, waxaad u baahan tahay inaad codsato nooca loo baahan yahay ee nidaamka CMake. CMake wuu kobcayaa, saxeexyada amarka iyo habdhaqanka xaaladaha kala duwan ayaa isbeddelaya. Si CMake ay isla markiiba u fahamto waxa aan ka rabno, waxaan u baahanahay inaan isla markiiba diiwaan geliyo shuruudahayaga.

cmake_minimum_required(VERSION 3.13)

Markaa waxaan u qoondayn doonaa mashruucayaga, magaciisa, nooca, luqadaha la isticmaalo, iwm. (eeg. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Xaaladdan oo kale waxaan tilmaamaynaa luqadda CXX (tanina waxa ay la macno tahay C++) si aanu CMake u daadin oo aanu u raadin isku xidhka luuqada C (sida caadiga ah, CMake waxa ku jira laba luuqadood: C iyo C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Halkan waxaad isla markiiba ku hubin kartaa in mashruucayagu ku jiro mashruuc kale oo mashruuc-hoosaad ahaan ah. Tani waxay caawin doontaa wax badan mustaqbalka.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Ikhtiyaarada Mashruuca

Waxaan bixin doonaa laba ikhtiyaar.

Doorashada koowaad waa MYLIB_TESTING - in la joojiyo imtixaanada unugga. Tani waxay noqon kartaa lama huraan haddii aan hubinno in wax walba ay ku habboon yihiin imtixaannada, laakiin waxaan rabnaa kaliya, tusaale ahaan, inaan rakibno ama xirno mashruucayaga. Ama mashruuceena waxaa lagu daraa mashruuc-hoosaad ahaan - kiiskan, isticmaalayaasha mashruucayagu ma xiiseeyaan socodsiinta imtixaanadayada. Ma tijaabin ku tiirsanaanta aad isticmaasho, ma?

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

Intaa waxaa dheer, waxaan samayn doonaa doorasho gaar ah MYLIB_COVERAGE si loo cabbiro daboolida koodhka imtixaanada, laakiin waxay u baahan doontaa qalab dheeraad ah, markaa waxay u baahan doontaa in si cad loo furo.

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

Xulashada ururinta

Dabcan, waxaanu nahay kuwa qabow oo lagu daray barmaamijiyeyaasha, marka waxaan rabnaa heerka ugu sarreeya ee ogaanshaha waqtiga-waqtiga isku-dubaridiyaha. Ma jiro hal jiir oo simbiriirixaya.

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
)

Waxaan sidoo kale joojin doonaa kordhinta si aan si buuxda ugu hoggaansanno heerka luqadda C++. Waxay si toos ah ugu shaqeeyaan CMake.

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

Ujeedada ugu weyn

Maktabadeenu waxay ka kooban tahay faylalka madaxa, taas oo macnaheedu yahay ma hayno wax qiiq ah oo ah qaab maktabado taagan ama firfircoon. Dhanka kale, si loo isticmaalo maktabadeena dibadda, waxay u baahan tahay in la rakibo, waxay u baahan tahay in lagu ogaan karo nidaamka oo lagu xiro mashruucaaga, isla markaana isla kuwan madaxyada ah, iyo sidoo kale laga yaabo inay jiraan qaar dheeraad ah. waxay ku dheggan yihiin guryaha.

Ujeedadan awgeed, waxaan u abuurnaa maktabad interface ah.

add_library(mylib INTERFACE)

Waxaan ku xidhaa madaxyada maktabadeena interface.

Casriga, moodada, isticmaalka dhalinyarada ee CMake waxay ka dhigan tahay madaxyada, guryaha, iwm. lagu kala qaado hal bartilmaameed. Marka waxaa ku filan in la yiraahdo target_link_libraries(target PRIVATE dependency), iyo dhammaan madaxyada ku xiran bartilmaameedka dependency, ayaa loo heli doonaa ilaha la beegsanayo target. Midna uma baahnid [target_]include_directories. Tan waxaa lagu muujin doonaa hoosta falanqaynta Samee qoraalka imtixaanada cutubka.

Waxa kale oo mudan in fiiro gaar ah loo yeesho waxa loogu yeero. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Amarkani waxa uu xidhiidhiyaa madaxyada aan u baahanahay maktabadeena is-dhex-galka ah, iyo haddii maktabadeena ku xidhan tahay bartilmaameed kasta oo ka mid ah isla hay'adda CMake, markaa madaxyada buuggu waa lala xidhiidhin doonaa ${CMAKE_CURRENT_SOURCE_DIR}/include, iyo haddii maktabadeena lagu rakibay nidaamka oo lagu xiro mashruuc kale iyadoo la adeegsanayo amarka find_package, ka dibna madaxyada ka socda hagaha ayaa lala xidhiidhin doonaa include marka loo eego tusaha rakibaadda.

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

Aynu dejinno halbeegga luqadda. Dabcan, kii ugu dambeeyay. Isla mar ahaantaana, kuma darin heerka caadiga ah, laakiin sidoo kale waxaan u fidinnaa kuwa isticmaali doona maktabadeena. Tan waxaa lagu gaaraa sababtoo ah xaqiiqda ah in hantida la dejiyay ay leedahay qayb INTERFACE (eeg target_compile_features order).

target_compile_features(mylib INTERFACE cxx_std_17)

Aynu abuurno magac loo yaqaan maktabadeena. Waxaa intaa dheer, quruxda, waxay ku jiri doontaa "magaca magac" gaar ah. Tani waxay faa'iido yeelan doontaa marka qaybo kala duwan ay ka soo muuqdaan maktabadeena, oo waxaan aadeynaa si aan isku xirno iyaga oo aan midba midka kale ahayn. Sida Busta, tusaale ahaan.

add_library(Mylib::mylib ALIAS mylib)

Ku rakibida

Ku rakibida madaxyadayada nidaamka. Wax walba waa sahlan yihiin halkan. Waxa aanu nidhi galka ay ku jiraan madaxyada oo dhan waa in ay galaan hagaha include marka loo eego goobta lagu rakibay.

install(DIRECTORY include/mylib DESTINATION include)

Marka xigta, waxaan ku wargelineynaa nidaamka dhismaha in aan rabno inaan awoodno inaan u yeerno taliska mashaariicda dhinac saddexaad find_package(Mylib) oo yool hel Mylib::mylib.

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

Sixirka xiga waa in sidan loo fahmo. Marka mashruuca dhinac saddexaad waxaan u wacnaa amarka find_package(Mylib 1.2.3 REQUIRED), iyo nooca dhabta ah ee maktabadda la rakibay waxay noqon doontaa mid aan la socon karin nooca 1.2.3CMake ayaa si toos ah u dhalin doonta qalad Taasi waa, uma baahnid inaad gacanta ku raacdo noocyada.

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)

Baaritaanno

Haddii baaritaanada la naafo si cad loo isticmaalo doorasho u dhiganta ama mashruucayagu waa mashruuc-hoosaad, taas oo ah, waxay ku xidhan tahay mashruuc kale oo CMake ah iyadoo la adeegsanayo amarka add_subdirectory, kuma sii soconno nidaamka kala sareynta, iyo qoraalka, oo qeexaya amarrada abuurista iyo socodsiinta imtixaannada, si fudud uma socon.

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

Dukumentiyada

Dukumeenti sidoo kale lama soo saari doono kiiska mashruuc-hoosaad.

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

Sanduuqa ciidda ee khadka tooska ah

Sidoo kale, mashruuc-hoosaadku sidoo kale ma lahaan doono sanduuq-cameedka khadka tooska ah.

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

Qoraalka tijaabada (test/CmakeLists.txt)

Imtixaanka

Ugu horreyntii, waxaan helnaa xirmo leh qaabka imtixaanka loo baahan yahay (ku beddel midka aad jeceshahay).

find_package(doctest 2.3.3 REQUIRED)

Aynu abuurno faylkeena la fulin karo oo leh imtixaanno. Caadi ahaan waxaan si toos ah ugu daraa binary-ga la fulin karo kaliya faylka ku jiri doona shaqada main.

add_executable(mylib-unit-tests test_main.cpp)

Oo waxaan ku daraa faylal kuwaas oo imtixaanada laftooda lagu sharraxay hadhow. Laakin ma aha inaad taas samayso.

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

Waxaan isku xirnaa ku tiirsanaanta. Fadlan la soco in aan ku xidhnay kaliya bartilmaameedyada CMake ee aan u baahannahay ee binary-ga oo aanaan wicin amarka target_include_directories. Ciwaanka ka yimid qaabka imtixaanka iyo kayaga Mylib::mylib, iyo sidoo kale in la dhiso xuduudaha (xaaladkeena, tani waa heerka luqadda C++) ayaa la yimid ujeedooyinkan.

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

Ugu dambayntii, waxaanu abuurnaa yool aan fiicneyn, "dhismaha" kaas oo u dhigma imtixaannada socda, waxaanan ku darnaa bartilmaameedkan dhismaha caadiga ah (sifada ayaa mas'uul ka ah tan. ALL). Tani waxay ka dhigan tahay in dhismaha caadiga ah uu kiciyo imtixaanada si ay u socdaan, taasoo la micno ah inaan waligeen iloobi doonin inaan wadno.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Caymiska

Marka xigta, waxaanu awoodnaa cabbirka daboolka koodka haddii doorashada ku habboon la cayimay. Ma geli doono faahfaahinta, sababtoo ah waxay la xiriiraan in ka badan qalabka lagu cabbiro caymiska marka loo eego CMake. Waxa kaliya oo muhiim ah in la ogaado in iyada oo ku saleysan natiijooyinka la abuurayo yool coverage, kaas oo ay ku habboon tahay in la bilaabo cabbiraadda caymiska.

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

Qoraal qoraal ah (doc/CmakeLists.txt)

Waxaa la helay Doxygen.

find_package(Doxygen)

Marka xigta, waxaan hubineynaa in isticmaaluhu uu dhigay doorsoomiyaha luqadda. Hadday haa tahay, markaa ma taabaneyno, haddii kale, markaa waxaan qaadanaa Ruush. Kadibna waxaan dejineynaa faylalka nidaamka Doxygen. Dhammaan doorsoomayaasha lagama maarmaanka ah, oo ay ku jiraan luqadda, waxay tagaan halkaas inta lagu jiro habka qaabeynta (eeg. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Markaa waxaan abuurnaa yool doc, kaas oo bilaabi doona soo saarista dukumentiyada. Maadaama soo saarista dukumeenti aysan ahayn baahida ugu weyn ee geeddi-socodka horumarinta, bartilmaameedka looma suurtagelin doono si qalad ah, waa in si cad loo bilaabo.

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

Qoraalka sanduuqa sanduuqa khadka tooska ah (online/CmakeLists.txt)

Halkan waxaan ka helnaa Python saddexaad oo aan abuurno bartilmaameed wandbox, kaas oo dhaliya codsi u dhigma API-ga adeegga Wandbox, wuuna diray. Jawaabtu waxay la socotaa isku xirka sanduuqa ciid ee dhammeeyey.

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

Mashruuca dibadda

Hadda aan eegno sida loo isticmaalo waxaas oo dhan.

Golaha

Dhismaha mashruucan, sida mashruuc kasta oo kale oo ku saabsan nidaamka dhisidda CMake, wuxuu ka kooban yahay laba marxaladood:

Jiilkii

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

Haddii amarka kore uusan shaqeynin nooc hore ee CMake, isku day inaad iska dhaafto -S:

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

Wax badan oo ku saabsan doorashooyinka.

Dhismaha mashruuca

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

Wax badan oo ku saabsan yoolalka shirka.

Fursadaha

MYLIB_COVERAGE

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

Waxa ku jira bartilmaameed coverage, kaas oo aad ku bilaabi karto in lagu cabbiro daboolka kood imtixaannada.

MYLIB_TESTING

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

Waxay bixisaa awoodda lagu baabi'iyo dhismaha iyo bartilmaameedka tijaabada cutubka check. Natiijo ahaan, cabbiraadda caymiska koodhka ee imtixaanada waa la damiyay (eeg. MYLIB_COVERAGE).

Tijaabada sidoo kale si toos ah ayaa loo curyaami doonaa haddii mashruucu ku xidhmo mashruuc kale oo mashruuc hoosaad ahaan isticmaalaya amarka add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Beddela luqadda dukumeentiga uu bartilmaameedku soo saaro doc midda la siiyey. Liiska luqadaha la heli karo, eeg Mareegta nidaamka Doxygen.

Ruushku si toos ah ayaa loo furay

Golaha bartilmaameedyada

by default

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

Haddii aan la cayimin bartilmaameedka (taas oo u dhiganta bartilmaameedka all), ururiya wax kasta oo uu awoodo, iyo sidoo kale wac bartilmaameedka check.

mylib-unit-tijaabooyin

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

Wuxuu ururiyaa imtixaanada unugga. U sahlay si caadi ah

hubiso

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

Wuxuu wadaa imtixaanada cutubyada la ururiyay (la ururiyay, haddaysan ahaynba) U sahlay si caadi ah

Sidoo kale fiiri mylib-unit-tests.

caymiska

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

Waxay ku baartaa socodsiinta (orod, haddaanay horayba) u socon gcovr.

qiiqa dahaarka ayaa u ekaan doona sidatan:

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

Bartilmaameedka ayaa la heli karaa kaliya marka ikhtiyaarka la furo MYLIB_COVERAGE.

Sidoo kale fiiri check.

Doc

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

Wuxuu bilaabaa abuurista dukumeenti kood isagoo isticmaalaya nidaamka Doxygen.

sanduuqa gacanta

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

Jawaabta ka timid adeeggu waxay u egtahay sidan:

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

Adeegga waxaa loo isticmaalaa tan Wandbox. Ma garanayo sida ay u jajaban yihiin server-kooda, laakiin waxaan qabaa in fursadan aan lagu xadgudbin.

tusaalooyin

Ku dhis mashruuca qaab debug ah oo leh cabbirka caymiska

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

Rakibaadda mashruuc iyada oo aan la isku keenin iyo tijaabin horudhac ah

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

Ku dhis qaabka siidaynta adoo isticmaalaya iskudubarid la bixiyay

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

Soo saarista dukumeenti af Ingiriisi ah

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

alaabtii

  1. CMake 3.13

    Dhab ahaantii, nooca CMake 3.13 ayaa kaliya looga baahan yahay si uu u socodsiiyo qaar ka mid ah amarrada console-ka ee lagu sharraxay kaalmadan. Marka laga eego aragtida syntax ee qoraallada CMake, nooca 3.8 ayaa ku filan haddii jiilka loogu yeero siyaabo kale.

  2. Maktabadda tijaabada dhakhtar

    Tijaabada waa la joojin karaa (eeg ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. Doxygen

    Si loo beddelo luqadda dukumeentiga lagu soo saari doono, ikhtiyaar ayaa la bixiyaa MYLIB_DOXYGEN_LANGUAGE.

  4. Turjubaanka luqadda Python 3

    Jiilka tooska ah sanduuqyada ciidda online.

Falanqaynta taagan

CMake iyo dhowr qalab oo wanaagsan, waxaad ku bixin kartaa falanqaynta taagan oo leh dadaal yar.

Cppcheck

CMake waxay leedahay taageero ku dhisan qalab falanqaynta taagan Cppcheck.

Si aad tan u samayso waxaad u baahan tahay inaad isticmaasho ikhtiyaarka CMAKE_CXX_CPPCHECK:

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

Taas ka dib, falanqaynta joogtada ah ayaa si toos ah loo bilaabi doonaa mar kasta oo isha la ururiyo oo dib loo ururiyo. Looma baahna in la sameeyo wax dheeraad ah.

Calaacal

Iyada oo la kaashanayo qalab cajiib ah scan-build Waxa kale oo aad samayn kartaa falanqeyn taagan waqti aan la joogin:

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

Halkan, si ka duwan kiiskii Cppcheck, waxaad u baahan tahay inaad dhisto mar walba scan-build.

Kadib

CMake waa nidaam aad u awood badan oo dabacsan kaas oo kuu ogolaanaya inaad hirgeliso shaqeynta dhadhan kasta iyo midab kasta. Oo, in kasta oo syntax mararka qaarkood ka tago wax badan in la doonayo, Ibliisku weli ma aha sida laga cabsado sida uu rinji. U isticmaal nidaamka dhisidda CMake danta bulshada iyo caafimaadka.

β†’ Soo deji qaabka mashruuca

Source: www.habr.com

Add a comment