CMake thiab C ++ yog cov kwv tij mus ib txhis

CMake thiab C ++ yog cov kwv tij mus ib txhis

Thaum lub sij hawm kev loj hlob, kuv nyiam hloov compilers, tsim hom, dependency versions, ua zoo li qub tsom xam, ntsuas kev ua tau zoo, sau cov kev pab them nqi, tsim cov ntaub ntawv, thiab lwm yam. Thiab kuv yeej hlub CMake vim nws tso cai rau kuv ua txhua yam kuv xav tau.

Ntau tus neeg thuam CMake, thiab feem ntau deservedly li ntawd, tab sis yog tias koj saib nws, tsis yog txhua yam yog phem heev, thiab tsis ntev los no. tsis phem kiag li, thiab cov kev taw qhia ntawm kev loj hlob yog qhov zoo heev.

Hauv daim ntawv no, kuv xav qhia koj yuav ua li cas yooj yim teeb tsa lub tsev qiv ntawv header hauv C ++ hauv CMake system kom tau txais cov haujlwm hauv qab no:

  1. Kev sib dhos;
  2. Autorun kev xeem;
  3. Kev ntsuas kev ntsuas kev ntsuas;
  4. Kev teeb tsa;
  5. Auto-cov ntaub ntawv;
  6. Online sandbox tiam;
  7. Kev soj ntsuam zoo li qub.

Leej twg twb nkag siab qhov zoo thiab C-ua tau yooj yim download tau qhov project template thiab pib siv nws.


Txheem

  1. Qhov project los ntawm sab hauv
    1. Qhov project qauv
    2. Main CMake file (./CMakeLists.txt)
      1. Cov ntaub ntawv project
      2. Kev xaiv qhov project
      3. Kev xaiv muab tso ua ke
      4. lub hom phiaj tseem ceeb
      5. chaw
      6. Kev sim
      7. Ntaub ntawv
      8. Online sandbox
    3. Test tsab ntawv (test/CMakeLists.txt)
      1. Kev Ntsuam Xyuas
      2. Kev pab them nqi
    4. Tsab ntawv rau cov ntaub ntawv (doc/CMakeLists.txt)
    5. Tsab ntawv rau online sandbox (online/CMakeLists.txt)
  2. Qhov project sab nraud
    1. Sib dhos
      1. Tiam
      2. Sib dhos
    2. Xaiv
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Cov hom phiaj sib dhos
      1. los ntawm neej ntawd hais
      2. mylib-unit-tests
      3. xyuas
      4. kev pab them nqi
      5. doc
      6. wandbox
    4. piv txwv
  3. Cov cuab yeej
  4. Kev soj ntsuam zoo li qub
  5. Tom qab ntawd

Qhov project los ntawm sab hauv

Qhov project qauv

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

Peb yuav tham txog yuav ua li cas npaj CMake scripts, yog li lawv yuav tau tham nyob rau hauv kom meej. Leej twg tuaj yeem saib cov ntaub ntawv seem ncaj qha ntawm nplooj ntawv template project.

Main CMake file (./CMakeLists.txt)

Cov ntaub ntawv project

Ua ntej ntawm tag nrho cov, koj yuav tsum tau thov qhov yuav tsum tau version ntawm CMake system. CMake tab tom hloov zuj zus, kev kos npe kos npe thiab tus cwj pwm hauv cov xwm txheej sib txawv tau hloov pauv. Txhawm rau CMake kom nkag siab tam sim ntawd qhov peb xav tau los ntawm nws, peb yuav tsum tau sau tam sim peb cov cai rau nws.

cmake_minimum_required(VERSION 3.13)

Tom qab ntawd peb yuav xaiv peb qhov project, nws lub npe, version, hom lus siv, thiab lwm yam (saib. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Hauv qhov no peb qhia cov lus CXX (thiab qhov no txhais tau tias C ++) kom CMake tsis strain thiab tshawb rau C lus compiler (los ntawm lub neej ntawd, CMake suav nrog ob hom lus: C thiab C ++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Ntawm no koj tuaj yeem tshawb xyuas tam sim ntawd seb peb qhov project puas suav nrog lwm qhov project raws li qhov project sub. Qhov no yuav pab tau ntau yam yav tom ntej.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Kev xaiv qhov project

Peb yuav muab ob txoj kev xaiv.

Thawj qhov kev xaiv yog MYLIB_TESTING - txhawm rau lov tes taw kev sim ntsuas. Qhov no tej zaum yuav tsim nyog yog tias peb paub tseeb tias txhua yam nyob rau hauv kev txiav txim nrog cov kev xeem, tab sis peb tsuas xav tau, piv txwv li, rau nruab lossis pob peb qhov project. Los yog peb qhov project yog suav nrog hauv qhov project sub-qhov no, tus neeg siv ntawm peb qhov project tsis txaus siab rau kev khiav peb cov kev xeem. Koj tsis sim qhov kev vam khom koj siv, koj puas yog?

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

Tsis tas li ntawd, peb yuav ua ib qho kev xaiv cais MYLIB_COVERAGE rau kev ntsuas cov cai tswj hwm los ntawm kev sim, tab sis nws yuav xav tau cov cuab yeej ntxiv, yog li nws yuav tsum tau qhib kom meej.

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

Kev xaiv muab tso ua ke

Ntawm chav kawm, peb yog txias ntxiv rau cov programmers, yog li peb xav tau qib siab tshaj plaws ntawm kev suav sau-sijhawm kuaj mob los ntawm lub compiler. Tsis yog ib tus nas yuav hla dhau.

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
)

Peb tseem yuav lov tes taw extensions thiaj li ua tau raws li C++ tus qauv lus. Lawv tau qhib los ntawm lub neej ntawd hauv CMake.

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

lub hom phiaj tseem ceeb

Peb lub tsev qiv ntawv tsuas muaj cov ntaub ntawv header xwb, uas txhais tau hais tias peb tsis muaj qhov tso pa tawm hauv daim ntawv ntawm cov tsev qiv ntawv zoo li qub lossis dynamic. Ntawm qhov tod tes, txhawm rau siv peb lub tsev qiv ntawv sab nraud, nws yuav tsum tau teeb tsa, nws yuav tsum tau kuaj pom hauv qhov system thiab txuas nrog koj qhov project, thiab tib lub sijhawm cov headers tib yam, nrog rau qee qhov ntxiv, txuas rau nws cov khoom.

Rau lub hom phiaj no, peb tsim ib lub tsev qiv ntawv interface.

add_library(mylib INTERFACE)

Peb khi headers rau peb lub tsev qiv ntawv interface.

Niaj hnub nimno, fashionable, hluas siv CMake implies hais tias headers, khoom, thiab lwm yam. kis tau los ntawm ib lub hom phiaj. Yog li txaus nws hais target_link_libraries(target PRIVATE dependency), thiab tag nrho cov headers uas txuam nrog lub hom phiaj dependency, yuav muaj rau qhov chaw teej tug mus rau lub hom phiaj target. Thiab koj tsis tas yuav muaj [target_]include_directories. Qhov no yuav qhia tau hais tias hauv qab no hauv kev txheeb xyuas CMake tsab ntawv rau chav kuaj.

Nws tseem tsim nyog them nqi rau qhov hu ua. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Cov lus txib no koom nrog cov headers peb xav tau nrog peb lub tsev qiv ntawv interface, thiab yog tias peb lub tsev qiv ntawv txuas nrog txhua lub hom phiaj hauv tib lub CMake hierarchy, ces cov headers los ntawm cov npe yuav cuam tshuam nrog nws. ${CMAKE_CURRENT_SOURCE_DIR}/include, thiab yog tias peb lub tsev qiv ntawv tau nruab rau ntawm lub kaw lus thiab txuas nrog lwm qhov project siv cov lus txib find_package, ces headers los ntawm cov directory yuav txuam nrog nws include txheeb ze rau lub installation directory.

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

Wb teem ib hom lus. Tau kawg, kawg kawg. Nyob rau tib lub sijhawm, peb tsis tsuas suav nrog tus qauv, tab sis kuj txuas ntxiv rau cov neeg uas yuav siv peb lub tsev qiv ntawv. Qhov no yog ua tiav vim qhov tseeb tias cov cuab yeej teeb tsa muaj qeb INTERFACE (saib target_compile_features hais kom ua).

target_compile_features(mylib INTERFACE cxx_std_17)

Cia peb tsim ib lub npe rau peb lub tsev qiv ntawv. Ntxiv mus, rau kev zoo nkauj, nws yuav nyob rau hauv tshwj xeeb "namespace". Qhov no yuav muaj txiaj ntsig zoo thaum cov qauv sib txawv tshwm sim hauv peb lub tsev qiv ntawv, thiab peb mus txuas rau lawv tus kheej ntawm ib leeg. Zoo li hauv Busta, piv txwv li.

add_library(Mylib::mylib ALIAS mylib)

chaw

Txhim kho peb cov headers rau hauv qhov system. Txhua yam yooj yim ntawm no. Peb hais tias cov ntawv tais ceev tseg nrog tag nrho cov headers yuav tsum mus rau hauv phau ntawv teev npe include txheeb ze rau qhov chaw installation.

install(DIRECTORY include/mylib DESTINATION include)

Tom ntej no, peb qhia rau tus tsim system uas peb xav kom muaj peev xwm hu rau cov lus txib nyob rau hauv peb-tog tej yaam num find_package(Mylib) thiab tau lub hom phiaj Mylib::mylib.

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

Cov lus sau tom ntej yuav tsum to taub li no. Thaum nyob rau hauv peb tes num peb hu rau cov lus txib find_package(Mylib 1.2.3 REQUIRED), thiab qhov tseeb version ntawm lub tsev qiv ntawv ntsia yuav incompatible nrog lub version 1.2.3CMake yuav cia li tsim qhov yuam kev. Ntawd yog, koj yuav tsis tas yuav taug qab versions manually.

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)

Kev sim

Yog tias cov kev ntsuam xyuas raug cuam tshuam los ntawm kev siv sib raug xaiv los yog peb qhov project yog subproject, uas yog, nws txuas nrog rau lwm qhov project CMake siv cov lus txib add_subdirectory, peb tsis txav mus ntxiv raws hierarchy, thiab tsab ntawv, uas piav txog cov lus txib rau kev tsim thiab khiav kev xeem, tsuas yog tsis khiav.

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

Ntaub ntawv

Cov ntaub ntawv tseem yuav tsis raug tsim nyob rau hauv cov ntaub ntawv ntawm ib qhov project sub.

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

Online sandbox

Ib yam li ntawd, qhov project subproject yuav tsis muaj online sandbox ib yam nkaus.

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

Test tsab ntawv (test/CMakeLists.txt)

Kev Ntsuam Xyuas

Ua ntej tshaj plaws, peb pom ib pob nrog cov txheej txheem xeem uas xav tau (hloov nrog koj nyiam).

find_package(doctest 2.3.3 REQUIRED)

Cia peb tsim peb cov ntaub ntawv executable nrog kev xeem. Feem ntau kuv ntxiv ncaj qha rau executable binary tsuas yog cov ntaub ntawv uas yuav muaj cov haujlwm main.

add_executable(mylib-unit-tests test_main.cpp)

Thiab kuv ntxiv cov ntaub ntawv uas qhov kev xeem lawv tus kheej tau piav qhia tom qab. Tab sis koj tsis tas yuav ua li ntawd.

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

Peb txuas kev vam meej. Thov nco ntsoov tias peb txuas tsuas yog CMake lub hom phiaj peb xav tau rau peb binary thiab tsis hu rau cov lus txib target_include_directories. Cov ncauj lus los ntawm lub hauv paus kev xeem thiab los ntawm peb Mylib::mylib, nrog rau kev tsim tsis tau (hauv peb qhov xwm txheej, qhov no yog C ++ tus qauv lus) tuaj nrog rau cov hom phiaj no.

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

Thaum kawg, peb tsim lub hom phiaj dummy, "tsim" uas yog sib npaug rau kev xeem khiav, thiab ntxiv lub hom phiaj no rau lub neej ntawd tsim (tus cwj pwm yog lub luag haujlwm rau qhov no. ALL). Qhov no txhais tau hais tias lub neej ntawd tsim ua rau cov kev xeem khiav, txhais tau tias peb yuav tsis hnov ​​​​qab khiav lawv.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Kev pab them nqi

Tom ntej no, peb qhib kev ntsuas kev ntsuas yog tias qhov kev xaiv tsim nyog tau teev tseg. Kuv yuav tsis nkag mus rau hauv cov ntsiab lus, vim tias lawv cuam tshuam ntau dua rau cov cuab yeej ntsuas kev ntsuas dua li CMake. Nws tsuas yog ib qho tseem ceeb uas yuav tsum nco ntsoov tias raws li cov txiaj ntsig ib lub hom phiaj yuav raug tsim coverage, uas nws yog qhov yooj yim los pib ntsuas kev pab cuam.

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

Tsab ntawv rau cov ntaub ntawv (doc/CMakeLists.txt)

Pom Doxygen.

find_package(Doxygen)

Tom ntej no, peb xyuas seb tus neeg siv puas tau teeb tsa cov lus sib txawv. Yog tias muaj, peb tsis kov nws, yog tias tsis yog, peb coj Lavxias. Tom qab ntawd peb teeb tsa Doxygen system cov ntaub ntawv. Txhua qhov kev hloov pauv tsim nyog, suav nrog cov lus, mus rau qhov ntawd thaum lub sijhawm teeb tsa (saib. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Tom qab ntawd peb tsim lub hom phiaj doc, uas yuav pib tsim cov ntaub ntawv. Txij li thaum tsim cov ntaub ntawv tsis yog qhov xav tau loj tshaj plaws hauv txoj kev txhim kho, lub hom phiaj yuav tsis raug qhib los ntawm lub neej ntawd; nws yuav tsum tau nthuav tawm meej meej.

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

Tsab ntawv rau online sandbox (online/CMakeLists.txt)

Ntawm no peb pom Python thib peb thiab tsim lub hom phiaj wandbox, uas tsim ib qho kev thov cuam tshuam rau qhov kev pabcuam API Wandbox, thiab xa nws mus. Cov lus teb tuaj nrog qhov txuas mus rau lub sandbox tiav.

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

Qhov project sab nraud

Tam sim no cia saib yuav ua li cas siv tag nrho cov no.

Sib dhos

Tsim qhov project no, zoo li lwm qhov project ntawm CMake tsim, muaj ob theem:

Tiam

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

Yog hais tias cov lus txib saum toj no tsis ua hauj lwm vim yog ib tug qub version ntawm CMake, sim omitting -S:

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

Xav paub ntau ntxiv txog kev xaiv.

Tsim qhov project

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

Xav paub ntau ntxiv txog cov hom phiaj sib dhos.

Xaiv

MYLIB_COVERAGE

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

suav nrog lub hom phiaj coverage, nrog rau qhov uas koj tuaj yeem pib ntsuas cov lej them nyiaj los ntawm kev xeem.

MYLIB_TESTING

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

Muab lub peev xwm los lov tes taw chav kuaj tsim thiab lub hom phiaj check. Raws li qhov tshwm sim, qhov ntsuas ntawm cov cai tswj hwm los ntawm kev ntsuas raug muab tua (saib. MYLIB_COVERAGE).

Kev kuaj kuj tseem raug kaw yog tias qhov project txuas nrog rau lwm qhov project raws li subproject siv cov lus txib add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Hloov cov lus ntawm cov ntaub ntawv uas lub hom phiaj tsim doc rau tus muab. Rau ib daim ntawv teev cov lus muaj, saib Doxygen system website.

Lavxias teb sab yog enabled los ntawm lub neej ntawd.

Cov hom phiaj sib dhos

los ntawm neej ntawd hais

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

Yog tias lub hom phiaj tsis tau teev tseg (uas yog sib npaug rau lub hom phiaj all), sau txhua yam nws ua tau, thiab tseem hu rau lub hom phiaj check.

mylib-unit-tests

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

Compiles chav kuaj. Enabled los ntawm lub neej ntawd.

xyuas

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

Khiav cov khoom sau (sau, yog tias tsis tau) chav kuaj. Enabled los ntawm lub neej ntawd.

Saib kuj mylib-unit-tests.

kev pab them nqi

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

Txheeb xyuas kev khiav haujlwm (khiav, yog tias tsis yog lawm) chav ntsuas kev ntsuas rau cov cai tswj hwm los ntawm kev sim siv qhov program gcovr.

Lub coatings yuav zoo li no:

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

Lub hom phiaj tsuas yog muaj thaum qhov kev xaiv tau qhib MYLIB_COVERAGE.

Saib kuj check.

doc

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

Pib tsim cov ntaub ntawv code siv lub system Cov pa.

wandbox

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

Cov lus teb los ntawm kev pabcuam zoo li no:

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

Kev pabcuam yog siv rau qhov no Wandbox. Kuv tsis paub tias lawv cov servers hloov pauv li cas, tab sis kuv xav tias lub sijhawm no yuav tsum tsis txhob raug tsim txom.

piv txwv

Tsim qhov project hauv hom kev debug nrog kev ntsuas kev ntsuas

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

Txhim kho qhov project yam tsis muaj kev sib dhos ua ntej thiab kev sim

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

Tsim nyob rau hauv kev tso tawm hom nrog ib tug muab compiler

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

Tsim cov ntaub ntawv ua lus Askiv

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

Cov cuab yeej

  1. Cawv 3.13

    Qhov tseeb, CMake version 3.13 tsuas yog yuav tsum tau khiav qee cov lus txib console tau piav qhia hauv qhov kev pab no. Los ntawm qhov pom ntawm cov syntax ntawm CMake scripts, version 3.8 yog txaus yog tias tiam hu ua lwm txoj kev.

  2. Cov tsev qiv ntawv xeem tus kws kho mob

    Kev sim tuaj yeem ua tsis taus (saib ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. Cov pa

    Txhawm rau hloov cov lus uas cov ntaub ntawv yuav raug tsim tawm, muaj kev xaiv MYLIB_DOXYGEN_LANGUAGE.

  4. Tus neeg txhais lus Nab hab sej 3

    Rau tiam tsis siv neeg online sandboxes.

Kev soj ntsuam zoo li qub

Nrog CMake thiab ob peb cov cuab yeej zoo, koj tuaj yeem muab kev soj ntsuam zoo li qub nrog kev siv zog tsawg.

Cppcheck

CMake muaj kev txhawb nqa rau cov cuab yeej ntsuas zoo li qub Cppcheck.

Ua li no koj yuav tsum siv qhov kev xaiv CMAKE_CXX_CPPCHECK:

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

Tom qab qhov no, kev txheeb xyuas zoo li qub yuav raug tso tawm txhua lub sij hawm qhov chaw muab tso ua ke thiab rov ua dua. Tsis tas yuav ua dab tsi ntxiv.

Txhab

Nrog kev pab los ntawm lub cuab yeej zoo scan-build Koj tseem tuaj yeem khiav kev txheeb xyuas zoo li qub tsis muaj sijhawm:

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

Ntawm no, tsis zoo li rooj plaub nrog Cppcheck, koj yuav tsum tau khiav qhov tsim txhua lub sijhawm scan-build.

Tom qab ntawd

CMake yog qhov muaj zog heev thiab hloov tau yooj yim uas tso cai rau koj los siv ua haujlwm rau txhua tus saj thiab xim. Thiab, txawm hais tias cov syntax qee zaum tawm ntau yam xav tau, dab ntxwg nyoog tseem tsis txaus ntshai li nws tau pleev xim. Siv CMake tsim qhov system kom muaj txiaj ntsig zoo rau tib neeg thiab kev noj qab haus huv.

β†’ Download tau qhov project template

Tau qhov twg los: www.hab.com

Ntxiv ib saib