I le taimi o le atinaʻe, ou te manaʻo e sui tagata faʻapipiʻi, fausia auala, faʻalagolago i lomiga, faia suʻesuʻega faʻapitoa, fua faʻatinoga, aoina faʻasalalauga, faʻapipiʻi pepa, ma isi. Ma ou te fiafia tele i le CMake aua e mafai ai ona ou faia mea uma ou te manaʻo ai.
E toatele tagata e faitioina CMake, ma e masani lava ona tatau ai, ae afai e te tilotilo i ai, e le o mea uma e leaga tele, ma talu ai nei. e le leaga lava, ma o le itu o le atinae e fai si lelei.
I lenei faʻamatalaga, ou te manaʻo e taʻu atu ia te oe pe faʻapefea ona faʻapipiʻi se faletusi ulutala i C ++ i le CMake system e maua ai galuega nei:
Fonotaga;
Su'ega Autorun;
Su'ega fa'atulafonoina;
Fa'apipi'i;
Auto-pepatusi;
Fausia pusa oneone i luga ole laiga;
Su'esu'ega tumau.
Soʻo se tasi ua uma ona malamalama i le lelei ma le C-make e mafai ona faigofie la'uina ata o le poloketi ma amata faʻaaogaina.
E masani ona matou talanoa e uiga i le faʻatulagaina o tusitusiga CMake, o lea o le a talanoaina auiliili. So'o se tasi e mafai ona va'ai sa'o i isi faila i luga o le itulau o galuega fa'ata'ita'i.
Muamua, e tatau ona e talosagaina le manaʻomia o le CMake system. CMake o loʻo faʻaleleia, saini faʻatonu ma amioga i tulaga eseese ua suia. Ina ia mafai e CMake ona vave malamalama i mea tatou te mananaʻo mai ai, e tatau ona vave faʻamaumau a tatou manaʻoga mo ia.
cmake_minimum_required(VERSION 3.13)
Ona matou filifilia lea o la matou poloketi, lona igoa, faʻamatalaga, gagana faʻaaogaina, ma isi. (vaai. команду project).
I lenei tulaga matou te faailoa atu le gagana CXX (ma o lona uiga o le C++) ina ia le faʻalavelaveina e CMake ma suʻe se faʻapipiʻi gagana C (e le mafai, CMake e aofia ai gagana e lua: C ma C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
O iinei e mafai ai ona e siaki vave pe o loʻo aofia ai la matou poloketi i se isi poloketi e avea o se poloketi laiti. O le a fesoasoani tele lenei mea i le lumanaʻi.
O le filifiliga muamua o le MYLIB_TESTING - e faʻamalo suʻega iunite. Atonu e manaʻomia lenei mea pe a tatou mautinoa o loʻo lelei mea uma i suʻega, ae tatou te manaʻo, mo se faʻataʻitaʻiga, e faʻapipiʻi pe faʻapipiʻi a tatou poloketi. Po'o le matou poloketi o lo'o aofia ai o se subproject - i lenei tulaga, e le fiafia le tagata fa'aaogaina la matou poloketi e fa'atino a matou su'ega. E te le su'eina le fa'alagolago e te fa'aogaina, a ea?
E le gata i lea, o le a matou faia se filifiliga ese MYLIB_COVERAGE mo le fuaina o tulafono fa'asalalau e ala i su'ega, ae o le a mana'omia ni mea faigaluega fa'aopoopo, o lea e mana'omia ai le fa'aagaaga manino.
O le mea moni, matou te lelei faʻatasi ma tagata fai polokalame, o lea matou te mananaʻo ai i le maualuga maualuga o faʻataʻitaʻiga-taimi mai le tagata faʻapipiʻi. E leai se isumu e tasi e se'e.
O la matou faletusi e na'o faila o ulutala, o lona uiga e leai ni a matou fa'aletonu i le tulaga o faletusi fa'amautu po'o le malosi. I le isi itu, ina ia mafai ona faʻaogaina le matou faletusi i fafo, e manaʻomia ona faʻapipiʻi, e manaʻomia ona iloa i totonu o le polokalama ma faʻafesoʻotaʻi i lau poloketi, ma i le taimi lava e tasi ia lava ulutala, faʻapea foʻi ma nisi faʻaopoopoga, o lo'o fa'apipi'i i ai meatotino.
Mo lenei faʻamoemoe, matou te fatuina se faletusi faʻaoga.
add_library(mylib INTERFACE)
Matou te fusifusia ulutala i la matou potutusi fa'aoga.
Fa'aonaponei, fa'aonaponei, fa'aoga talavou o CMake o lona uiga o ulutala, meatotino, ma isi. fa'asalalauina e ala i le tasi fa'amoemoe. Ua lava lea e fai atu ai target_link_libraries(target PRIVATE dependency), ma ulutala uma e feso'ota'i ma le sini dependency, o le a avanoa mo punaoa e patino i le sini target. Ma e te le manaʻomia se mea [target_]include_directories. O le a fa'aalia lea i lalo ile au'ili'iliga CMake tusitusiga mo su'ega iunite.
O lenei poloaiga e faʻafesoʻotaʻi ulutala matou te manaʻomia ma la matou faletusi faʻaoga, ma afai e fesoʻotaʻi le matou faletusi i soʻo se sini i totonu o le CMake hierarchy tutusa, ona faʻafesoʻotaʻi lea o ulutala mai le lisi. ${CMAKE_CURRENT_SOURCE_DIR}/include, ma pe afai o loʻo faʻapipiʻiina le matou faletusi i luga o le polokalama ma fesoʻotaʻi atu i se isi poloketi e faʻaaoga ai le poloaiga find_package, ona sosoo ai lea ma ulutala mai le lisi include fa'atatau ile fa'atonuga fa'apipi'i.
Sei o tatou setiina se tulaga o le gagana. Ioe, o le mea mulimuli lava. I le taimi lava e tasi, matou te le gata ina aofia ai le tulaga masani, ae faʻalauteleina foi ia i latou o le a faʻaaogaina la matou faletusi. E ausia lenei mea ona o le mea moni e iai le vaega o le meatotino seti INTERFACE (tagai target_compile_features poloaiga).
Se'i fai se igoa fa'aigoa mo la tatou faletusi. E le gata i lea, mo le matagofie, o le ai ai i totonu o se "igoa igoa" faapitoa. O le a aoga lenei mea pe a faʻaalia ni modules eseese i totonu o la matou faletusi, ma matou o atu e faʻafesoʻotaʻi tutoʻatasi le tasi ma le isi. E pei o Busta, mo se faʻataʻitaʻiga.
Fa'apipi'i a matou ulutala i totonu o le faiga. E faigofie mea uma iinei. Matou te fai atu o le faila ma ulutala uma e tatau ona alu i totonu o le lisi include fa'atatau ile nofoaga fa'apipi'i.
Ma le isi, matou te logoina le faiga faʻavae matou te manaʻo e mafai ona valaʻau le poloaiga i galuega faʻavae lona tolu find_package(Mylib) ma maua se sini Mylib::mylib.
O le isi sipela e tatau ona malamalama i lenei auala. A i totonu o se galuega a isi vaega matou te taʻua le poloaiga find_package(Mylib 1.2.3 REQUIRED), ma o le lomiga moni o le faletusi faʻapipiʻi o le a le fetaui ma le faʻasologa 1.2.3E otometi lava ona fa'atupuina e le CMake se mea sese. O lona uiga, e te le mana'omia le siakiina ma le lima.
Afai e le atoatoa su'ega fa'aoga manino filifiliga talafeagai po'o le matou poloketi o se subproject, o lona uiga, e feso'ota'i atu i se isi poloketi CMake e fa'aaoga ai le fa'atonuga add_subdirectory, matou te le agai i luma i luga o le faʻatonuga, ma o le tusitusiga, o loʻo faʻamatalaina poloaiga mo le faʻatupuina ma le faʻataʻitaʻiina o suʻega, e le o taʻavale.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Matou te faʻafesoʻotaʻi faʻalagolago. Faamolemole ia matau na matou faʻafesoʻotaʻi naʻo le CMake sini matou te manaʻomia i la matou binary ma e leʻi valaʻau le poloaiga target_include_directories. Ulutala mai le auivi o le suʻega ma mai matou Mylib::mylib, faʻapea foʻi ma le fausiaina o tapulaʻa (i lo matou tulaga, o le C++ gagana tulaga) na oʻo mai ma nei sini.
Ma le mea mulimuli, matou te fatuina se taulaiga faʻailoga, o le "fausia" lea e tutusa ma suʻega faʻataʻitaʻi, ma faʻaopoopo lenei faʻamoemoe i le faʻaogaina o le fale (o le uiga e nafa ma lenei mea. ALL). O lona uiga o le faaletonu o le fausiaina e faʻaosoina ai suʻega e taʻavale, o lona uiga o le a le galo ia i tatou e faʻatautaia.
add_custom_target(check ALL COMMAND mylib-unit-tests)
O le isi, matou te fa'atagaina le fuaina o le fa'ailoga pe a fa'ailoa mai le filifiliga talafeagai. O le a ou le alu i auiliiliga, aua latou te fesoʻotaʻi atili i se meafaigaluega mo le fuaina o le inisiua nai lo le CMake. E na'o le taua o le maitauina e fa'atatau i taunu'uga o le a faia ai se sini coverage, lea e faigofie ai ona amata fuaina le ufiufi.
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()
Le isi, matou siaki pe ua setiina e le tagata faʻaoga le fesuiaiga o le gagana. Afai ioe, ona matou le paʻi atu lea, a leai, ona matou ave lea o le Rusia. Ona matou faʻatulagaina lea o faila faila o le Doxygen. O fesuiaiga uma e manaʻomia, e aofia ai le gagana, alu i ai i le taimi o le faʻatulagaga (vaʻai. команду configure_file).
Ona tatou faia lea o se sini doc, lea o le a amata fausia ai faʻamaumauga. Talu ai o le fa'atupuina o fa'amaumauga e le'o le mana'oga tele lea i le fa'agasologa o le atina'e, o le fa'amoemoe o le a le mafai ona fa'aletonu; e tatau ona fa'alauiloa manino.
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 ()
O iinei tatou te maua ai le Python lona tolu ma fatuina se sini wandbox, lea e maua ai se talosaga e fetaui ma le API auaunaga Pusa ta'avale, ma auina atu o ia e alu. O le tali e sau ma se feso'ota'iga i le pusa oneone ua mae'a.
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 maua ai le malosi e fa'agata ai le fau ma le fa'atatau o su'ega iunite check. O le i'uga, ua tape le fuaina o fa'ailoga fa'atulafono e ala i su'ega (va'ai. MYLIB_COVERAGE).
O le su'ega e otometi fo'i le fa'aletonu pe a feso'ota'i le poloketi i se isi poloketi o se subproject e fa'aaoga ai le fa'atonuga add_subdirectory.
O loʻo faʻaaogaina le tautua mo lenei mea Pusa ta'avale. Ou te le iloa pe faʻafefea ona fetuutuunai a latou 'auʻaunaga, ae ou te manatu e le tatau ona faʻaleagaina lenei avanoa.
O le mea moni, o le CMake version 3.13 e manaʻomia e faʻatautaia ai nisi o faʻatonuga faʻamafanafana o loʻo faʻamatalaina i lenei fesoasoani. Mai le vaaiga o le syntax o CMake scripts, faʻasologa 3.8 e lava pe afai e valaʻau augatupulaga i isi auala.
A maeʻa lenei mea, o le a otometi lava le faʻalauiloaina o suʻesuʻega faʻapitoa i taimi uma e tuʻufaʻatasia ai ma toe tuʻufaʻatasia le puna. E leai se mea e manaʻomia e fai ai se mea faʻaopoopo.
Faʻapipiʻi
Faatasi ai ma le fesoasoani a se meafaigaluega matagofie scan-build E mafai fo'i ona e fa'atinoina su'esu'ega fa'amau i se taimi:
CMake o se faiga sili ona mamana ma fetuutuunai e mafai ai ona e faʻatinoina galuega mo tofo uma ma lanu. Ma, e ui lava o le syntax o nisi taimi e tuua ai le tele o mea e manaʻomia, o le tiapolo e le o se mea leaga e pei ona valiina. Fa'aaoga le CMake build system mo le manuia o sosaiete ma le soifua maloloina.