Ang CMake ug C++ managsuon hangtod sa hangtod

Ang CMake ug C++ managsuon hangtod sa hangtod

Atol sa pag-uswag, ganahan kong mag-ilis sa mga compiler, magtukod og mga mode, dependency versions, magpahigayon og static analysis, pagsukod sa performance, pagkolekta og coverage, pagmugna og dokumentasyon, ug uban pa. Ug gihigugma gyud nako ang CMake tungod kay gitugotan ko nga buhaton ang tanan nga gusto nako.

Daghang mga tawo ang nagsaway sa CMake, ug kanunay nga angayan, apan kung imong tan-awon kini, dili tanan daotan, ug bag-o lang dili gyud daotan, ug ang direksyon sa kalamboan medyo positibo.

Niini nga nota, gusto nakong isulti kanimo kung unsaon pag-organisar ang usa ka librarya sa header sa C ++ sa sistema sa CMake aron makuha ang mosunod nga gamit:

  1. Asembliya;
  2. Mga pagsulay sa Autorun;
  3. Pagsukod sa coverage sa code;
  4. Pag-instalar;
  5. Auto-dokumentasyon;
  6. Online nga sandbox generation;
  7. Static nga pagtuki.

Bisan kinsa nga nakasabut na sa mga bentaha ug C-make mahimo nga yano download template sa proyekto ug magsugod sa paggamit niini.


Mga sulod

  1. Proyekto gikan sa sulod
    1. Istruktura sa proyekto
    2. Panguna nga CMake file (./CMakeLists.txt)
      1. Impormasyon sa proyekto
      2. Mga Opsyon sa Proyekto
      3. Mga kapilian sa pag-compile
      4. ang panguna nga katuyoan
      5. Pag-instalar
      6. Mga Pagsulay
      7. ДокумСнтация
      8. Online nga sandbox
    3. Test script (test/CMakeLists.txt)
      1. Pagsulay
      2. Coverage
    4. Script para sa dokumentasyon (doc/CMakeLists.txt)
    5. Script para sa online sandbox (online/CMakeLists.txt)
  2. Proyekto sa gawas
    1. Assembly
      1. Kaliwatan
      2. Assembly
    2. Mga kapilian
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Mga target sa asembliya
      1. pinaagi sa default
      2. mylib-unit-tests
      3. check
      4. coverage
      5. doc
      6. wandbox
    4. mga panig-ingnan
  3. Mga himan
  4. Static nga Pagtuki
  5. Pagkahuman

Proyekto gikan sa sulod

Istruktura sa 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

Nag-una kami nga maghisgot kung giunsa ang pag-organisar sa mga script sa CMake, aron hisgutan kini sa detalye. Bisan kinsa nga makatan-aw sa nahabilin nga mga file direkta sa template nga panid sa proyekto.

Panguna nga CMake file (./CMakeLists.txt)

Impormasyon sa proyekto

Una sa tanan, kinahanglan nimo nga hangyoon ang gikinahanglan nga bersyon sa sistema sa CMake. Nag-uswag ang CMake, nagbag-o ang mga pirma sa mando ug pamatasan sa lainlaing mga kahimtang. Aron masabtan dayon sa CMake kung unsa ang gusto namon gikan niini, kinahanglan namon nga irekord dayon ang among mga kinahanglanon alang niini.

cmake_minimum_required(VERSION 3.13)

Dayon among itudlo ang among proyekto, ang ngalan niini, bersyon, mga pinulongan nga gigamit, ug uban pa (tan-awa. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Sa niini nga kaso atong gipakita ang pinulongan CXX (ug kini nagpasabot sa C++) aron ang CMake dili mopilit ug mangita sa usa ka C language compiler (sa default, ang CMake naglakip sa duha ka pinulongan: C ug C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Dinhi mahimo nimong susihon dayon kung ang among proyekto nahilakip sa laing proyekto ingon usa ka subproyekto. Makatabang ni ug dako sa umaabot.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Mga Opsyon sa Proyekto

Maghatag kami og duha ka kapilian.

Ang unang kapilian mao ang MYLIB_TESTING β€” sa pag-disable sa mga pagsulay sa yunit. Mahimong kinahanglanon kini kung sigurado kami nga ang tanan naa sa kahusay sa mga pagsulay, apan gusto lang namon, pananglitan, i-install o i-package ang among proyekto. O ang among proyekto gilakip ingon usa ka subproyekto - sa kini nga kaso, ang tiggamit sa among proyekto dili interesado sa pagpadagan sa among mga pagsulay. Dili nimo sulayan ang mga dependency nga imong gigamit, dili ba?

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

Dugang pa, maghimo kami usa ka lahi nga kapilian MYLIB_COVERAGE alang sa pagsukod sa pagsakup sa code pinaagi sa mga pagsulay, apan magkinahanglan kini og dugang nga mga himan, busa kinahanglan kini nga ma-aktibo nga klaro.

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

Mga kapilian sa pag-compile

Siyempre, kami mga cool plus programmer, mao nga gusto namo ang pinakataas nga lebel sa compile-time diagnostics gikan sa compiler. Walay bisan usa ka mouse nga makalusot.

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
)

I-disable usab namo ang mga extension aron hingpit nga makasunod sa C++ language standard. Gi-enable kini pinaagi sa default sa CMake.

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

ang panguna nga katuyoan

Ang among librarya naglangkob ra sa mga file sa header, nga nagpasabut nga wala kami bisan unsang tambutso sa porma sa static o dinamikong mga librarya. Sa laing bahin, aron magamit ang among librarya sa gawas, kini kinahanglan nga ma-install, kini kinahanglan nga makit-an sa sistema ug konektado sa imong proyekto, ug sa samang higayon kining parehas nga mga ulohan, ingon man usab posible nga pipila ka mga dugang, gilakip niini nga mga kabtangan.

Alang niini nga katuyoan, naghimo kami usa ka librarya sa interface.

add_library(mylib INTERFACE)

Gibugkos namon ang mga ulohan sa among librarya sa interface.

Ang moderno, uso, kabatan-onan nga paggamit sa CMake nagpasabot nga ang mga ulohan, kabtangan, ug uban pa. gipasa pinaagi sa usa ka target. Busa igo na nga isulti target_link_libraries(target PRIVATE dependency), ug tanan nga mga ulohan nga adunay kalabotan sa target dependency, mahimong magamit alang sa mga tinubdan nga iya sa target target. Ug wala ka magkinahanglan [target_]include_directories. Kini ipakita sa ubos sa pagtuki Ang script sa CMake alang sa mga pagsulay sa yunit.

Angayan usab nga hatagan pagtagad ang gitawag nga. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Kini nga sugo nag-associate sa mga ulohan nga atong gikinahanglan sa atong interface library, ug kung ang atong librarya konektado sa bisan unsang target sulod sa samang CMake hierarchy, nan ang mga header gikan sa direktoryo i-uban niini. ${CMAKE_CURRENT_SOURCE_DIR}/include, ug kung ang among librarya na-install sa sistema ug konektado sa laing proyekto gamit ang command find_package, unya ang mga ulohan gikan sa direktoryo iapil niini include kalabot sa direktoryo sa pag-install.

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

Magbutang ta ug sukdanan sa pinulongan. Siyempre, ang pinakaulahi. Sa samang higayon, wala lang namo gilakip ang sumbanan, apan gipaabot usab kini sa mga mogamit sa among librarya. Kini makab-ot tungod sa kamatuoran nga ang gitakda nga kabtangan adunay usa ka kategorya INTERFACE (cm. target_compile_features nga sugo).

target_compile_features(mylib INTERFACE cxx_std_17)

Magbuhat ta ug alias para sa atong library. Dugang pa, alang sa katahum, kini anaa sa usa ka espesyal nga "namespace". Mapuslanon kini kung adunay lainlain nga mga module nga makita sa among librarya, ug moadto kami aron makonektar sila nga independente sa usag usa. Sama pananglit sa Busta.

add_library(Mylib::mylib ALIAS mylib)

Pag-instalar

Pag-instalar sa among mga ulohan sa sistema. Ang tanan yano dinhi. Giingon namon nga ang folder nga adunay tanan nga mga ulohan kinahanglan moadto sa direktoryo include kalabot sa lokasyon sa pag-install.

install(DIRECTORY include/mylib DESTINATION include)

Sunod, gipahibalo namon ang sistema sa pagtukod nga gusto namon nga matawag ang mando sa mga proyekto sa ikatulo nga partido find_package(Mylib) ug makakuha og tumong Mylib::mylib.

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

Ang sunod nga spell kinahanglang sabton niining paagiha. Kung sa usa ka ikatulo nga partido nga proyekto gitawag namon ang mando find_package(Mylib 1.2.3 REQUIRED), ug ang tinuod nga bersyon sa na-install nga librarya dili mahiuyon sa bersyon 1.2.3Ang CMake awtomatikong makamugna og sayop. Sa ato pa, dili nimo kinahanglan nga mano-mano ang pagsubay sa 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 Pagsulay

Kung ang mga pagsulay gi-disable sa dayag nga paggamit katugbang nga kapilian o ang among proyekto usa ka subproject, nga mao, konektado kini sa laing proyekto sa CMake gamit ang command add_subdirectory, dili kami mobalhin sa unahan sa hierarchy, ug ang script, nga naghulagway sa mga sugo alang sa pagmugna ug pagpadagan sa mga pagsulay, wala gayud modagan.

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

ДокумСнтация

Dili usab mabuhat ang dokumentasyon sa kaso sa usa ka subproyekto.

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

Online nga sandbox

Ingon usab, ang subproyekto dili usab adunay online nga sandbox.

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

Test script (test/CMakeLists.txt)

Pagsulay

Una sa tanan, nakit-an namon ang usa ka pakete nga adunay gikinahanglan nga balangkas sa pagsulay (ilisan ang imong paborito).

find_package(doctest 2.3.3 REQUIRED)

Himoon nato ang atong executable file nga adunay mga pagsulay. Kasagaran akong idugang direkta sa executable binary lamang ang file nga adunay sulod nga function main.

add_executable(mylib-unit-tests test_main.cpp)

Ug gidugang nako ang mga file diin ang mga pagsulay mismo gihulagway sa ulahi. Apan dili nimo kinahanglan nga buhaton kana.

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

Gikonektar namo ang mga dependency. Palihug timan-i nga among gi-link lamang ang mga target sa CMake nga among gikinahanglan sa among binary ug wala tawga ang command target_include_directories. Mga ulohan gikan sa balangkas sa pagsulay ug gikan sa atoa Mylib::mylib, ingon man usab sa pagtukod og mga parametro (sa among kaso, kini ang C++ nga sukdanan sa lengguwahe) naabot uban niini nga mga tumong.

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

Sa katapusan, naghimo kami usa ka dummy target, ang "pagtukod" nga katumbas sa pagpadagan sa mga pagsulay, ug idugang kini nga target sa default nga pagtukod (ang hiyas ang responsable niini. ALL). Kini nagpasabut nga ang default nga pagtukod nag-aghat sa mga pagsulay nga modagan, nagpasabut nga dili kami makalimot sa pagpadagan niini.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Coverage

Sunod, mahimo namon ang pagsukod sa pagsakup sa code kung ang angay nga kapilian ang gitakda. Dili ko moadto sa mga detalye, tungod kay mas may kalabutan sila sa usa ka himan alang sa pagsukod sa coverage kaysa sa CMake. Importante lamang nga timan-an nga base sa mga resulta usa ka tumong ang pagahimoon coverage, diin kini sayon ​​nga magsugod sa pagsukod sa coverage.

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)

Nakit-an ang Doxygen.

find_package(Doxygen)

Sunod, among susihon kung gitakda ba sa tiggamit ang variable nga sinultian. Kung oo, nan dili namo kini hikapon, kung dili, unya among kuhaon ang Russian. Dayon among gi-configure ang mga file sa sistema sa Doxygen. Ang tanan nga gikinahanglan nga mga baryable, lakip ang pinulongan, moadto didto sa panahon sa proseso sa pag-configure (tan-awa. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Dayon maghimo kita og tumong doc, nga magsugod sa paghimo og dokumentasyon. Tungod kay ang paghimo og dokumentasyon dili ang pinakadako nga panginahanglan sa proseso sa pag-uswag, ang target dili mahimo pinaagi sa default; kinahanglan kini nga hayag nga ilunsad.

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 sandbox (online/CMakeLists.txt)

Dinhi atong makit-an ang ikatulo nga Python ug maghimo usa ka target wandbox, nga nagmugna og hangyo nga katumbas sa serbisyo nga API wandbox, ug gipalakaw siya. Ang tubag adunay usa ka link sa nahuman nga 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()

Proyekto sa gawas

Karon atong tan-awon kon unsaon paggamit kining tanan.

Assembly

Ang pagtukod niini nga proyekto, sama sa bisan unsang proyekto sa CMake build system, naglangkob sa duha ka yugto:

Kaliwatan

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

Kung ang sugo sa ibabaw wala molihok tungod sa usa ka daan nga bersyon sa CMake, sulayi ang pagtangtang -S:

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

Dugang pa bahin sa mga kapilian.

Pagtukod sa proyekto

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

Dugang pa mahitungod sa mga tumong sa asembliya.

Mga kapilian

MYLIB_COVERAGE

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

Naglakip sa target coverage, diin mahimo nimong sugdan ang pagsukod sa coverage sa code pinaagi sa mga pagsulay.

MYLIB_TESTING

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

Naghatag ug abilidad sa pag-disable sa unit test build ug target check. Ingon usa ka sangputanan, ang pagsukod sa pagsakup sa code pinaagi sa mga pagsulay gipalong (tan-awa. MYLIB_COVERAGE).

Awtomatiko usab nga gi-disable ang pagsulay kung ang proyekto konektado sa lain nga proyekto ingon usa ka subproyekto gamit ang mando add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Gibalhin ang pinulongan sa dokumentasyon nga gipatungha sa target doc sa gihatag. Alang sa lista sa magamit nga mga pinulongan, tan-awa Doxygen system nga website.

Gi-enable ang Russian pinaagi sa default.

Mga target sa asembliya

pinaagi sa default

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

Kung ang target wala matino (nga katumbas sa target all), gikolekta ang tanan nga mahimo niini, ug gitawag usab ang target check.

mylib-unit-tests

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

Nag-compile sa mga pagsulay sa yunit. Gipaandar pinaagi sa default.

check

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

Gipadagan ang nakolekta (nakolekta, kung wala pa) nga mga pagsulay sa yunit. Gipaandar pinaagi sa default.

Tan-awa usab mylib-unit-tests.

coverage

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

Nag-analisar sa pagdagan (nagdagan, kung wala pa) mga pagsulay sa yunit alang sa pagsakup sa code pinaagi sa mga pagsulay gamit ang programa gcovr.

Ang coating exhaust tan-awon sama niini:

------------------------------------------------------------------------------
                           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 magamit ra kung ang kapilian mahimo MYLIB_COVERAGE.

Tan-awa usab check.

doc

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

Nagsugod sa paghimo sa dokumentasyon sa code gamit ang sistema doxygen.

wandbox

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

Ang tubag gikan sa serbisyo ingon niini:

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

Ang serbisyo gigamit alang niini wandbox. Wala ko kahibalo kung unsa ka flexible ang ilang mga server, apan sa akong hunahuna kini nga oportunidad dili angay abusuhan.

mga panig-ingnan

Pagtukod sa proyekto sa debug mode nga adunay pagsukod sa coverage

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

Pag-instalar sa usa ka proyekto nga wala’y preliminary assembly ug testing

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

Pagtukod sa release mode nga adunay gihatag nga compiler

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

Paghimo og dokumentasyon sa English

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

Mga himan

  1. CMake 3.13

    Sa tinuud, ang bersyon sa CMake 3.13 gikinahanglan lamang sa pagpadagan sa pipila nga mga mando sa console nga gihulagway sa kini nga tabang. Gikan sa punto sa panglantaw sa syntax sa mga script sa CMake, ang bersyon 3.8 igo na kung ang henerasyon gitawag sa ubang mga paagi.

  2. Pagsulay sa librarya doctest

    Ang pagsulay mahimong ma-disable (tan-awa ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. doxygen

    Aron mabalhin ang lengguwahe diin mahimo ang dokumentasyon, usa ka kapilian ang gihatag MYLIB_DOXYGEN_LANGUAGE.

  4. Tighubad sa pinulongan Python 3

    Alang sa awtomatikong henerasyon online nga mga sandbox.

Static nga Pagtuki

Uban sa CMake ug usa ka pares nga maayong mga himan, makahatag ka og static nga pagtuki nga adunay gamay nga paningkamot.

Cppcheck

Ang CMake adunay built-in nga suporta alang sa usa ka static analysis tool Cppcheck.

Aron mahimo kini kinahanglan nimo nga gamiton ang kapilian CMAKE_CXX_CPPCHECK:

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

Pagkahuman niini, ang static nga pag-analisa awtomatiko nga ilunsad sa matag higayon nga ang gigikanan gitipon ug gi-recompile. Wala na kinahanglana ang pagbuhat ug dugang pa.

clang

Uban sa tabang sa usa ka talagsaon nga himan scan-build Mahimo ka usab nga magpadagan sa static nga pagtuki sa dali:

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

Dinhi, dili sama sa kaso sa Cppcheck, kinahanglan nimo nga ipadagan ang pagtukod matag higayon scan-build.

Pagkahuman

Ang CMake usa ka kusgan kaayo ug flexible nga sistema nga nagtugot kanimo sa pagpatuman sa mga gamit alang sa matag lami ug kolor. Ug, bisan tuod ang syntax usahay mobiya sa daghan nga gitinguha, ang yawa dili gihapon sama ka makalilisang sama sa iyang gipintalan. Gamita ang CMake build system para sa kaayohan sa katilingban ug panglawas.

β†’ Pag-download sa template sa proyekto

Source: www.habr.com

Idugang sa usa ka comment