Inta lagu jiro horumarinta, waxaan jeclahay in aan beddelo isku-dubaridyada, dhisidda hababka, noocyada ku-tiirsanaanta, sameeyaan falanqaynta joogtada ah, cabbirka waxqabadka, ururinta caymiska, abuurista dukumeenti, iwm. Runtii waan jeclahay CMake sababtoo ah waxay ii ogolaataa inaan sameeyo wax kasta oo aan rabo.
Dad badan ayaa dhaleeceeya CMake, oo inta badan u qalmaan sidaas, laakiin haddii aad eegto, wax walba ma aha mid aad u xun, iyo dhawaan ma xuma haba yaraatee, iyo jihada horumarku waa mid aad u wanaagsan.
Qoraalkan, waxaan rabaa inaan kuu sheego sida si fudud loo abaabulo maktabadda madaxa ee C++ ee nidaamka CMake si aad u hesho shaqeynta soo socota:
Golaha;
Imtixaannada Autorun;
Cabbirka koodka caymiska;
Rakibaadda;
Auto-documentation;
Jiilka sanduuqa ciidda ee khadka tooska ah;
Falanqaynta taagan
Qof kasta oo hore u fahmay faa'iidooyinka iyo C-samaynta si fudud soo dejiso template mashruuca oo bilow isticmaalkeeda.
Waxaan inta badan ka hadli doonaa sida loo habeeyo qoraallada CMake, markaa si faahfaahsan ayaa looga doodi doonaa. Qof kastaa si toos ah ayuu u arki karaa faylalka intiisa kale bogga mashruuca template.
Marka hore, waxaad u baahan tahay inaad codsato nooca loo baahan yahay ee nidaamka CMake. CMake wuu kobcayaa, saxeexyada amarka iyo habdhaqanka xaaladaha kala duwan ayaa isbeddelaya. Si CMake ay isla markiiba u fahamto waxa aan ka rabno, waxaan u baahanahay inaan isla markiiba diiwaan geliyo shuruudahayaga.
cmake_minimum_required(VERSION 3.13)
Markaa waxaan u qoondayn doonaa mashruucayaga, magaciisa, nooca, luqadaha la isticmaalo, iwm. (eeg. ΠΊΠΎΠΌΠ°Π½Π΄Ρ project).
Xaaladdan oo kale waxaan tilmaamaynaa luqadda CXX (tanina waxa ay la macno tahay C++) si aanu CMake u daadin oo aanu u raadin isku xidhka luuqada C (sida caadiga ah, CMake waxa ku jira laba luuqadood: C iyo C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Halkan waxaad isla markiiba ku hubin kartaa in mashruucayagu ku jiro mashruuc kale oo mashruuc-hoosaad ahaan ah. Tani waxay caawin doontaa wax badan mustaqbalka.
Doorashada koowaad waa MYLIB_TESTING - in la joojiyo imtixaanada unugga. Tani waxay noqon kartaa lama huraan haddii aan hubinno in wax walba ay ku habboon yihiin imtixaannada, laakiin waxaan rabnaa kaliya, tusaale ahaan, inaan rakibno ama xirno mashruucayaga. Ama mashruuceena waxaa lagu daraa mashruuc-hoosaad ahaan - kiiskan, isticmaalayaasha mashruucayagu ma xiiseeyaan socodsiinta imtixaanadayada. Ma tijaabin ku tiirsanaanta aad isticmaasho, ma?
Intaa waxaa dheer, waxaan samayn doonaa doorasho gaar ah MYLIB_COVERAGE si loo cabbiro daboolida koodhka imtixaanada, laakiin waxay u baahan doontaa qalab dheeraad ah, markaa waxay u baahan doontaa in si cad loo furo.
Dabcan, waxaanu nahay kuwa qabow oo lagu daray barmaamijiyeyaasha, marka waxaan rabnaa heerka ugu sarreeya ee ogaanshaha waqtiga-waqtiga isku-dubaridiyaha. Ma jiro hal jiir oo simbiriirixaya.
Maktabadeenu waxay ka kooban tahay faylalka madaxa, taas oo macnaheedu yahay ma hayno wax qiiq ah oo ah qaab maktabado taagan ama firfircoon. Dhanka kale, si loo isticmaalo maktabadeena dibadda, waxay u baahan tahay in la rakibo, waxay u baahan tahay in lagu ogaan karo nidaamka oo lagu xiro mashruucaaga, isla markaana isla kuwan madaxyada ah, iyo sidoo kale laga yaabo inay jiraan qaar dheeraad ah. waxay ku dheggan yihiin guryaha.
Ujeedadan awgeed, waxaan u abuurnaa maktabad interface ah.
add_library(mylib INTERFACE)
Waxaan ku xidhaa madaxyada maktabadeena interface.
Casriga, moodada, isticmaalka dhalinyarada ee CMake waxay ka dhigan tahay madaxyada, guryaha, iwm. lagu kala qaado hal bartilmaameed. Marka waxaa ku filan in la yiraahdo target_link_libraries(target PRIVATE dependency), iyo dhammaan madaxyada ku xiran bartilmaameedka dependency, ayaa loo heli doonaa ilaha la beegsanayo target. Midna uma baahnid [target_]include_directories. Tan waxaa lagu muujin doonaa hoosta falanqaynta Samee qoraalka imtixaanada cutubka.
Aynu dejinno halbeegga luqadda. Dabcan, kii ugu dambeeyay. Isla mar ahaantaana, kuma darin heerka caadiga ah, laakiin sidoo kale waxaan u fidinnaa kuwa isticmaali doona maktabadeena. Tan waxaa lagu gaaraa sababtoo ah xaqiiqda ah in hantida la dejiyay ay leedahay qayb INTERFACE (eeg target_compile_features order).
Aynu abuurno magac loo yaqaan maktabadeena. Waxaa intaa dheer, quruxda, waxay ku jiri doontaa "magaca magac" gaar ah. Tani waxay faa'iido yeelan doontaa marka qaybo kala duwan ay ka soo muuqdaan maktabadeena, oo waxaan aadeynaa si aan isku xirno iyaga oo aan midba midka kale ahayn. Sida Busta, tusaale ahaan.
Ku rakibida madaxyadayada nidaamka. Wax walba waa sahlan yihiin halkan. Waxa aanu nidhi galka ay ku jiraan madaxyada oo dhan waa in ay galaan hagaha include marka loo eego goobta lagu rakibay.
Marka xigta, waxaan ku wargelineynaa nidaamka dhismaha in aan rabno inaan awoodno inaan u yeerno taliska mashaariicda dhinac saddexaad find_package(Mylib) oo yool hel Mylib::mylib.
Sixirka xiga waa in sidan loo fahmo. Marka mashruuca dhinac saddexaad waxaan u wacnaa amarka find_package(Mylib 1.2.3 REQUIRED), iyo nooca dhabta ah ee maktabadda la rakibay waxay noqon doontaa mid aan la socon karin nooca 1.2.3CMake ayaa si toos ah u dhalin doonta qalad Taasi waa, uma baahnid inaad gacanta ku raacdo noocyada.
Haddii baaritaanada la naafo si cad loo isticmaalo doorasho u dhiganta ama mashruucayagu waa mashruuc-hoosaad, taas oo ah, waxay ku xidhan tahay mashruuc kale oo CMake ah iyadoo la adeegsanayo amarka add_subdirectory, kuma sii soconno nidaamka kala sareynta, iyo qoraalka, oo qeexaya amarrada abuurista iyo socodsiinta imtixaannada, si fudud uma socon.
Aynu abuurno faylkeena la fulin karo oo leh imtixaanno. Caadi ahaan waxaan si toos ah ugu daraa binary-ga la fulin karo kaliya faylka ku jiri doona shaqada main.
add_executable(mylib-unit-tests test_main.cpp)
Oo waxaan ku daraa faylal kuwaas oo imtixaanada laftooda lagu sharraxay hadhow. Laakin ma aha inaad taas samayso.
Waxaan isku xirnaa ku tiirsanaanta. Fadlan la soco in aan ku xidhnay kaliya bartilmaameedyada CMake ee aan u baahannahay ee binary-ga oo aanaan wicin amarka target_include_directories. Ciwaanka ka yimid qaabka imtixaanka iyo kayaga Mylib::mylib, iyo sidoo kale in la dhiso xuduudaha (xaaladkeena, tani waa heerka luqadda C++) ayaa la yimid ujeedooyinkan.
Ugu dambayntii, waxaanu abuurnaa yool aan fiicneyn, "dhismaha" kaas oo u dhigma imtixaannada socda, waxaanan ku darnaa bartilmaameedkan dhismaha caadiga ah (sifada ayaa mas'uul ka ah tan. ALL). Tani waxay ka dhigan tahay in dhismaha caadiga ah uu kiciyo imtixaanada si ay u socdaan, taasoo la micno ah inaan waligeen iloobi doonin inaan wadno.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Marka xigta, waxaanu awoodnaa cabbirka daboolka koodka haddii doorashada ku habboon la cayimay. Ma geli doono faahfaahinta, sababtoo ah waxay la xiriiraan in ka badan qalabka lagu cabbiro caymiska marka loo eego CMake. Waxa kaliya oo muhiim ah in la ogaado in iyada oo ku saleysan natiijooyinka la abuurayo yool coverage, kaas oo ay ku habboon tahay in la bilaabo cabbiraadda caymiska.
Marka xigta, waxaan hubineynaa in isticmaaluhu uu dhigay doorsoomiyaha luqadda. Hadday haa tahay, markaa ma taabaneyno, haddii kale, markaa waxaan qaadanaa Ruush. Kadibna waxaan dejineynaa faylalka nidaamka Doxygen. Dhammaan doorsoomayaasha lagama maarmaanka ah, oo ay ku jiraan luqadda, waxay tagaan halkaas inta lagu jiro habka qaabeynta (eeg. ΠΊΠΎΠΌΠ°Π½Π΄Ρ configure_file).
Markaa waxaan abuurnaa yool doc, kaas oo bilaabi doona soo saarista dukumentiyada. Maadaama soo saarista dukumeenti aysan ahayn baahida ugu weyn ee geeddi-socodka horumarinta, bartilmaameedka looma suurtagelin doono si qalad ah, waa in si cad loo bilaabo.
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 ()
Waxay bixisaa awoodda lagu baabi'iyo dhismaha iyo bartilmaameedka tijaabada cutubka check. Natiijo ahaan, cabbiraadda caymiska koodhka ee imtixaanada waa la damiyay (eeg. MYLIB_COVERAGE).
Tijaabada sidoo kale si toos ah ayaa loo curyaami doonaa haddii mashruucu ku xidhmo mashruuc kale oo mashruuc hoosaad ahaan isticmaalaya amarka add_subdirectory.
Dhab ahaantii, nooca CMake 3.13 ayaa kaliya looga baahan yahay si uu u socodsiiyo qaar ka mid ah amarrada console-ka ee lagu sharraxay kaalmadan. Marka laga eego aragtida syntax ee qoraallada CMake, nooca 3.8 ayaa ku filan haddii jiilka loogu yeero siyaabo kale.
Taas ka dib, falanqaynta joogtada ah ayaa si toos ah loo bilaabi doonaa mar kasta oo isha la ururiyo oo dib loo ururiyo. Looma baahna in la sameeyo wax dheeraad ah.
Calaacal
Iyada oo la kaashanayo qalab cajiib ah scan-build Waxa kale oo aad samayn kartaa falanqeyn taagan waqti aan la joogin:
CMake waa nidaam aad u awood badan oo dabacsan kaas oo kuu ogolaanaya inaad hirgeliso shaqeynta dhadhan kasta iyo midab kasta. Oo, in kasta oo syntax mararka qaarkood ka tago wax badan in la doonayo, Ibliisku weli ma aha sida laga cabsado sida uu rinji. U isticmaal nidaamka dhisidda CMake danta bulshada iyo caafimaadka.