Ang CMake at C++ ay magkapatid magpakailanman

Ang CMake at C++ ay magkapatid magpakailanman

Sa panahon ng pag-unlad, gusto kong baguhin ang mga compiler, bumuo ng mga mode, dependency na bersyon, magsagawa ng static na pagsusuri, sukatin ang pagganap, mangolekta ng coverage, bumuo ng dokumentasyon, atbp. At mahal na mahal ko ang CMake dahil pinapayagan ako nitong gawin ang lahat ng gusto ko.

Maraming tao ang pumupuna sa CMake, at kadalasan ay nararapat, ngunit kung titingnan mo ito, hindi lahat ay napakasama, at kamakailan lamang hindi masama sa lahat, at ang direksyon ng pag-unlad ay medyo positibo.

Sa talang ito, gusto kong sabihin sa iyo kung paano simpleng ayusin ang isang header library sa C++ sa CMake system para makuha ang sumusunod na functionality:

  1. Assembly;
  2. Mga pagsubok sa Autorun;
  3. Pagsukat ng saklaw ng code;
  4. Pag-install;
  5. Auto-dokumentasyon;
  6. Online na pagbuo ng sandbox;
  7. Static na pagsusuri.

Ang sinumang nakakaunawa na sa mga pakinabang at C-make ay maaari nang simple i-download ang template ng proyekto at simulan ang paggamit nito.


nilalaman

  1. Proyekto mula sa loob
    1. Istraktura ng proyekto
    2. Pangunahing CMake file (./CMakeLists.txt)
      1. Impormasyon ng proyekto
      2. Mga Opsyon sa Proyekto
      3. Mga pagpipilian sa compilation
      4. Ang pangunahing layunin ng
      5. Instalasyon
      6. Mga Pagsubok
      7. Records
      8. Online na sandbox
    3. Test script (test/CMakeLists.txt)
      1. Pagsubok
      2. Coverage
    4. Script para sa dokumentasyon (doc/CMakeLists.txt)
    5. Script para sa online na sandbox (online/CMakeLists.txt)
  2. Project sa labas
    1. Assembly
      1. Pagbuo
      2. Assembly
    2. Mga Pagpipilian sa
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Mga target ng pagpupulong
      1. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
      2. mylib-unit-tests
      3. tsek
      4. coverage
      5. doc
      6. wandbox
    4. Mga halimbawa
  3. Tools
  4. Static na pagsusuri
  5. afterword

Proyekto mula sa loob

Istraktura ng proyekto

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

Pangunahing pag-uusapan natin kung paano ayusin ang mga script ng CMake, kaya tatalakayin ang mga ito nang detalyado. Maaaring direktang tingnan ng sinuman ang iba pang mga file sa pahina ng template ng proyekto.

Pangunahing CMake file (./CMakeLists.txt)

Impormasyon ng proyekto

Una sa lahat, kailangan mong hilingin ang kinakailangang bersyon ng CMake system. Nagbabago ang CMake, nagbabago ang mga lagda ng command at pag-uugali sa iba't ibang kundisyon. Upang agad na maunawaan ng CMake kung ano ang gusto natin mula dito, kailangan nating itala agad ang ating mga kinakailangan para dito.

cmake_minimum_required(VERSION 3.13)

Pagkatapos ay itatalaga namin ang aming proyekto, ang pangalan nito, bersyon, mga wikang ginamit, atbp. (tingnan. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Sa kasong ito, ipinapahiwatig namin ang wika CXX (at ang ibig sabihin nito ay C++) upang ang CMake ay hindi pilitin at maghanap ng isang C language compiler (bilang default, ang CMake ay may kasamang dalawang wika: C at C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Dito maaari mong suriin kaagad kung ang aming proyekto ay kasama sa isa pang proyekto bilang isang subproject. Malaki ang maitutulong nito sa hinaharap.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Mga Opsyon sa Proyekto

Magbibigay kami ng dalawang pagpipilian.

Ang unang pagpipilian ay MYLIB_TESTING β€” upang huwag paganahin ang mga pagsubok sa yunit. Maaaring kailanganin ito kung sigurado kaming maayos ang lahat sa mga pagsubok, ngunit gusto lang namin, halimbawa, i-install o i-package ang aming proyekto. O ang aming proyekto ay kasama bilang isang subproyekto - sa kasong ito, ang gumagamit ng aming proyekto ay hindi interesado sa pagpapatakbo ng aming mga pagsubok. Hindi mo sinusubukan ang mga dependency na ginagamit mo, hindi ba?

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

Bilang karagdagan, gagawa kami ng isang hiwalay na pagpipilian MYLIB_COVERAGE para sa pagsukat ng saklaw ng code sa pamamagitan ng mga pagsubok, ngunit mangangailangan ito ng mga karagdagang tool, kaya kakailanganin itong i-enable nang tahasan.

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

Mga pagpipilian sa compilation

Siyempre, kami ay cool plus programmer, kaya gusto namin ang maximum na antas ng mga diagnostic ng compile-time mula sa compiler. Walang makalusot ni isang mouse.

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
)

Idi-disable din namin ang mga extension upang ganap na makasunod sa pamantayan ng wika ng C++. Ang mga ito ay pinagana bilang default sa CMake.

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

Ang pangunahing layunin ng

Ang aming library ay binubuo lamang ng mga header file, na nangangahulugang wala kaming anumang tambutso sa anyo ng mga static o dynamic na library. Sa kabilang banda, upang magamit ang aming library sa labas, kailangan itong mai-install, kailangan itong ma-detect sa system at konektado sa iyong proyekto, at sa parehong oras ang parehong mga header na ito, pati na rin ang ilang mga karagdagang, ay nakakabit sa mga katangian nito.

Para sa layuning ito, lumikha kami ng isang interface library.

add_library(mylib INTERFACE)

Binibinhi namin ang mga header sa aming library ng interface.

Ang moderno, naka-istilong, kabataan na paggamit ng CMake ay nagpapahiwatig na ang mga header, property, atbp. ipinadala sa pamamagitan ng isang solong target. Kaya sapat na itong sabihin target_link_libraries(target PRIVATE dependency), at lahat ng mga header na nauugnay sa target dependency, ay magiging available para sa mga source na kabilang sa target target. At hindi [target_]include_directories. Ito ay ipapakita sa ibaba sa pagsusuri CMake script para sa mga unit test.

Ito rin ay nagkakahalaga ng pagbibigay pansin sa tinatawag na. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Iniuugnay ng command na ito ang mga header na kailangan namin sa aming library ng interface, at kung nakakonekta ang aming library sa anumang target sa loob ng parehong hierarchy ng CMake, maiuugnay dito ang mga header mula sa direktoryo. ${CMAKE_CURRENT_SOURCE_DIR}/include, at kung naka-install ang aming library sa system at nakakonekta sa isa pang proyekto gamit ang command find_package, pagkatapos ay iuugnay dito ang mga header mula sa direktoryo include kaugnay sa direktoryo ng pag-install.

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

Magtakda tayo ng pamantayan ng wika. Siyempre, ang pinakahuli. Kasabay nito, hindi lamang namin isinama ang pamantayan, ngunit pinalawak din ito sa mga gagamit ng aming silid-aklatan. Ito ay nakamit dahil sa ang katunayan na ang itinakdang ari-arian ay may kategorya INTERFACE (Tingnan. utos ng target_compile_features).

target_compile_features(mylib INTERFACE cxx_std_17)

Gumawa tayo ng alias para sa ating library. Bukod dito, para sa kagandahan, ito ay nasa isang espesyal na "namespace". Magiging kapaki-pakinabang ito kapag lumitaw ang iba't ibang mga module sa aming library, at pupunta kami upang ikonekta ang mga ito nang hiwalay sa isa't isa. Tulad ng sa Busta, halimbawa.

add_library(Mylib::mylib ALIAS mylib)

Instalasyon

Pag-install ng aming mga header sa system. Simple lang ang lahat dito. Sinasabi namin na ang folder na may lahat ng mga header ay dapat pumunta sa direktoryo include may kaugnayan sa lokasyon ng pag-install.

install(DIRECTORY include/mylib DESTINATION include)

Susunod, ipinapaalam namin sa build system na gusto naming matawagan ang command sa mga third-party na proyekto find_package(Mylib) at makakuha ng layunin Mylib::mylib.

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

Ang susunod na spell ay dapat na maunawaan sa ganitong paraan. Kapag nasa isang third-party na proyekto tinatawag namin ang command find_package(Mylib 1.2.3 REQUIRED), at ang tunay na bersyon ng naka-install na library ay hindi tugma sa bersyon 1.2.3Awtomatikong bubuo ng error ang CMake. Ibig sabihin, hindi mo kakailanganing manu-manong subaybayan ang mga bersyon.

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)

Mga Pagsubok

Kung ang mga pagsubok ay hindi pinagana nang tahasang paggamit kaukulang opsyon o ang aming proyekto ay isang subproject, ibig sabihin, ito ay konektado sa isa pang proyekto ng CMake gamit ang command add_subdirectory, hindi kami gumagalaw nang higit pa sa hierarchy, at ang script, na naglalarawan sa mga utos para sa pagbuo at pagpapatakbo ng mga pagsubok, ay hindi tumatakbo.

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

Records

Hindi rin bubuo ng dokumentasyon sa kaso ng isang subproject.

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

Online na sandbox

Gayundin, ang subproject ay hindi rin magkakaroon ng online na sandbox.

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

Test script (test/CMakeLists.txt)

Pagsubok

Una sa lahat, nakakita kami ng isang pakete na may kinakailangang balangkas ng pagsubok (palitan ng iyong paboritong isa).

find_package(doctest 2.3.3 REQUIRED)

Gawin natin ang ating executable file na may mga pagsubok. Kadalasan ay direktang idinaragdag ko sa executable binary lamang ang file na maglalaman ng function main.

add_executable(mylib-unit-tests test_main.cpp)

At nagdagdag ako ng mga file kung saan ang mga pagsubok mismo ay inilarawan sa ibang pagkakataon. Ngunit hindi mo kailangang gawin iyon.

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

Ikinonekta namin ang mga dependency. Pakitandaan na na-link lang namin ang mga target na CMake na kailangan namin sa aming binary at hindi namin tinawag ang command target_include_directories. Mga pamagat mula sa balangkas ng pagsubok at mula sa amin Mylib::mylib, pati na rin ang pagbuo ng mga parameter (sa aming kaso, ito ang pamantayan ng wika ng C++) na dumating kasama ng mga layuning ito.

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

Sa wakas, gumawa kami ng dummy na target, na ang "build" ay katumbas ng pagpapatakbo ng mga pagsubok, at idagdag ang target na ito sa default na build (ang attribute ang responsable para dito. ALL). Nangangahulugan ito na ang default na build ay nag-trigger sa mga pagsubok na tumakbo, ibig sabihin, hindi namin malilimutang patakbuhin ang mga ito.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Coverage

Susunod, pinagana namin ang pagsukat ng saklaw ng code kung tinukoy ang naaangkop na opsyon. Hindi na ako magdedetalye, dahil mas nauugnay ang mga ito sa isang tool para sa pagsukat ng coverage kaysa sa CMake. Mahalaga lamang na tandaan na batay sa mga resulta ay gagawin ang isang layunin coverage, kung saan ito ay maginhawa upang simulan ang pagsukat ng saklaw.

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 para sa dokumentasyon (doc/CMakeLists.txt)

Natagpuan ang Doxygen.

find_package(Doxygen)

Susunod, tinitingnan namin kung naitakda ng user ang variable ng wika. Kung oo, pagkatapos ay hindi namin ito hinawakan, kung hindi, pagkatapos ay kukuha kami ng Russian. Pagkatapos ay i-configure namin ang mga file ng system ng Doxygen. Ang lahat ng kinakailangang mga variable, kabilang ang wika, ay pumunta doon sa panahon ng proseso ng pagsasaayos (tingnan. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Pagkatapos ay lumikha kami ng isang layunin doc, na magsisimulang bumuo ng dokumentasyon. Dahil ang pagbuo ng dokumentasyon ay hindi ang pinakamalaking pangangailangan sa proseso ng pag-unlad, ang target ay hindi paganahin bilang default; kailangan itong ilunsad nang tahasan.

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

Script para sa online na sandbox (online/CMakeLists.txt)

Dito makikita natin ang pangatlong Python at lumikha ng target wandbox, na bumubuo ng kahilingang naaayon sa API ng serbisyo Wandbox, at pinaalis siya. Ang tugon ay may kasamang link sa natapos na 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()

Project sa labas

Ngayon tingnan natin kung paano gamitin ang lahat ng ito.

Assembly

Ang pagbuo ng proyektong ito, tulad ng anumang iba pang proyekto sa CMake build system, ay binubuo ng dalawang yugto:

Pagbuo

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

Kung hindi gumana ang command sa itaas dahil sa lumang bersyon ng CMake, subukang alisin -S:

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

Higit pa tungkol sa mga opsyon.

Pagbuo ng proyekto

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

Higit pa tungkol sa mga layunin sa pagpupulong.

Mga Pagpipilian sa

MYLIB_COVERAGE

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

Kasama ang target coverage, kung saan maaari mong simulan ang pagsukat ng saklaw ng code sa pamamagitan ng mga pagsubok.

MYLIB_TESTING

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

Nagbibigay ng kakayahang i-disable ang unit test build at target check. Bilang resulta, ang pagsukat ng saklaw ng code sa pamamagitan ng mga pagsubok ay naka-off (tingnan. MYLIB_COVERAGE).

Awtomatikong hindi pinagana ang pagsubok kung ang proyekto ay konektado sa isa pang proyekto bilang isang subproject gamit ang command add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Pinapalitan ang wika ng dokumentasyong nabubuo ng target doc sa ibinigay. Para sa isang listahan ng mga magagamit na wika, tingnan Website ng Doxygen system.

Ang Russian ay pinagana bilang default.

Mga target ng pagpupulong

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

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

Kung hindi tinukoy ang target (na katumbas ng target all), kinokolekta ang lahat ng makakaya nito, at tinatawag din ang target check.

mylib-unit-tests

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

Nag-compile ng mga unit test. Pinagana bilang default.

tsek

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

Pinapatakbo ang mga nakolekta (nakolekta, kung hindi pa) mga pagsubok sa yunit. Pinagana bilang default.

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ mylib-unit-tests.

coverage

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

Sinusuri ang tumatakbo (tumatakbo, kung hindi pa) mga pagsubok sa yunit para sa saklaw ng code sa pamamagitan ng mga pagsubok gamit ang programa gcovr.

Ang coating exhaust ay magiging ganito:

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

Ang target ay magagamit lamang kapag ang opsyon ay pinagana MYLIB_COVERAGE.

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ check.

doc

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

Nagsisimula sa pagbuo ng dokumentasyon ng code gamit ang system doxygen.

wandbox

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

Ang tugon mula sa serbisyo ay mukhang ganito:

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

Ginagamit ang serbisyo para dito Wandbox. Hindi ko alam kung gaano ka-flexible ang kanilang mga server, ngunit sa palagay ko ay hindi dapat abusuhin ang pagkakataong ito.

Mga halimbawa

Buuin ang proyekto sa debug mode na may pagsukat sa saklaw

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

Pag-install ng isang proyekto nang walang paunang pagpupulong at pagsubok

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

Bumuo sa release mode na may ibinigay na compiler

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

Pagbuo ng dokumentasyon sa Ingles

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

Tools

  1. CMake 3.13

    Sa katunayan, ang bersyon ng CMake 3.13 ay kinakailangan lamang upang patakbuhin ang ilan sa mga console command na inilarawan sa tulong na ito. Mula sa punto ng view ng syntax ng mga script ng CMake, ang bersyon 3.8 ay sapat kung ang henerasyon ay tinatawag sa ibang mga paraan.

  2. Pagsubok sa library doctest

    Maaaring hindi paganahin ang pagsubok (tingnan ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. doxygen

    Upang ilipat ang wika kung saan bubuo ang dokumentasyon, isang opsyon ang ibinigay MYLIB_DOXYGEN_LANGUAGE.

  4. Tagapagsalin ng wika Python 3

    Para sa awtomatikong henerasyon online na mga sandbox.

Static na pagsusuri

Sa CMake at ilang magagandang tool, makakapagbigay ka ng static na pagsusuri na may kaunting pagsisikap.

Cppcheck

Ang CMake ay may built-in na suporta para sa isang static na tool sa pagsusuri Cppcheck.

Upang gawin ito kailangan mong gamitin ang pagpipilian CMAKE_CXX_CPPCHECK:

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

Pagkatapos nito, awtomatikong ilulunsad ang static na pagsusuri sa tuwing ang pinagmulan ay pinagsama-sama at muling pinagsama-sama. Hindi na kailangang gumawa ng anumang karagdagang.

Clang

Sa tulong ng isang kahanga-hangang tool scan-build Maaari ka ring magpatakbo ng static na pagsusuri sa walang oras:

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

Dito, hindi tulad ng kaso sa Cppcheck, kailangan mong patakbuhin ang build sa bawat oras scan-build.

afterword

Ang CMake ay isang napakalakas at nababaluktot na sistema na nagbibigay-daan sa iyong ipatupad ang functionality para sa bawat panlasa at kulay. At, kahit na ang syntax kung minsan ay nag-iiwan ng maraming naisin, ang diyablo ay hindi pa rin kasing kahila-hilakbot na siya ay ipininta. Gamitin ang CMake build system para sa kapakinabangan ng lipunan at kalusugan.

β†’ I-download ang template ng proyekto

Pinagmulan: www.habr.com

Magdagdag ng komento