Á meðan á þróun stendur finnst mér gaman að breyta þýðendum, smíða stillingar, ósjálfstæðisútgáfur, framkvæma kyrrstöðugreiningar, mæla frammistöðu, safna umfangi, búa til skjöl osfrv. Og ég elska virkilega CMake vegna þess að það gerir mér kleift að gera allt sem ég vil.
Margir gagnrýna CMake, og oft verðskuldað, en ef þú horfir á það er ekki allt svo slæmt, og nýlega alls ekki slæmt, og þróunarstefnan er nokkuð jákvæð.
Í þessari athugasemd vil ég segja þér hvernig á að skipuleggja hausbókasafn í C++ í CMake kerfinu til að fá eftirfarandi virkni:
Við munum aðallega tala um hvernig á að skipuleggja CMake forskriftir, svo þau verða rædd ítarlega. Hver sem er getur skoðað restina af skránum beint á sniðmátsverkefnissíðunni.
Fyrst af öllu þarftu að biðja um nauðsynlega útgáfu af CMake kerfinu. CMake er að þróast, skipanaundirskriftir og hegðun við mismunandi aðstæður eru að breytast. Til þess að CMake skilji strax hvað við viljum fá úr því þurfum við strax að skrá kröfur okkar um það.
cmake_minimum_required(VERSION 3.13)
Síðan munum við tilnefna verkefnið okkar, nafn þess, útgáfu, tungumál sem notuð eru osfrv. (sjá. команду project).
Í þessu tilviki tilgreinum við tungumálið CXX (og þetta þýðir C++) þannig að CMake þvingar ekki og leitar að C tungumálaþýðanda (sjálfgefið inniheldur CMake tvö tungumál: C og C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Hér getur þú strax athugað hvort verkefnið okkar sé innifalið í öðru verkefni sem undirverkefni. Þetta mun hjálpa mikið í framtíðinni.
Fyrsti kosturinn er MYLIB_TESTING — til að slökkva á einingaprófum. Þetta gæti verið nauðsynlegt ef við erum viss um að allt sé í lagi með prófunum, en við viljum td aðeins setja upp eða pakka verkefninu okkar. Eða verkefnið okkar er innifalið sem undirverkefni - í þessu tilviki hefur notandi verkefnisins ekki áhuga á að keyra prófin okkar. Þú prófar ekki ósjálfstæðin sem þú notar, er það?
Að auki munum við gera sérstakan valkost MYLIB_COVERAGE til að mæla umfang kóða með prófum, en það mun krefjast viðbótarverkfæra, svo það verður að vera virkt sérstaklega.
Auðvitað erum við flottir plús forritarar, svo við viljum fá hámarksstig greiningatíma greiningar frá þýðandanum. Ekki ein einasta mús mun renna í gegn.
Bókasafnið okkar samanstendur aðeins af hausskrám, sem þýðir að við erum ekki með neinn útblástur í formi kyrrstæðra eða kraftmikilla bókasöfna. Á hinn bóginn, til þess að geta notað bókasafnið okkar utanaðkomandi, þarf að setja það upp, það þarf að vera greinanlegt í kerfinu og tengt við verkefnið þitt, og á sama tíma þessir sömu hausar, sem og hugsanlega einhverjir til viðbótar, fylgja því eignir.
Í þessu skyni búum við til viðmótasafn.
add_library(mylib INTERFACE)
Við bindum hausa við viðmótasafnið okkar.
Nútímaleg, smart notkun ungmenna á CMake felur í sér að hausar, eiginleikar osfrv. send í gegnum eitt skotmark. Svo það er nóg að segja target_link_libraries(target PRIVATE dependency), og allir hausar sem tengjast markinu dependency, verður aðgengilegt fyrir heimildir sem tilheyra skotmarkinu target. Og þú þarft enga [target_]include_directories. Þetta verður sýnt hér að neðan í greiningunni CGerðu handrit fyrir einingapróf.
Þessi skipun tengir hausana sem við þurfum við viðmótasafnið okkar og ef bókasafnið okkar er tengt einhverju skotmarki innan sama CMake stigveldis, þá verða hausarnir úr möppunni tengdir því ${CMAKE_CURRENT_SOURCE_DIR}/include, og ef bókasafnið okkar er uppsett á kerfinu og tengt öðru verkefni með skipuninni find_package, þá verða hausar úr möppunni tengdir henni include miðað við uppsetningarskrána.
Setjum tungumálastaðal. Auðvitað sá allra síðasti. Á sama tíma látum við ekki aðeins staðalinn fylgja með heldur víkjum hann einnig út til þeirra sem munu nota bókasafnið okkar. Þetta er náð vegna þess að fasteignin hefur flokk INTERFACE (sjá target_compile_features skipun).
Við skulum búa til samnefni fyrir bókasafnið okkar. Þar að auki, fyrir fegurð, verður það í sérstöku „nafnarými“. Þetta mun vera gagnlegt þegar mismunandi einingar birtast í bókasafninu okkar og við förum að tengja þær óháð hvor annarri. Eins og til dæmis í Busta.
Að setja hausana okkar inn í kerfið. Hér er allt einfalt. Við segjum að mappan með öllum hausunum ætti að fara inn í möppuna include miðað við uppsetningarstaðinn.
Næsta álög ætti að skilja þannig. Þegar við erum í þriðja aðila verkefni köllum við skipunina find_package(Mylib 1.2.3 REQUIRED), og raunveruleg útgáfa af uppsettu bókasafni mun vera ósamrýmanleg útgáfunni 1.2.3CMake mun sjálfkrafa búa til villu. Það er, þú þarft ekki að fylgjast með útgáfum handvirkt.
Ef próf eru slökkt sérstaklega með því að nota samsvarandi valmöguleika eða verkefnið okkar er undirverkefni, það er, það er tengt öðru CMake verkefni með skipuninni add_subdirectory, við förum ekki lengra eftir stigveldinu og skriftin, sem lýsir skipunum til að búa til og keyra próf, keyrir einfaldlega ekki.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Við tengjum ósjálfstæði. Vinsamlegast athugaðu að við tengdum aðeins CMake markmiðin sem við þurftum við tvöfaldan okkar og kölluðum ekki skipunina target_include_directories. Fyrirsagnir úr prófunarrammanum og frá okkar Mylib::mylib, sem og byggingarfæribreytur (í okkar tilfelli er þetta C++ tungumálastaðallinn) komust í gegn með þessum markmiðum.
Að lokum búum við til dummy-markmið þar sem „byggingin“ jafngildir því að keyra prófanir, og bætum þessu markmiði við sjálfgefna smíðina (eigindið er ábyrgt fyrir þessu ALL). Þetta þýðir að sjálfgefna byggingin kveikir á prófunum til að keyra, sem þýðir að við munum aldrei gleyma að keyra þau.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Næst virkjum við kóðaþekjumælingu ef viðeigandi valkostur er tilgreindur. Ég mun ekki fara út í smáatriði vegna þess að þau tengjast meira tæki til að mæla umfang en CMake. Það er aðeins mikilvægt að hafa í huga að miðað við niðurstöðurnar verður markmið búið til coverage, sem þægilegt er að byrja að mæla þekju með.
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()
Næst athugum við hvort notandinn hafi stillt tungumálabreytuna. Ef já, þá snertum við það ekki, ef ekki, þá tökum við rússnesku. Síðan stillum við Doxygen kerfisskrárnar. Allar nauðsynlegar breytur, þar á meðal tungumálið, fara þangað meðan á stillingarferlinu stendur (sjá. команду configure_file).
Þá sköpum við okkur markmið doc, sem mun byrja að búa til skjöl. Þar sem að búa til skjöl er ekki stærsta þörfin í þróunarferlinu verður markmiðið ekki sjálfgefið virkt; það verður að vera ræst sérstaklega.
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 ()
Hér finnum við þriðja Python og búum til skotmark wandbox, sem býr til beiðni sem samsvarar þjónustu API Kassi, og sendir hann burt. Svarið kemur með hlekk á fullunna sandkassann.
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()
Reyndar er CMake útgáfa 3.13 aðeins nauðsynleg til að keyra nokkrar af stjórnborðsskipunum sem lýst er í þessari hjálp. Frá sjónarhóli setningafræði CMake forskrifta dugar útgáfa 3.8 ef kynslóð er kölluð á annan hátt.
Eftir þetta verður kyrrstöðugreining ræst sjálfkrafa í hvert skipti sem heimildin er sett saman og endursamsett. Það er engin þörf á að gera neitt til viðbótar.
Klangur
Með hjálp frábærs tóls scan-build Þú getur líka keyrt kyrrstöðugreiningu á skömmum tíma:
CMake er mjög öflugt og sveigjanlegt kerfi sem gerir þér kleift að innleiða virkni fyrir hvert bragð og lit. Og þó setningafræðin skilji stundum eftir sig miklu, þá er djöfullinn samt ekki eins hræðilegur og hann er málaður. Notaðu CMake smíðakerfið í þágu samfélagsins og heilsunnar.