Di dema pêşkeftinê de, ez hez dikim ku berhevkeran biguhezînim, awayan ava bikim, guhertoyên girêdayîbûnê, analîzên statîk bikim, performansê bipîvim, vegirtinê berhev bikim, belgeyan biafirînim, hwd. Û ez bi rastî ji CMake hez dikim ji ber ku ew dihêle ku ez her tiştê ku ez dixwazim bikim.
Gelek kes CMake-ê rexne dikin, û pir caran jî bi heqî, lê heke hûn lê binerin, ne her tişt ew qas xirab e, û vê dawiyê qet ne xerab e, û rêberiya pêşveçûnê pir erênî ye.
Di vê notê de, ez dixwazim ji we re bibêjim ka meriv çawa di pergala CMake de pirtûkxaneyek sernavê di C ++ de bi hêsanî organîze dike da ku fonksiyona jêrîn bistîne:
Civîn;
Testên Autorun;
Pîvana vegirtina kodê;
Lêkirinî;
Auto-documentation;
nifşa sandboxê ya serhêl;
Analîza statîk.
Her kesê ku jixwe avantaj û C-çêker fam dike dikare bi hêsanî şablonê projeyê dakêşin û dest bi karanîna wê bikin.
Em ê bi giranî li ser çawa birêxistinkirina nivîsarên CMake biaxivin, ji ber vê yekê ew ê bi hûrgulî werin nîqaş kirin. Kes dikare pelên mayî rasterast bibîne li ser rûpela projeya şablonê.
Berî her tiştî, hûn hewce ne ku guhertoya pêdivî ya pergala CMake daxwaz bikin. CMake pêş dikeve, di şert û mercên cûda de îmze û behreyên fermanê diguhezin. Ji bo ku CMake tavilê fêm bike ku em jê çi dixwazin, pêdivî ye ku em tavilê daxwazên xwe ji bo wê tomar bikin.
cmake_minimum_required(VERSION 3.13)
Dûv re em ê projeya xwe, navê wê, guherto, zimanên ku hatine bikar anîn, hwd destnîşan bikin (binêre. команду project).
Di vê rewşê de em ziman nîşan didin CXX (û ev tê wateya C ++) da ku CMake li berhevkarek zimanê C negere û negere (ji hêla xwerû, CMake du zimanan digire: C û C ++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Li vir hûn dikarin tavilê kontrol bikin ka projeya me di projeyek din de wekî bineprojeyek heye an na. Ev ê di pêşerojê de gelek alîkariyê bike.
Vebijêrka yekem e MYLIB_TESTING - Ji bo ceribandinên yekîneyê neçalak bikin. Dibe ku ev pêdivî be heke em pê ewle bin ku her tişt bi ceribandinan re di rê de ye, lê em tenê dixwazin, mînakî, projeya xwe saz bikin an pak bikin. An jî projeya me wekî bineprojeyek tête nav kirin - di vê rewşê de, bikarhênerê projeya me ne eleqedar e ku ceribandinên me bike. Hûn girêdayî girêdayî girêdayî ne ku hûn bikar tînin, hûn?
Digel vê yekê, em ê vebijarkek cûda jî çêbikin MYLIB_COVERAGE ji bo pîvandina vegirtina kodê ji hêla ceribandinan ve, lê ew ê amûrên din hewce bike, ji ber vê yekê dê hewce bike ku ew bi eşkere were çalak kirin.
Bê guman, em bernamesazên pluss xweş in, ji ber vê yekê em asta herî zêde ya tespîtkirina-dema berhevkirinê ji berhevkerê dixwazin. Dê mişkek jî bi ser nekeve.
Pirtûkxaneya me tenê ji pelên sernavê pêk tê, ku tê vê wateyê ku em di forma pirtûkxaneyên statîk an dînamîkî de çu çu tine ne. Ji hêla din ve, ji bo ku pirtûkxaneya me ji derve were bikar anîn, pêdivî ye ku ew were saz kirin, pêdivî ye ku ew di pergalê de were tespît kirin û bi projeya we ve were girêdan, û di heman demê de heman sernivîs, û her weha dibe ku hin yên din jî hebe. bi taybetmendiyên wê ve girêdayî ne.
Ji bo vê armancê, em pirtûkxaneyek navbeynkar ava dikin.
add_library(mylib INTERFACE)
Em sernivîsan bi pirtûkxaneya xweya pêwendiyê ve girê didin.
Bikaranîna nûjen, nûjen, ciwan a CMake tê vê wateyê ku sernav, taybetmendî, hwd. bi yek armancê ve hatî şandin. Ji ber vê gotinê bes e target_link_libraries(target PRIVATE dependency), û hemî sernivîsên ku bi armancê ve girêdayî ne dependency, dê ji bo çavkaniyên aîdê armancê peyda bibin target. Û hûn ne hewce ne [target_]include_directories. Ev ê li jêr di analîzê de were destnîşan kirin Nivîsara CMake ji bo ceribandinên yekîneyê.
Vê fermanê sernivîsên ku em hewce ne bi pirtûkxaneya navbeynkariya me re têkildar dike, û heke pirtûkxaneya me di heman hiyerarşiya CMake de bi armancek ve girêdayî be, wê hingê sernavên ji pelrêça wê bi wê re têkildar bibin. ${CMAKE_CURRENT_SOURCE_DIR}/include, û heke pirtûkxaneya me li ser pergalê hatî saz kirin û bi karanîna fermanê bi projeyek din ve girêdayî ye find_package, wê hingê sernivîsên ji pelrêçê dê bi wê re bêne girêdan include nisbet bi pelrêça sazkirinê.
Ka em standardek ziman destnîşan bikin. Bê guman, ya paşîn. Di heman demê de, em ne tenê standardê vedigirin, lê di heman demê de wê ji yên ku dê pirtûkxaneya me bikar bînin jî dirêj dikin. Ev ji ber vê yekê tê bidestxistin ku taybetmendiya set xwedan kategoriyek e INTERFACE (binihêrin fermana target_compile_features).
Werin em ji bo pirtûkxaneya xwe navekî biafirînin. Wekî din, ji bo bedewiyê, ew ê di nav "navekî" taybetî de be. Dema ku modulên cihêreng di pirtûkxaneya me de xuya dibin, ev ê kêrhatî be, û em diçin ku wan serbixwe ji hev girêbidin. Mînakî li Busta, mînakî.
Sernavên me di pergalê de saz kirin. Li vir her tişt hêsan e. Em dibêjin ku peldanka bi hemî sernivîsan re divê bikeve nav pelrêça include li gorî cîhê sazkirinê.
Dûv re, em pergala avakirinê agahdar dikin ku em dixwazin di projeyên partiya sêyemîn de emrê gazî bikin find_package(Mylib) û armancekê bi dest bixin Mylib::mylib.
Pêvajoya paşîn divê bi vî rengî were fam kirin. Dema ku di projeyek sêyemîn de em gazî fermanê dikin find_package(Mylib 1.2.3 REQUIRED), û guhertoya rastîn a pirtûkxaneya sazkirî dê bi guhertoyê re negunca be 1.2.3CMake dê bixweber xeletiyek çêbike. Ango, hûn ê ne hewce ne ku guhertoyên bi destan bişopînin.
Ger ceribandin bi eşkere bi karanîna neçalak kirin vebijarka têkildar an jî projeya me bineprojeyek e, ango ew bi projeyek din a CMake ve bi karanîna fermanê ve girêdayî ye add_subdirectory, em li ser hiyerarşiyê pêşde naçin, û skrîpta ku fermanên ji bo hilberandin û xebitandina ceribandinan vedibêje, bi tenê naçe.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Berî her tiştî, em pakêtek bi çarçoweya ceribandinê ya pêwîst re dibînin (bi ya xweya bijare veguherînin).
find_package(doctest 2.3.3 REQUIRED)
Werin em bi ceribandinan dosyaya xweya îcrakar biafirînin. Bi gelemperî ez tenê pelê ku dê fonksiyonê tê de hebe rasterast li binarya îcrakar zêde dikim main.
add_executable(mylib-unit-tests test_main.cpp)
Û ez pelên ku tê de ceribandin bixwe paşê têne vegotin lê zêde dikim. Lê hûn ne hewce ne ku hûn vê yekê bikin.
Em girêdayî girêdayî ne. Ji kerema xwe bala xwe bidin ku me tenê armancên CMake yên ku me hewce ne bi binarya xwe ve girêda û gazî ferman nekir target_include_directories. Sernivîsên ji çarçoveya testê û ji ya me Mylib::mylib, û her weha pîvanên çêkirinê (di rewşa me de, ev standarda zimanê C++ ye) bi van armancan re derbas bûn.
Di dawiyê de, em armancek dumî diafirînin, ku "avakirin" ya ku bi ceribandinên xebitandinê re wekhev e, û vê armancê li avahiya xwerû zêde dikin (taybet ji vê yekê berpirsiyar e ALL). Ev tê vê wateyê ku avakirina xwerû ceribandinan dide meşandin, ango em ê tu carî ji bîr nekin ku wan bimeşînin.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Dûv re, heke vebijarka guncan were destnîşankirin, em pîvana vegirtina kodê çalak dikin. Ez ê neçim nav hûrguliyan, ji ber ku ew ji CMake bêtir bi amûrek ji bo pîvandinê ve girêdayî ne. Tenê girîng e ku were zanîn ku li gorî encaman dê armancek were afirandin coverage, ku pê re hêsan e ku meriv dest bi pîvandina vegirtinê bike.
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()
Dûv re, em kontrol dikin ka bikarhêner guhêrbar zimanî saz kiriye yan na. Ger erê, wê hingê em dest nadin wê, heke na, wê hingê em rûsî digirin. Dûv re em pelên pergala doxygen-ê mîheng bikin. Hemî guhêrbarên pêwîst, tevî ziman, di pêvajoya veavakirinê de diçin wir (binêre. команду configure_file).
Piştre em armancek çêbikin doc, ku dê dest bi hilberîna belgeyan bike. Ji ber ku di pêvajoya pêşkeftinê de hilberîna belgekirinê ne hewcedariya herî mezin e, armanc dê ji hêla xwerû ve neyê çalak kirin; pêdivî ye ku ew bi eşkere were destpêkirin.
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 ()
Li vir em Python-a sêyemîn dibînin û armancek diafirînin wandbox, ku daxwazek bi karûbarê API-ê re têkildar çêdike Wandbox, û wî dişîne. Bersiv bi girêdanek bi sandboxa qediyayî tê.
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()
Kapasîteya neçalakkirina avakirina ceribandin û armancê ya yekîneyê peyda dike check. Wekî encamek, pîvana vegirtina kodê ji hêla ceribandinan ve tê girtin (binêre. MYLIB_COVERAGE).
Ger proje bi projeyek din ve wekî bineprojeyek bi karanîna fermanê ve were girêdan ceribandin jî bixweber tê asteng kirin add_subdirectory.
Bi rastî, guhertoya CMake 3.13 tenê hewce ye ku hin fermanên konsolê yên ku di vê arîkariyê de hatine destnîşan kirin bimeşîne. Ji hêla hevoksaziya nivîsarên CMake ve, ger nifş bi awayên din were gazî kirin guhertoya 3.8 bes e.
Piştî vê yekê, analîza statîk dê her gava ku çavkanî were berhev kirin û ji nû ve hatî berhev kirin bixweber were destpêkirin. Ne hewce ye ku tiştek zêde were kirin.
cang
Bi alîkariya amûrek ecêb scan-build Her weha hûn dikarin di demek kurt de analîza statîk bimeşînin:
CMake pergalek pir bi hêz û maqûl e ku dihêle hûn ji bo her çêj û reng fonksiyonê bicîh bînin. Û, her çend hevoksazî carinan gelek tiştan dixwaze, şeytan dîsa jî ne bi qasî ku hatî boyaxkirin ne tirsnak e. Pergala avakirina CMake ji bo berjewendiya civak û tenduristiyê bikar bînin.