CMake na C++ ni ndugu milele

CMake na C++ ni ndugu milele

Wakati wa usanidi, napenda kubadilisha vikusanyaji, kuunda hali, matoleo ya utegemezi, kufanya uchanganuzi tuli, kupima utendakazi, kukusanya chanjo, kuunda hati, n.k. Na ninaipenda sana CMake kwa sababu inaniruhusu kufanya kila kitu ninachotaka.

Watu wengi wanamkosoa CMake, na mara nyingi inastahili, lakini ukiiangalia, sio kila kitu ni mbaya sana, na hivi karibuni. sio mbaya hata kidogo, na mwelekeo wa maendeleo ni chanya kabisa.

Katika dokezo hili, nataka kukuambia jinsi ya kupanga tu maktaba ya kichwa katika C++ kwenye mfumo wa CMake kupata utendaji ufuatao:

  1. Mkutano;
  2. Vipimo vya Autorun;
  3. Kipimo cha chanjo ya kanuni;
  4. Ufungaji;
  5. Hati otomatiki;
  6. Uzalishaji wa sanduku la mchanga mtandaoni;
  7. Uchambuzi tuli.

Mtu yeyote ambaye tayari anaelewa faida na C-make anaweza kwa urahisi pakua kiolezo cha mradi na kuanza kuitumia.


yaliyomo

  1. Mradi kutoka ndani
    1. Muundo wa mradi
    2. Faili kuu ya CMake (./CMakeLists.txt)
      1. Taarifa za mradi
      2. Chaguzi za Mradi
      3. Chaguzi za mkusanyiko
      4. Kusudi kuu
      5. Ufungaji
      6. Majaribio
      7. Nyaraka
      8. Sanduku la mchanga la mtandaoni
    3. Hati ya jaribio (test/CMakeLists.txt)
      1. Upimaji
      2. Chanjo
    4. Hati ya uhifadhi (doc/CMakeLists.txt)
    5. Hati ya sanduku la mchanga mtandaoni (mtandaoni/CMakeLists.txt)
  2. Mradi nje
    1. Mkutano
      1. Uzazi
      2. Mkutano
    2. Chaguo
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Malengo ya mkutano
      1. By default
      2. vipimo vya mylib-unit
      3. kuangalia
      4. chanjo
      5. doc
      6. wandbox
    4. mifano
  3. Vyombo vya
  4. Uchambuzi tuli
  5. Baada ya

Mradi kutoka ndani

Muundo wa mradi

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

Hasa tutazungumza juu ya jinsi ya kupanga maandishi ya CMake, kwa hivyo yatajadiliwa kwa undani. Mtu yeyote anaweza kutazama faili zingine moja kwa moja kwenye ukurasa wa mradi wa kiolezo.

Faili kuu ya CMake (./CMakeLists.txt)

Taarifa za mradi

Kwanza kabisa, unahitaji kuomba toleo linalohitajika la mfumo wa CMake. CMake inabadilika, saini za amri na tabia katika hali tofauti zinabadilika. Ili CMake ielewe mara moja tunachotaka kutoka kwayo, tunahitaji kurekodi mahitaji yetu mara moja.

cmake_minimum_required(VERSION 3.13)

Kisha tutateua mradi wetu, jina lake, toleo, lugha zinazotumiwa, nk (tazama. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Katika kesi hii, tunaonyesha lugha CXX (na hii inamaanisha C++) ili CMake isisumbue na kutafuta mkusanyaji wa lugha C (kwa chaguo-msingi, CMake inajumuisha lugha mbili: C na C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Hapa unaweza kuangalia mara moja ikiwa mradi wetu umejumuishwa katika mradi mwingine kama mradi mdogo. Hii itasaidia sana katika siku zijazo.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Chaguzi za Mradi

Tutatoa chaguzi mbili.

Chaguo la kwanza ni MYLIB_TESTING - kuzima majaribio ya kitengo. Hii inaweza kuwa muhimu ikiwa tuna hakika kwamba kila kitu kiko sawa na vipimo, lakini tunataka tu, kwa mfano, kufunga au kufunga mradi wetu. Au mradi wetu umejumuishwa kama mradi mdogo - katika kesi hii, mtumiaji wa mradi wetu hapendi kuendesha majaribio yetu. Hujaribu vitegemezi unavyotumia, sivyo?

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

Kwa kuongeza, tutafanya chaguo tofauti MYLIB_COVERAGE kwa kupima ufunikaji wa msimbo kwa majaribio, lakini itahitaji zana za ziada, kwa hivyo itahitaji kuwezeshwa kwa uwazi.

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

Chaguzi za mkusanyiko

Bila shaka, sisi ni watengenezaji programu bora, kwa hivyo tunataka kiwango cha juu zaidi cha uchunguzi wa wakati kutoka kwa mkusanyaji. Hakuna panya hata mmoja atakayeteleza.

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
)

Pia tutazima viendelezi ili kutii kikamilifu kiwango cha lugha cha C++. Zinawezeshwa kwa chaguo-msingi katika CMake.

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

Kusudi kuu

Maktaba yetu ina faili za vichwa pekee, ambayo ina maana kwamba hatuna moshi wowote kwa njia ya maktaba tuli au zinazobadilika. Kwa upande mwingine, ili kutumia maktaba yetu nje, inahitaji kusakinishwa, inahitaji kugunduliwa kwenye mfumo na kuunganishwa na mradi wako, na wakati huo huo vichwa hivi hivi, na labda vingine vya ziada, zimeunganishwa nayo mali.

Kwa kusudi hili, tunaunda maktaba ya interface.

add_library(mylib INTERFACE)

Tunafunga vichwa kwenye maktaba yetu ya kiolesura.

Matumizi ya kisasa, ya mtindo, ya vijana ya CMake inamaanisha kuwa vichwa, mali, nk. hupitishwa kupitia lengo moja. Kwa hiyo inatosha kusema target_link_libraries(target PRIVATE dependency), na vichwa vyote vinavyohusishwa na lengo dependency, itapatikana kwa vyanzo vya walengwa target. Na hauitaji yoyote [target_]include_directories. Hii itaonyeshwa hapa chini katika uchambuzi CMake script kwa ajili ya vipimo vya kitengo.

Inafaa pia kulipa kipaumbele kwa kinachojulikana. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Amri hii inahusisha vichwa tunavyohitaji na maktaba yetu ya kiolesura, na ikiwa maktaba yetu imeunganishwa kwa lengo lolote ndani ya uongozi huo wa CMake, basi vichwa kutoka kwenye saraka vitahusishwa nayo. ${CMAKE_CURRENT_SOURCE_DIR}/include, na ikiwa maktaba yetu imewekwa kwenye mfumo na kushikamana na mradi mwingine kwa kutumia amri find_package, basi vichwa kutoka kwenye saraka vitahusishwa nayo include kuhusiana na saraka ya usakinishaji.

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

Hebu tuweke kiwango cha lugha. Bila shaka, ya mwisho kabisa. Wakati huo huo, sisi sio tu ni pamoja na kiwango, lakini pia kupanua kwa wale ambao watatumia maktaba yetu. Hii inafanikiwa kutokana na ukweli kwamba mali iliyowekwa ina kategoria INTERFACE (tazama target_compile_features amri).

target_compile_features(mylib INTERFACE cxx_std_17)

Hebu tuunde lakabu kwa maktaba yetu. Zaidi ya hayo, kwa uzuri, itakuwa katika "nafasi ya jina" maalum. Hii itakuwa muhimu wakati moduli tofauti zinaonekana kwenye maktaba yetu, na tunaenda kuziunganisha kwa kujitegemea. Kama katika Busta, kwa mfano.

add_library(Mylib::mylib ALIAS mylib)

Ufungaji

Kusakinisha vichwa vyetu kwenye mfumo. Kila kitu ni rahisi hapa. Tunasema kwamba folda iliyo na vichwa vyote inapaswa kuingia kwenye saraka include kuhusiana na eneo la ufungaji.

install(DIRECTORY include/mylib DESTINATION include)

Ifuatayo, tunafahamisha mfumo wa ujenzi ambao tunataka kuwa na uwezo wa kuita amri katika miradi ya watu wengine find_package(Mylib) na kupata lengo Mylib::mylib.

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

Spell inayofuata inapaswa kueleweka kwa njia hii. Wakati katika mradi wa tatu tunaita amri find_package(Mylib 1.2.3 REQUIRED), na toleo halisi la maktaba iliyosakinishwa halitaambatana na toleo hilo 1.2.3CMake itazalisha kosa kiotomatiki. Hiyo ni, hutahitaji kufuatilia matoleo kwa mikono.

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)

Majaribio

Ikiwa majaribio yamezimwa kwa kutumia chaguo sambamba au mradi wetu ni mradi mdogo, yaani, umeunganishwa na mradi mwingine wa CMake kwa kutumia amri add_subdirectory, hatusogei zaidi kwenye uongozi, na hati, ambayo inaelezea amri za kutengeneza na kuendesha vipimo, haifanyi kazi.

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

Nyaraka

Nyaraka pia hazitatolewa katika kesi ya mradi mdogo.

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

Sanduku la mchanga la mtandaoni

Vivyo hivyo, mradi mdogo hautakuwa na sanduku la mchanga mkondoni pia.

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

Hati ya jaribio (test/CMakeLists.txt)

Upimaji

Kwanza kabisa, tunapata kifurushi kilicho na mfumo wa mtihani unaohitajika (badilisha na uipendayo).

find_package(doctest 2.3.3 REQUIRED)

Wacha tuunde faili yetu inayoweza kutekelezwa na majaribio. Kawaida mimi huongeza moja kwa moja kwenye binary inayoweza kutekelezwa tu faili ambayo itakuwa na kazi main.

add_executable(mylib-unit-tests test_main.cpp)

Na ninaongeza faili ambazo vipimo vyenyewe vinaelezewa baadaye. Lakini si lazima ufanye hivyo.

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

Tunaunganisha utegemezi. Tafadhali kumbuka kuwa tuliunganisha shabaha za CMake pekee tulizohitaji kwenye mfumo wetu wa jozi na hatukuita amri target_include_directories. Vichwa kutoka kwa mfumo wa majaribio na kutoka kwa mfumo wetu Mylib::mylib, pamoja na vigezo vya kujenga (kwa upande wetu, hii ni kiwango cha lugha ya C ++) ilipitia pamoja na malengo haya.

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

Hatimaye, tunaunda lengo la dummy, "muundo" ambao ni sawa na kufanya majaribio, na kuongeza lengo hili kwa muundo chaguo-msingi (sifa inawajibika kwa hili. ALL) Hii ina maana kwamba muundo chaguomsingi huanzisha majaribio kufanya, kumaanisha kwamba hatutasahau kuyaendesha.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Chanjo

Ifuatayo, tunawezesha kipimo cha chanjo cha msimbo ikiwa chaguo sahihi limebainishwa. Sitaingia katika maelezo, kwa sababu yanahusiana zaidi na zana ya kupima chanjo kuliko CMake. Ni muhimu tu kutambua kwamba kulingana na matokeo lengo litaundwa coverage, ambayo ni rahisi kuanza kupima chanjo.

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

Hati ya uhifadhi (doc/CMakeLists.txt)

Kupatikana Doksijeni.

find_package(Doxygen)

Ifuatayo, tunaangalia ikiwa mtumiaji ameweka tofauti ya lugha. Ikiwa ndiyo, basi hatuigusa, ikiwa sio, basi tunachukua Kirusi. Kisha tunasanidi faili za mfumo wa Doxygen. Vigezo vyote muhimu, pamoja na lugha, huenda huko wakati wa mchakato wa usanidi (ona. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Kisha tunaunda lengo doc, ambayo itaanza kutoa hati. Kwa kuwa kutoa hati sio hitaji kubwa zaidi katika mchakato wa ukuzaji, lengo halitawezeshwa kwa chaguo-msingi; italazimika kuzinduliwa kwa uwazi.

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

Hati ya sanduku la mchanga mtandaoni (mtandaoni/CMakeLists.txt)

Hapa tunapata Python ya tatu na kuunda lengo wandbox, ambayo hutoa ombi linalolingana na API ya huduma Wandbox, na kumfukuza. Jibu linakuja na kiunga cha sanduku la mchanga lililomalizika.

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

Mradi nje

Sasa hebu tuangalie jinsi ya kutumia haya yote.

Mkutano

Kuunda mradi huu, kama mradi mwingine wowote kwenye mfumo wa ujenzi wa CMake, una hatua mbili:

Uzazi

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

Ikiwa amri iliyo hapo juu haikufanya kazi kwa sababu ya toleo la zamani la CMake, jaribu kuacha -S:

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

Zaidi kuhusu chaguzi.

Kujenga mradi

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

Zaidi kuhusu malengo ya mkusanyiko.

Chaguo

MYLIB_COVERAGE

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

Inajumuisha lengo coverage, ambayo unaweza kuanza kupima chanjo ya msimbo kwa majaribio.

MYLIB_TESTING

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

Hutoa uwezo wa kuzima muundo na lengo la jaribio la kitengo check. Kama matokeo, kipimo cha chanjo ya nambari na majaribio kimezimwa (tazama. MYLIB_COVERAGE).

Jaribio pia huzimwa kiotomatiki ikiwa mradi umeunganishwa kwa mradi mwingine kama mradi mdogo kwa kutumia amri add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Hubadilisha lugha ya hati ambayo lengwa hutoa doc kwa aliyepewa. Kwa orodha ya lugha zinazopatikana, ona Tovuti ya mfumo wa oksijeni.

Kirusi imewezeshwa kwa chaguo-msingi.

Malengo ya mkutano

By default

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

Ikiwa lengo halijabainishwa (ambayo ni sawa na lengo all), hukusanya kila kitu kinachoweza, na pia huita lengo check.

vipimo vya mylib-unit

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

Hukusanya vipimo vya kitengo. Imewashwa kwa chaguomsingi.

kuangalia

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

Huendesha majaribio ya kitengo yaliyokusanywa (yaliyokusanywa, ikiwa sio tayari). Imewashwa kwa chaguomsingi.

Angalia pia mylib-unit-tests.

chanjo

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

Huchanganua uendeshaji (huendesha, ikiwa bado) majaribio ya kitengo kwa ajili ya ufunikaji wa msimbo kwa majaribio kwa kutumia programu gcovr.

Kutolea nje kwa mipako kutaonekana kama hii:

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

Lengo linapatikana tu wakati chaguo limewashwa MYLIB_COVERAGE.

Angalia pia check.

doc

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

Huanzisha utayarishaji wa hati za msimbo kwa kutumia mfumo Doksijeni.

wandbox

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

Jibu kutoka kwa huduma inaonekana kama hii:

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

Huduma hutumiwa kwa hili Wandbox. Sijui jinsi seva zao zinavyobadilika, lakini nadhani fursa hii haipaswi kutumiwa vibaya.

mifano

Jenga mradi katika hali ya utatuzi na kipimo cha chanjo

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

Kufunga mradi bila mkusanyiko wa awali na upimaji

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

Unda katika hali ya kutolewa na mkusanyaji fulani

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

Inazalisha hati kwa Kiingereza

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

Vyombo vya

  1. CMake 3.13

    Kwa kweli, toleo la CMake 3.13 linahitajika tu kutekeleza baadhi ya amri za kiweko zilizoelezewa katika usaidizi huu. Kwa mtazamo wa syntax ya maandishi ya CMake, toleo la 3.8 linatosha ikiwa kizazi kinaitwa kwa njia zingine.

  2. Maktaba ya majaribio daktari

    Upimaji unaweza kulemazwa (tazama ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. Doksijeni

    Ili kubadilisha lugha ambayo nyaraka zitatolewa, chaguo hutolewa MYLIB_DOXYGEN_LANGUAGE.

  4. Mkalimani wa lugha Python 3

    Kwa kizazi cha moja kwa moja masanduku ya mchanga mtandaoni.

Uchambuzi tuli

Ukiwa na CMake na zana kadhaa nzuri, unaweza kutoa uchanganuzi tuli kwa bidii kidogo.

Cppcheck

CMake ina usaidizi wa ndani wa zana ya uchambuzi tuli Cppcheck.

Ili kufanya hivyo unahitaji kutumia chaguo CMAKE_CXX_CPPCHECK:

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

Baada ya hayo, uchanganuzi tuli utazinduliwa kiotomatiki kila wakati chanzo kinapokusanywa na kukusanywa tena. Hakuna haja ya kufanya chochote cha ziada.

kelele

Kwa msaada wa chombo cha ajabu scan-build Unaweza pia kufanya uchanganuzi tuli kwa muda mfupi:

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

Hapa, tofauti na kesi ya Cppcheck, unahitaji kuendesha ujenzi kila wakati scan-build.

Baada ya

CMake ni mfumo wenye nguvu sana na rahisi unaokuruhusu kutekeleza utendakazi kwa kila ladha na rangi. Na, ingawa sintaksia wakati mwingine huacha kuhitajika, shetani bado sio mbaya kama alivyochorwa. Tumia mfumo wa kujenga wa CMake kwa manufaa ya jamii na afya.

β†’ Pakua kiolezo cha mradi

Chanzo: mapenzi.com

Kuongeza maoni