Tydens ontwikkeling hou ek daarvan om samestellers te verander, modusse te bou, afhanklikheidsweergawes, statiese analise uit te voer, prestasie te meet, dekking te versamel, dokumentasie te genereer, ensovoorts. En ek is baie lief vir CMake, want dit laat my toe om te doen wat ek wil.
Baie skel CMake, en dikwels welverdiend, maar as jy kyk, is dit nie so erg nie, maar die afgelope tyd glad nie sleg nie, en die rigting van ontwikkeling is redelik positief.
In hierdie nota wil ek jou vertel hoe maklik dit is om 'n C ++-kopbiblioteek in 'n CMake-stelsel te organiseer om die volgende funksionaliteit te kry:
samestelling;
Autorun toetse;
Kode dekking meting;
installasie;
Outodokumentasie;
Aanlyn sandbox generasie;
Statiese analise.
Wie reeds die voordele en si-maak verstaan, kan net laai projek sjabloon af en begin dit gebruik.
Dit sal hoofsaaklik fokus op hoe om CMake-skrifte te organiseer, sodat hulle in detail ontleed sal word. Die res van die lΓͺers kan direk deur enigiemand bekyk word. op die sjabloonprojekbladsy.
Eerstens moet u die verlangde weergawe van die CMake-stelsel aanvra. CMake ontwikkel, opdraghandtekeninge verander, gedrag onder verskillende omstandighede. Om vir CMake onmiddellik te verstaan ββwat ons daarvan wil hΓͺ, moet ons dadelik ons ββvereistes daarvoor regmaak.
cmake_minimum_required(VERSION 3.13)
Dan dui ons ons projek aan, sy naam, weergawe, tale wat gebruik word, ens. ΠΊΠΎΠΌΠ°Π½Π΄Ρ project).
In hierdie geval, spesifiseer die taal CXX (wat C++ beteken) sodat CMake nie die moeite doen om na 'n C-samesteller te soek nie (by verstek is twee tale by CMake ingesluit: C en C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Hier kan u dadelik kyk of ons projek as 'n subprojek by 'n ander projek ingesluit is. Dit sal baie help in die toekoms.
Die eerste opsie is MYLIB_TESTING - om eenheidstoetse uit te skakel. Dit kan nodig wees as ons seker is dat alles in orde is met die toetse, en ons wil byvoorbeeld net ons projek installeer of verpak. Of ons projek is ingesluit as 'n subprojek - in hierdie geval stel die gebruiker van ons projek nie daarin belang om ons toetse uit te voer nie. Jy toets nie die afhanklikhede wat jy gebruik nie, doen jy?
Daarbenewens sal ons 'n aparte opsie maak MYLIB_COVERAGE vir die meting van kodedekking met toetse, maar dit sal bykomende gereedskap vereis, so jy sal dit eksplisiet moet aktiveer.
Natuurlik is ons cool programmeerders-positief, so ons wil die maksimum vlak van samestelling-tyd diagnostiek van die samesteller hΓͺ. Nie 'n enkele muis sal deurkom nie.
Ons biblioteek bestaan ββslegs uit koplΓͺers, wat beteken dat ons geen uitvoer in die vorm van statiese of dinamiese biblioteke het nie. Aan die ander kant, om ons biblioteek van buite te gebruik, moet jy dit installeer, jy moet dit in die stelsel kan vind en aan jou projek koppel, en terselfdertyd hierdie einste kopskrifte, ook as, moontlik, 'n paar bykomende eiendomme.
Vir hierdie doel skep ons 'n koppelvlakbiblioteek.
add_library(mylib INTERFACE)
Ons bind die opskrifte aan ons koppelvlakbiblioteek.
Moderne, nuwerwetse, jeugdige gebruik van CMake beteken dat opskrifte, eienskappe, ens. deur 'n enkele teiken oorgedra word. Dit is dus genoeg om te sΓͺ target_link_libraries(target PRIVATE dependency), en alle opskrifte wat met die teiken geassosieer word dependency, sal beskikbaar wees vir bronne wat aan die teiken behoort target. En jy het niks nodig nie [target_]include_directories. Dit sal hieronder gedemonstreer word tydens ontleding CMaak 'n skrif vir eenheidstoetse.
Hierdie opdrag assosieer die opskrifte wat ons benodig met ons koppelvlakbiblioteek, en as ons biblioteek aan enige teiken binne dieselfde CMake-hiΓ«rargie gekoppel is, sal die opskrifte van die gids daarmee geassosieer word ${CMAKE_CURRENT_SOURCE_DIR}/include, en as ons biblioteek op die stelsel geΓ―nstalleer is en aan 'n ander projek gekoppel is deur die opdrag te gebruik find_package, dan sal die opskrifte van die gids daarmee geassosieer word include relatief tot die installasiegids.
Stel die taalstandaard. Natuurlik die nuutste. Terselfdertyd sluit ons nie net die standaard in nie, maar versprei dit ook aan diegene wat ons biblioteek gaan gebruik. Dit word bereik deur die vasgestelde eiendom 'n kategorie te hΓͺ INTERFACE (Cm. target_compile_features opdrag).
Ons kry 'n alias vir ons biblioteek. En vir skoonheid sal dit in 'n spesiale "naamruimte" wees. Dit sal nuttig wees wanneer verskillende modules in ons biblioteek verskyn, en ons gaan om hulle onafhanklik van mekaar te verbind. Soos in Busta, byvoorbeeld.
Die installering van ons opskrifte in die stelsel. Alles is eenvoudig hier. Ons sΓͺ dat die gids met al die kopskrifte in die gids moet val include met betrekking tot die installasie plek.
Die volgende beswering moet so verstaan ββword. Wanneer ons in 'n syprojek is, noem ons die opdrag find_package(Mylib 1.2.3 REQUIRED), en terselfdertyd sal die regte weergawe van die geΓ―nstalleerde biblioteek onversoenbaar wees met die weergawe 1.2.3, CMake sal outomaties 'n fout genereer. Dit wil sΓͺ, jy hoef nie handmatig tred te hou met weergawes nie.
As toetse uitdruklik gedeaktiveer is met ooreenstemmende opsie of ons projek is 'n subprojek, dit wil sΓͺ, dit is gekoppel aan 'n ander CMake-projek deur die opdrag te gebruik add_subdirectory, gaan ons nie verder in die hiΓ«rargie af nie, en die skrif, wat die opdragte vir die generering en uitvoer van toetse beskryf, begin eenvoudig nie.
Ons verbind afhanklikhede. Neem asseblief kennis dat ons slegs die CMake-teikens wat ons nodig gehad het aan ons binΓͺre geheg het, en nie die opdrag geroep het nie target_include_directories. Opskrifte van die toetsraamwerk en van ons Mylib::mylib, sowel as bouopsies (in ons geval, die C++-taalstandaard) het saam met hierdie teikens gekruip.
Laastens skep ons 'n dummy-teiken waarvan die "bou" gelykstaande is aan lopende toetse, en voeg hierdie teiken by die verstekbou (dit is die verantwoordelikheid van die kenmerk ALL). Dit beteken dat die verstekbou die toetse sal laat loop, wat beteken dat ons nooit sal vergeet om dit uit te voer nie.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Skakel dan kodedekkingmeting aan as die ooreenstemmende opsie ingestel is. Ek gaan nie op die besonderhede in nie, want dit is meer verwant aan die dekkingsmetingsinstrument as aan CMake. Dit is net belangrik om daarop te let dat die resultate 'n doel sal skep coverage, waarmee dit gerieflik is om dekking te begin meet.
Vervolgens kyk ons ββof die veranderlike met die taal deur die gebruiker gestel is. Indien wel, dan raak ons ββnie daaraan nie, indien nie, dan neem ons Russies. Dan konfigureer ons die Doxygen-stelsellΓͺers. Al die nodige veranderlikes, insluitend die taal, kom daar tydens die konfigurasieproses (sien. ΠΊΠΎΠΌΠ°Π½Π΄Ρ configure_file).
Dan skep ons 'n doelwit doc, wat dokumentasie sal begin genereer. Aangesien die generering van dokumentasie nie die grootste behoefte in die ontwikkelingsproses is nie, sal die teiken nie by verstek ingesluit word nie, dit sal eksplisiet uitgevoer moet word.
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 ()
Hier vind ons die derde Python en skep 'n teiken wandbox, wat 'n versoek genereer wat ooreenstem met die diens-API Wandboks, en stuur dit. In reaksie hierop kom 'n skakel na die voltooide sandbox.
Bied die opsie om eenheidstoetsbou en -teiken af ββte skakel check. As gevolg hiervan word die meting van kodedekking deur toetse afgeskakel (sien MYLIB_COVERAGE).
Ook, toetsing word outomaties gedeaktiveer as die projek aan 'n ander projek gekoppel is as 'n subprojek deur die opdrag te gebruik add_subdirectory.
Trouens, CMake weergawe 3.13 word slegs vereis om sommige van die konsole-opdragte wat in hierdie hulp beskryf word, uit te voer. Uit die oogpunt van die sintaksis van CMake-skrifte, is weergawe 3.8 voldoende as die generasie op ander maniere opgeroep word.
Daarna sal statiese analise outomaties elke keer tydens samestelling en hersamestelling van bronne van stapel gestuur word. Niks ekstra hoef gedoen te word nie.
klang
Met 'n wonderlike hulpmiddel scan-build U kan ook statiese ontleding in 'n japtrap uitvoer:
CMake is 'n baie kragtige en buigsame stelsel wat jou toelaat om funksionaliteit vir elke smaak en kleur te implementeer. En, hoewel die sintaksis soms veel te wense oorlaat, is die duiwel steeds nie so vreeslik soos hy geskilder is nie. Gebruik die CMake-boustelsel tot voordeel van die samelewing en gesondheid.