Nakong ea nts'etsopele, ke rata ho fetola li-compilers, ho aha mekhoa, liphetolelo tsa ho itšetleha, ho etsa tlhahlobo e tsitsitseng, ho lekanya ts'ebetso, ho bokella tšireletso, ho hlahisa litokomane, joalo-joalo. 'Me ke hlile ke rata CMake hobane e ntumella ho etsa sohle seo ke se batlang.
Batho ba bangata ba nyatsa CMake, 'me hangata ho loketse joalo, empa ha u e sheba, ha se ntho e' ngoe le e 'ngoe e mpe haholo, mme haufinyane tjena. e seng mpe ho hang, 'me tataiso ea tsoelo-pele e ntle haholo.
Lengolong lena, ke batla ho u joetsa mokhoa oa ho hlophisa laeborari ea lihlooho ho C++ ho sistimi ea CMake ho fumana ts'ebetso e latelang:
Kopano;
liteko tsa Autorun;
Tekanyo ea khaso ea khoutu;
Ho kenya;
Auto-documentation;
Ho hlahisa sandbox ea inthaneteng;
Tlhahlobo e tsitsitseng.
Mang kapa mang ea seng a ntse a utloisisa melemo le C-make a ka khona habonolo khoasolla template ea morero ebe o qala ho e sebelisa.
Re tla bua haholo ka mokhoa oa ho hlophisa lingoloa tsa CMake, kahoo li tla tšohloa ka botlalo. Mang kapa mang a ka sheba lifaele tse ling ka kotloloho leqepheng la morero oa template.
Pele ho tsohle, o hloka ho kopa mofuta o hlokahalang oa sistimi ea CMake. CMake e ntse e fetoha, li-signature tsa litaelo le boitšoaro maemong a fapaneng lia fetoha. E le hore CMake e utloisise hang-hang seo re se batlang ho eona, re hloka ho tlaleha litlhoko tsa rona hang-hang.
cmake_minimum_required(VERSION 3.13)
Ebe re khetha projeke ea rona, lebitso la eona, mofuta, lipuo tse sebelisitsoeng, joalo-joalo (bona. команду project).
Tabeng ena re bontša puo CXX ('me sena se bolela C++) e le hore CMake e se ke ea khathatsa le ho batla moqapi oa puo ea C (ka ho feletseng, CMake e kenyelletsa lipuo tse peli: C le C ++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Mona o ka hlahloba hang-hang hore na morero oa rona o kenyelelitsoe morerong o mong e le subproject. Sena se tla thusa haholo nakong e tlang.
Khetho ea pele ke MYLIB_TESTING — ho tima diteko tsa diyuniti. Sena se ka 'na sa hlokahala haeba re kholisehile hore ntho e' ngoe le e 'ngoe e tsamaisana le liteko, empa re batla feela, ka mohlala, ho kenya kapa ho paka morero oa rona. Kapa morero oa rona o kenyelelitsoe e le morero - tabeng ena, mosebedisi oa morero oa rona ha a thahaselle ho etsa liteko tsa rona. Ha u leke litšepiso tseo u li sebelisang, na ha ho joalo?
Ho phaella moo, re tla etsa khetho e arohaneng MYLIB_COVERAGE bakeng sa ho lekanya tšireletso ea khoutu ka liteko, empa e tla hloka lisebelisoa tse eketsehileng, kahoo e tla hloka ho lumelloa ka ho hlaka.
Ehlile, re baetsi ba mananeo ba pholileng, ka hona re batla boemo bo holimo ba tlhahlobo ea nako ea ho bokella ho tsoa ho motlatsi. Ha ho toeba e le 'ngoe e tla thella.
Laeborari ea rona e na le lifaele tsa lihlooho feela, ho bolelang hore ha re na mokhathala leha e le ofe ka mokhoa oa lilaebrari tse tsitsitseng kapa tse sebetsang. Ka lehlakoreng le leng, molemong oa ho sebelisa laeborari ea rona kantle ho naha, e hloka ho kengoa, e hloka ho bonoa ka har'a sistimi mme e hokahane le projeke ea hau, 'me ka nako e ts'oanang lihlooho tsena, hammoho le tse ling tse ling, li khomaretsoe ho eona thepa.
Bakeng sa morero ona, re theha laebrari ea li-interface.
add_library(mylib INTERFACE)
Re kopanya lihlooho ho laeborari ea rona ea li-interface.
Tšebeliso ea sejoale-joale, ea feshene, ea bacha ea CMake e bolela hore lihlooho, thepa, joalo-joalo. e fetisoa ka sepheo se le seng. Kahoo ho lekane ho bua target_link_libraries(target PRIVATE dependency), le lihlooho tsohle tse amanang le sepheo dependency, e tla ba teng bakeng sa mehloli eo e leng ea sepheo target. 'Me ha u hloke letho [target_]include_directories. Sena se tla bontšoa ka tlase tlhahlobong CMake script bakeng sa liteko tsa yuniti.
Taelo ena e amahanya lihlooho tseo re li hlokang le laeborari ea rona ea li-interface, 'me haeba laeborari ea rona e hokahane le sepheo sefe kapa sefe ka har'a sehlopha se tšoanang sa CMake, joale lihlooho tse tsoang bukeng li tla amahanngoa le eona. ${CMAKE_CURRENT_SOURCE_DIR}/include, le haeba laebrari ea rona e kentsoe tsamaisong 'me e hokahane le morero o mong o sebelisa taelo find_package, joale lihlooho tse tsoang bukeng li tla amahanngoa le eona include e amanang le buka ea ho kenya.
Ha re beheng maemo a puo. Ehlile, ea ho qetela. Ka nako e ts'oanang, ha re kenyelletse maemo a tloaelehileng feela, empa hape re a fetisetsa ho ba tla sebelisa laeborari ea rona. Sena se finyelloa ka lebaka la hore thepa e behiloeng e na le sehlopha INTERFACE (Bona target_compile_features taelo).
Ha re theheng lebitso la bokhoba la rona. Ho feta moo, bakeng sa botle, e tla ba "sebakeng sa mabitso" se khethehileng. Sena se tla ba molemo ha li-module tse fapaneng li hlaha laeboraring ea rona, 'me re ea ho li hokela re sa ipapise le tse ling. Joalo ka Busta, mohlala.
Ho kenya lihlooho tsa rona ho sistimi. Ntho e 'ngoe le e' ngoe e bonolo mona. Re re foldara e nang le lihlooho tsohle e lokela ho kena bukeng include e amanang le sebaka sa ho kenya.
Ka mor'a moo, re tsebisa tsamaiso ea kaho eo re batlang ho khona ho e bitsa taelo mererong ea batho ba bang find_package(Mylib) mme o fumane sepheo Mylib::mylib.
Polelo e latelang e lokela ho utloisisoa ka tsela ena. Ha re le morerong oa motho oa boraro re bitsa taelo find_package(Mylib 1.2.3 REQUIRED), 'me phetolelo ea sebele ea laebrari e kentsoeng e ke ke ea lumellana le phetolelo 1.2.3CMake e tla iketsetsa phoso. Ke hore, ha ho hlokahale hore u latele liphetolelo ka letsoho.
Haeba liteko li emisitsoe ka mokhoa o hlakileng khetho e tsamaellanang kapa morero oa rona ke subproject, ke hore, o hokahane le morero o mong oa CMake o sebelisa taelo add_subdirectory, ha re fetele pele ho latela maemo a phahameng, 'me script, e hlalosang litaelo tsa ho hlahisa le ho etsa liteko, ha e sebetse feela.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Re kopanya litšepe. Ka kopo hlokomela hore re hokahane feela le lipheo tsa CMake tseo re li hlokang ho binary ea rona mme ha rea ka ra bitsa taelo target_include_directories. Lihlooho tse tsoang ho moralo oa liteko le tsa rona Mylib::mylib, hammoho le mekhoa ea ho haha (ho rona, ena ke tekanyetso ea puo ea C ++) e fihlile hammoho le lipakane tsena.
Qetellong, re theha sepheo sa dummy, "mohaho" oa eona o lekanang le liteko tse sebetsang, 'me re eketsa sepheo sena ho mohaho oa kamehla (semelo se ikarabella bakeng sa sena. ALL). Sena se bolela hore sebopeho sa kamehla se etsa hore liteko li sebetse, ho bolelang hore re ke ke ra lebala ho li tsamaisa.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Ka mor'a moo, re nolofalletsa tekanyo ea tšireletso ea khoutu haeba khetho e nepahetseng e hlalositsoe. Nke ke ka bua ka lintlha, hobane li amana haholo le sesebelisoa sa ho lekanya sekoaelo ho feta CMake. Ke habohlokoa feela ho hlokomela hore ho itšetlehile ka liphello sepheo se tla etsoa coverage, eo ho leng bonolo ho qala ka eona ho lekanya tšireletso.
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()
Ka mor'a moo, re hlahloba hore na mosebedisi o behile phapang ea puo. Haeba ho joalo, joale ha re e ame, haeba ho se joalo, joale re nka Serussia. Ebe re hlophisa lifaele tsa sistimi ea Doxygen. Liphetoho tsohle tse hlokahalang, ho kenyeletsoa puo, li ea moo nakong ea ts'ebetso ea tlhophiso (bona. команду configure_file).
Ebe re theha sepheo doc, e tla qala ho hlahisa litokomane. Kaha ho hlahisa litokomane ha se tlhoko e kholo ka ho fetisisa ts'ebetsong ea nts'etsopele, sepheo se ke ke sa etsoa ka mokhoa oa kamehla; se tla tlameha ho hlahisoa ka mokhoa o hlakileng.
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 ()
Mona re fumana Python ea boraro mme re theha sepheo wandbox, e hlahisang kopo e lumellanang le API ea tšebeletso Wandbox, mme a mo lese. Karabo e tla le sehokelo sa sandbox e felileng.
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()
E fana ka bokhoni ba ho tima moaho oa tlhahlobo ea yuniti le sepheo check. Ka lebaka leo, tekanyo ea tšireletso ea khoutu ka liteko e ea tima (bona. MYLIB_COVERAGE).
Teko e boetse e emisoa ka bo eona haeba projeke e hokahane le projeke e 'ngoe e le subproject e sebelisang taelo add_subdirectory.
E fetola puo ea litokomane tseo sepheo se li hlahisang doc ho ya fuweng. Bakeng sa lethathamo la lipuo tse fumanehang, bona Webosaete ea sistimi ea oksijene.
E hlahloba ho sebetsa (e sebetsa, haeba e se e se e ntse e le teng) liteko tsa yuniti bakeng sa khaso ea khoutu ka liteko tse sebelisang lenaneo gcovr.
Sehlahisoa sa ho futhumatsa se tla shebahala tjena:
Tšebeletso e sebelisetsoa sena Wandbox. Ha ke tsebe hore na li-server tsa bona li tenyetseha hakae, empa ke nahana hore monyetla ona ha oa lokela ho sebelisoa hampe.
Ebile, mofuta oa CMake 3.13 o hlokoa feela ho tsamaisa tse ling tsa litaelo tse hlalositsoeng ho thuso ena. Ho ea ka pono ea syntax ea CMake scripts, mofuta oa 3.8 o lekane haeba moloko o bitsoa ka litsela tse ling.
Kamora sena, tlhahlobo e tsitsitseng e tla hlahisoa ka bo eona nako le nako ha mohloli o hlophisoa le ho hlophisoa bocha. Ha ho hlokahale ho etsa letho le eketsehileng.
clang
Ka thuso ea sesebelisoa se makatsang scan-build U ka boela ua etsa tlhahlobo ea static ka nako:
CMake ke sistimi e matla haholo ebile e tenyetseha e u lumellang ho kenya ts'ebetso bakeng sa tatso le 'mala o mong le o mong. 'Me, le hoja ka linako tse ling syntax e siea ho hongata ho sa hlokahaleng, diabolosi o ntse a se mobe joalo ka ha a pentiloe. Sebelisa mokhoa oa ho haha oa CMake molemong oa sechaba le bophelo bo botle.