Matul l-iżvilupp, inħobb nibdel il-kompilaturi, nibni modi, verżjonijiet tad-dipendenza, inwettaq analiżi statika, inkejjel il-prestazzjoni, niġbor kopertura, niġġenera dokumentazzjoni, eċċ. U nħobb ħafna lil CMake għax jippermettili nagħmel dak kollu li nixtieq.
Ħafna nies jikkritikaw lil CMake, u ħafna drabi ħaqqhom, imma jekk tħares lejha, mhux kollox huwa daqshekk ħażin, u dan l-aħħar mhux ħażin xejn, u d-direzzjoni tal-iżvilupp hija pjuttost pożittiva.
F'din in-nota, irrid ngħidlek kif sempliċiment torganizza librerija header f'C++ fis-sistema CMake biex tikseb il-funzjonalità li ġejja:
Se nitkellmu prinċipalment dwar kif norganizzaw l-iskripts CMake, għalhekk se jiġu diskussi fid-dettall. Kulħadd jista 'jara l-bqija tal-fajls direttament fuq il-paġna tal-proġett tal-mudell.
L-ewwelnett, għandek bżonn titlob il-verżjoni meħtieġa tas-sistema CMake. CMake qed jevolvi, il-firem tal-kmand u l-imġieba f'kundizzjonijiet differenti qed jinbidlu. Sabiex CMake jifhem immedjatament dak li rridu minnu, irridu nirreġistraw immedjatament ir-rekwiżiti tagħna għaliha.
cmake_minimum_required(VERSION 3.13)
Imbagħad aħna se nnominaw il-proġett tagħna, l-isem tiegħu, il-verżjoni, il-lingwi użati, eċċ. (ara. команду project).
F'dan il-każ aħna nindikaw il-lingwa CXX (u dan ifisser C++) sabiex CMake ma tisforzax u tfittex kompilatur tal-lingwa C (b'mod awtomatiku, CMake jinkludi żewġ lingwi: C u C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Hawnhekk tista' tiċċekkja immedjatament jekk il-proġett tagħna huwiex inkluż fi proġett ieħor bħala sottoproġett. Dan se jgħin ħafna fil-futur.
L-ewwel għażla hija MYLIB_TESTING — biex jiġu diżattivati testijiet tal-unità. Dan jista 'jkun meħtieġ jekk aħna żgur li kollox huwa fl-ordni mat-testijiet, iżda rridu biss, pereżempju, li ninstallaw jew jippakkjaw il-proġett tagħna. Jew il-proġett tagħna huwa inkluż bħala sottoproġett - f'dan il-każ, l-utent tal-proġett tagħna mhuwiex interessat li jmexxi t-testijiet tagħna. Ma tittestjax id-dipendenzi li tuża, hux?
Barra minn hekk, se nagħmlu għażla separata MYLIB_COVERAGE għall-kejl tal-kopertura tal-kodiċi permezz tat-testijiet, iżda se teħtieġ għodod addizzjonali, għalhekk jeħtieġ li tkun attivata b'mod espliċitu.
Naturalment, aħna programmaturi jibred flimkien, għalhekk irridu l-livell massimu ta 'dijanjostika tal-kompilazzjoni mill-kompilatur. Mhux ġurdien wieħed se jiżloq.
Il-librerija tagħna tikkonsisti biss minn fajls header, li jfisser li m'għandna l-ebda exhaust fil-forma ta 'libreriji statiċi jew dinamiċi. Min-naħa l-oħra, sabiex tuża l-librerija tagħna esternament, jeħtieġ li tkun installata, jeħtieġ li tkun skoperta fis-sistema u konnessa mal-proġett tiegħek, u fl-istess ħin dawn l-istess headers, kif ukoll possibilment xi oħrajn addizzjonali, huma mwaħħla magħha proprjetajiet.
Għal dan il-għan, noħolqu librerija ta 'interface.
L-użu modern, moda, taż-żgħażagħ ta 'CMake jimplika li headers, proprjetajiet, eċċ. trażmessi permezz ta' mira waħda. Allura biżżejjed ngħid target_link_libraries(target PRIVATE dependency), u l-intestaturi kollha li huma assoċjati mal-mira dependency, se jkunu disponibbli għal sorsi li jappartjenu għall-mira target. U m'għandek bżonn l-ebda [target_]include_directories. Dan se jintwera hawn taħt fl-analiżi CMake script għal testijiet tal-unità.
Dan il-kmand jassoċja l-headers li neħtieġu mal-librerija tal-interface tagħna, u jekk il-librerija tagħna hija konnessa ma 'kwalunkwe mira fi ħdan l-istess ġerarkija CMake, allura l-headers mid-direttorju jkunu assoċjati magħha ${CMAKE_CURRENT_SOURCE_DIR}/include, u jekk il-librerija tagħna hija installata fuq is-sistema u konnessa ma 'proġett ieħor billi tuża l-kmand find_package, imbagħad headers mid-direttorju jkunu assoċjati magħha include relattiv għad-direttorju tal-installazzjoni.
Ejja nistabbilixxu standard tal-lingwa. Naturalment, l-aħħar waħda. Fl-istess ħin, aħna mhux biss jinkludu l-istandard, iżda wkoll jestenduh għal dawk li se jużaw il-librerija tagħna. Dan jinkiseb minħabba l-fatt li l-proprjetà stabbilita għandha kategorija INTERFACE (Ara kmand ta' target_compile_features).
Ejja noħolqu alias għal-librerija tagħna. Barra minn hekk, għas-sbuħija, se jkun fi "namespace" speċjali. Dan se jkun utli meta moduli differenti jidhru fil-librerija tagħna, u mmorru nikkonnettjawhom indipendentement minn xulxin. Bħal fil-Busta, pereżempju.
L-installazzjoni tal-headers tagħna fis-sistema. Kollox huwa sempliċi hawn. Aħna ngħidu li l-folder bl-headers kollha għandu jidħol fid-direttorju include relattiv għall-post tal-installazzjoni.
Sussegwentement, ninfurmaw lis-sistema tal-bini li rridu nkunu nistgħu nsejħu l-kmand fi proġetti ta 'partijiet terzi find_package(Mylib) u tikseb gowl Mylib::mylib.
Il-kelma li jmiss għandha tinftiehem b'dan il-mod. Meta fi proġett ta 'parti terza nsejħu l-kmand find_package(Mylib 1.2.3 REQUIRED), u l-verżjoni reali tal-librerija installata se tkun inkompatibbli mal-verżjoni 1.2.3CMake awtomatikament jiġġenera żball. Jiġifieri, mhux ser ikollok bżonn issegwi l-verżjonijiet manwalment.
Jekk it-testijiet huma diżattivati espliċitament bl-użu għażla korrispondenti jew il-proġett tagħna huwa sottoproġett, jiġifieri, huwa konness ma 'proġett CMake ieħor bl-użu tal-kmand add_subdirectory, aħna ma nimxu aktar tul il-ġerarkija, u l-iskrittura, li tiddeskrivi l-kmandi għall-ġenerazzjoni u t-tmexxija tat-testijiet, sempliċement ma taħdem.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Aħna nikkollegaw id-dipendenzi. Jekk jogħġbok innota li għaqqadna biss il-miri CMake li kellna bżonn mal-binarju tagħna u ma sejjaħx il-kmand target_include_directories. Intestaturi mill-qafas tat-test u minn tagħna Mylib::mylib, kif ukoll jibnu parametri (fil-każ tagħna, dan huwa l-istandard tal-lingwa C++) wasal flimkien ma 'dawn l-għanijiet.
Fl-aħħarnett, noħolqu mira finta, li l-“bini” tagħha hija ekwivalenti għat-twettiq tat-testijiet, u żid din il-mira mal-bini default (l-attribut huwa responsabbli għal dan ALL). Dan ifisser li l-kostruzzjoni default tixpruna t-testijiet biex imexxu, jiġifieri qatt ma ninsew li nħaddmuhom.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Sussegwentement, nippermettu l-kejl tal-kopertura tal-kodiċi jekk tkun speċifikata l-għażla xierqa. Mhux se nidħol fid-dettalji, għax huma jirrelataw aktar ma 'għodda għall-kejl tal-kopertura milli ma' CMake. Huwa importanti biss li wieħed jinnota li abbażi tar-riżultati se tinħoloq mira coverage, li biha huwa konvenjenti li tibda tkejjel il-kopertura.
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()
Sussegwentement, niċċekkjaw jekk l-utent stabbilixxax il-varjabbli tal-lingwa. Jekk iva, allura ma nmissux, jekk le, allura nieħdu r-Russu. Imbagħad aħna kkonfigurat il-fajls tas-sistema Doxygen. Il-varjabbli kollha meħtieġa, inkluża l-lingwa, imorru hemm matul il-proċess tal-konfigurazzjoni (ara. команду configure_file).
Imbagħad noħolqu għan doc, li se tibda tiġġenera dokumentazzjoni. Peress li l-ġenerazzjoni tad-dokumentazzjoni mhijiex l-akbar ħtieġa fil-proċess ta 'żvilupp, il-mira mhux se tkun attivata b'mod awtomatiku; se jkollha tiġi mnedija b'mod espliċitu.
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 ()
Hawnhekk insibu t-tielet Python u noħolqu mira wandbox, li tiġġenera talba li tikkorrispondi għall-API tas-servizz Wandbox, u jibagħtu 'l bogħod. Ir-rispons jiġi b'rabta mal-kaxxa tar-ramel lest.
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()
Jipprovdi l-abbiltà li tiddiżattiva l-bini tat-test tal-unità u l-mira check. Bħala riżultat, il-kejl tal-kopertura tal-kodiċi permezz tat-testijiet huwa mitfi (ara. MYLIB_COVERAGE).
L-ittestjar huwa wkoll awtomatikament diżattivat jekk il-proġett ikun imqabbad ma 'proġett ieħor bħala sottoproġett bl-użu tal-kmand add_subdirectory.
Fil-fatt, il-verżjoni CMake 3.13 hija meħtieġa biss biex tħaddem xi wħud mill-kmandi tal-console deskritti f'din l-għajnuna. Mil-lat tas-sintassi tal-iskripts CMake, il-verżjoni 3.8 hija biżżejjed jekk il-ġenerazzjoni tissejjaħ b'modi oħra.
Wara dan, l-analiżi statika titnieda awtomatikament kull darba li s-sors jiġi kkompilat u kkompilat mill-ġdid. M'hemmx għalfejn tagħmel xi ħaġa addizzjonali.
Ħoss
Bl-għajnuna ta 'għodda mill-isbaħ scan-build Tista' wkoll tmexxi analiżi statika fi ftit ħin:
CMake hija sistema qawwija u flessibbli ħafna li tippermettilek timplimenta funzjonalità għal kull togħma u kulur. U, għalkemm is-sintassi kultant tħalli ħafna x’xewqat, ix-xitan għadu mhux terribbli daqs kemm hu miżbugħ. Uża s-sistema CMake build għall-benefiċċju tas-soċjetà u s-saħħa.