Lakoko idagbasoke, Mo nifẹ lati yi awọn olupilẹṣẹ pada, kọ awọn ipo, awọn ẹya igbẹkẹle, ṣe itupalẹ aimi, wiwọn iṣẹ ṣiṣe, gba agbegbe, ṣe ipilẹṣẹ iwe, ati bẹbẹ lọ. Ati pe Mo nifẹ CMake gaan nitori pe o gba mi laaye lati ṣe ohun gbogbo ti Mo fẹ.
Ọpọlọpọ eniyan ṣofintoto CMake, ati nigbagbogbo tọsi bẹ, ṣugbọn ti o ba wo, kii ṣe ohun gbogbo buru pupọ, ati laipẹ. ko buburu ni gbogbo, ati awọn itọsọna ti idagbasoke jẹ ohun rere.
Ninu akọsilẹ yii, Mo fẹ lati sọ fun ọ bi o ṣe le ṣeto iwe-ikawe akọsori nirọrun ni C ++ ninu eto CMake lati gba iṣẹ ṣiṣe atẹle:
Apejọ;
Autorun igbeyewo;
Iwọn wiwọn koodu;
Fifi sori ẹrọ;
Iwe-ipamọ aifọwọyi;
Online sandbox iran;
Ayẹwo aimi.
Ẹnikẹni ti o ba ti loye awọn anfani ati C-ṣe le nirọrun download ise agbese awoṣe ki o si bẹrẹ lilo.
A yoo sọ nipataki bi o ṣe le ṣeto awọn iwe afọwọkọ CMake, nitorinaa wọn yoo jiroro ni awọn alaye. Ẹnikẹni le wo awọn iyokù ti awọn faili taara lori iwe ise agbese awoṣe.
Ni akọkọ, o nilo lati beere ẹya ti o nilo ti eto CMake. CMake n yipada, awọn ibuwọlu aṣẹ ati ihuwasi ni awọn ipo oriṣiriṣi n yipada. Ni ibere fun CMake lẹsẹkẹsẹ ni oye ohun ti a fẹ lati ọdọ rẹ, a nilo lati gbasilẹ lẹsẹkẹsẹ awọn ibeere wa fun rẹ.
cmake_minimum_required(VERSION 3.13)
Lẹhinna a yoo ṣe apẹrẹ iṣẹ akanṣe wa, orukọ rẹ, ẹya, awọn ede ti a lo, ati bẹbẹ lọ (wo. команду project).
Ni idi eyi a tọka ede naa CXX (ati pe eyi tumọ si C ++) ki CMake ko ni igara ati wa fun akojọpọ ede C kan (nipa aiyipada, CMake pẹlu awọn ede meji: C ati C ++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Nibi o le ṣayẹwo lẹsẹkẹsẹ boya iṣẹ akanṣe wa wa ninu iṣẹ akanṣe miiran bi iṣẹ akanṣe kan. Eyi yoo ṣe iranlọwọ pupọ ni ọjọ iwaju.
Aṣayan akọkọ ni MYLIB_TESTING - lati mu awọn idanwo kuro. Eyi le jẹ pataki ti a ba ni idaniloju pe ohun gbogbo wa ni ibere pẹlu awọn idanwo, ṣugbọn a fẹ nikan, fun apẹẹrẹ, lati fi sori ẹrọ tabi ṣajọ iṣẹ akanṣe wa. Tabi iṣẹ akanṣe wa pẹlu bi iṣẹ akanṣe kan - ninu ọran yii, olumulo ti iṣẹ akanṣe wa ko nifẹ si ṣiṣe awọn idanwo wa. Iwọ ko ṣe idanwo awọn igbẹkẹle ti o lo, ṣe iwọ?
Ni afikun, a yoo ṣe aṣayan lọtọ MYLIB_COVERAGE fun wiwọn koodu agbegbe nipasẹ awọn idanwo, ṣugbọn yoo nilo awọn irinṣẹ afikun, nitorinaa yoo nilo lati mu ṣiṣẹ ni gbangba.
Nitoribẹẹ, a jẹ itura pẹlu awọn pirogirama, nitorinaa a fẹ ipele ti o pọ julọ ti awọn iwadii akoko iṣakojọpọ lati olupilẹṣẹ. Ko si asin kan ti yoo yọ nipasẹ.
Ile-ikawe wa ni awọn faili akọsori nikan, eyiti o tumọ si pe a ko ni eefi eyikeyi ni irisi aimi tabi awọn ile ikawe ti o ni agbara. Ni apa keji, lati le lo ile-ikawe wa ni ita, o nilo lati fi sori ẹrọ, o nilo lati wa ni wiwa ninu eto ati sopọ si iṣẹ akanṣe rẹ, ati ni akoko kanna awọn akọle kanna, bakanna bi o ṣee ṣe diẹ ninu awọn afikun, ti wa ni so si o-ini.
Fun idi eyi, a ṣẹda ohun ni wiwo ìkàwé.
add_library(mylib INTERFACE)
A di awọn akọle si ile-ikawe wiwo wa.
Igbalode, asiko, lilo ọdọ ti CMake tumọ si pe awọn akọle, awọn ohun-ini, ati bẹbẹ lọ. zqwq nipasẹ ọkan nikan afojusun. Nitorina o to lati sọ target_link_libraries(target PRIVATE dependency), ati gbogbo awọn akọle ti o ni nkan ṣe pẹlu ibi-afẹde dependency, yoo wa fun awọn orisun ti o jẹ ti ibi-afẹde target. Ati pe o ko nilo eyikeyi [target_]include_directories. Eyi yoo ṣe afihan ni isalẹ ni itupalẹ CMake akosile fun awọn igbeyewo kuro.
Aṣẹ yii ṣepọ awọn akọsori ti a nilo pẹlu ile-ikawe wiwo wa, ati pe ti ile-ikawe wa ba ni asopọ si ibi-afẹde eyikeyi laarin awọn ilana CMake kanna, lẹhinna awọn akọle lati itọsọna naa yoo ni nkan ṣe pẹlu rẹ. ${CMAKE_CURRENT_SOURCE_DIR}/include, ati ti o ba ti wa ìkàwé ti fi sori ẹrọ lori awọn eto ati ki o ti sopọ si miiran ise agbese nipa lilo awọn pipaṣẹ find_package, lẹhinna awọn akọle lati inu itọsọna naa yoo ni nkan ṣe pẹlu rẹ include ojulumo si awọn fifi sori liana.
Jẹ ká ṣeto a ede bošewa. Dajudaju, awọn gan kẹhin. Lẹ́sẹ̀ kan náà, kì í ṣe pé a fi ọ̀pá ìdiwọ̀n kún un nìkan, ṣùgbọ́n a tún máa ń gbòòrò sí i fún àwọn tí yóò lo ibi ìkówèésí wa. Eyi jẹ aṣeyọri nitori otitọ pe ohun-ini ṣeto ni ẹka kan INTERFACE (cm. target_compile_features pipaṣẹ).
Jẹ ki a ṣẹda inagijẹ fun ile-ikawe wa. Pẹlupẹlu, fun ẹwa, yoo wa ni "aaye orukọ" pataki kan. Eyi yoo wulo nigbati awọn modulu oriṣiriṣi ba han ninu ile-ikawe wa, ati pe a lọ lati sopọ wọn ni ominira ti ara wa. Bi ni Busta, fun apẹẹrẹ.
Fifi awọn akọle wa sinu eto naa. Ohun gbogbo ni o rọrun nibi. A sọ pe folda pẹlu gbogbo awọn akọle yẹ ki o lọ sinu itọsọna naa include ojulumo si awọn fifi sori ipo.
Nigbamii ti, a sọ fun eto kikọ ti a fẹ lati ni anfani lati pe aṣẹ ni awọn iṣẹ akanṣe ẹnikẹta find_package(Mylib) ki o si gba ibi-afẹde kan Mylib::mylib.
Akọtọ atẹle yẹ ki o loye ni ọna yii. Nigbati o ba wa ni iṣẹ akanṣe ẹnikẹta a pe aṣẹ naa find_package(Mylib 1.2.3 REQUIRED), ati ẹya gidi ti ile-ikawe ti a fi sii yoo jẹ ibamu pẹlu ẹya naa 1.2.3CMake yoo ṣe ipilẹṣẹ aṣiṣe laifọwọyi. Iyẹn ni, iwọ kii yoo nilo lati tọpa awọn ẹya pẹlu ọwọ.
Ti awọn idanwo ba wa ni alaabo ni ṣoki ni lilo ti o baamu aṣayan tabi iṣẹ akanṣe wa jẹ iṣẹ akanṣe, iyẹn ni, o ti sopọ si iṣẹ akanṣe CMake miiran nipa lilo aṣẹ naa add_subdirectory, a ko gbe siwaju pẹlu awọn logalomomoise, ati awọn akosile, eyi ti o se apejuwe awọn ofin fun ti o npese ati ki o nṣiṣẹ igbeyewo, nìkan ko ni ṣiṣe.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
A so awọn igbẹkẹle. Jọwọ ṣe akiyesi pe a sopọ mọ awọn ibi-afẹde CMake nikan ti a nilo si alakomeji wa ati pe ko pe aṣẹ naa target_include_directories. Awọn akọle lati ilana idanwo ati lati ọdọ tiwa Mylib::mylib, bakannaa kọ awọn paramita (ninu ọran wa, eyi ni boṣewa ede C ++) wa nipasẹ awọn ibi-afẹde wọnyi.
Lakotan, a ṣẹda ibi-afẹde kan, “itumọ” eyiti o jẹ deede si awọn idanwo ṣiṣe, ati ṣafikun ibi-afẹde yii si kikọ aiyipada (ẹya naa jẹ iduro fun eyi ALL). Eyi tumọ si pe kikọ aiyipada nfa awọn idanwo lati ṣiṣẹ, afipamo pe a kii yoo gbagbe lati ṣiṣe wọn.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Nigbamii, a mu iwọn wiwọn koodu ṣiṣẹ ti aṣayan ti o yẹ ba jẹ pato. Emi kii yoo lọ sinu awọn alaye, nitori wọn ni ibatan diẹ sii si ọpa kan fun wiwọn agbegbe ju CMake lọ. O ṣe pataki nikan lati ṣe akiyesi pe da lori awọn abajade ti ibi-afẹde kan yoo ṣẹda coverage, pẹlu eyiti o rọrun lati bẹrẹ wiwọn agbegbe.
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()
Nigbamii, a ṣayẹwo boya olumulo ti ṣeto oniyipada ede. Ti o ba jẹ bẹẹni, lẹhinna a ko fi ọwọ kan, ti kii ba ṣe bẹ, lẹhinna a mu Russian. Lẹhinna a tunto awọn faili eto Doxygen. Gbogbo awọn oniyipada pataki, pẹlu ede, lọ sibẹ lakoko ilana iṣeto (wo. команду configure_file).
Lẹhinna a ṣẹda ibi-afẹde kan doc, eyi ti yoo bẹrẹ ti ipilẹṣẹ iwe. Niwọn igba ti awọn iwe ti ipilẹṣẹ kii ṣe iwulo nla julọ ninu ilana idagbasoke, ibi-afẹde naa kii yoo ṣiṣẹ nipasẹ aiyipada; yoo ni lati ṣe ifilọlẹ ni gbangba.
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 ()
Nibi a rii Python kẹta ati ṣẹda ibi-afẹde kan wandbox, eyiti o ṣe agbejade ibeere ti o baamu API iṣẹ naa Wandbox, ó sì rán an lọ. Idahun naa wa pẹlu ọna asopọ si apoti iyanrin ti o pari.
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()
Ni otitọ, ẹya CMake 3.13 nikan ni a nilo lati ṣiṣẹ diẹ ninu awọn aṣẹ console ti a ṣalaye ninu iranlọwọ yii. Lati oju-ọna ti sintasi ti awọn iwe afọwọkọ CMake, ẹya 3.8 ti to ti a ba pe iran ni awọn ọna miiran.
CMake jẹ eto ti o lagbara pupọ ati irọrun ti o fun ọ laaye lati ṣe iṣẹ ṣiṣe fun gbogbo itọwo ati awọ. Ati, biotilejepe awọn sintasi ma fi oju Elo lati wa ni fẹ, awọn Bìlísì jẹ ṣi ko bi ẹru bi o ti ya. Lo eto Kọ CMake fun anfani ti awujọ ati ilera.