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:
Asembliya;
Mga pagsulay sa Autorun;
Pagsukod sa coverage sa code;
Pag-instalar;
Auto-dokumentasyon;
Online nga sandbox generation;
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.
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.
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.
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?
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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)
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.
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 ()
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.
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.
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.
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.
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.
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:
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.