N'oge mmepe, ọ na-amasị m ịgbanwe ndị na-achịkọta ihe, wuo ụdịdị, ụdị ndabere, mee nyocha static, tụọ arụmọrụ, nakọta mkpuchi, mepụta akwụkwọ, wdg. Ahụrụ m CMake n'anya n'ihi na ọ na-enye m ohere ịme ihe niile m chọrọ.
Ọtụtụ ndị mmadụ na-akatọ CMake, na-abụkarị ndị kwesịrị ekwesị, ma ọ bụrụ na ị na-ele ya anya, ọ bụghị ihe niile dị njọ, na nso nso a. adịghị njọ ma ọlị, na ntụziaka nke mmepe bụ nnọọ mma.
N'ime ndetu a, achọrọ m ịgwa gị ka ị ga-esi hazie ọbá akwụkwọ nkụnye eji isi mee na C++ na sistemụ CMake iji nweta ọrụ ndị a:
Anyị ga-ekwukarị banyere otu esi ahazi scripts CMake, yabụ a ga-atụle ha n'ụzọ zuru ezu. Onye ọ bụla nwere ike ịlele faịlụ ndị ọzọ ozugbo na ibe oru ngo template.
Nke mbụ, ịkwesịrị ịrịọ ụdị sistemụ CMake achọrọ. CMake na-agbanwe, mbinye aka iwu na omume na ọnọdụ dị iche iche na-agbanwe. Ka CMake ghọta ozugbo ihe anyị chọrọ na ya, anyị kwesịrị idekọ ihe anyị chọrọ ozugbo maka ya.
cmake_minimum_required(VERSION 3.13)
Mgbe ahụ, anyị ga-akọwapụta ọrụ anyị, aha ya, ụdị ya, asụsụ ndị a na-eji, wdg. (lee. команду project).
N'okwu a, anyị na-egosi asụsụ CXX (nke a pụtara C++) ka CMake ghara ịkpa ike wee chọọ mkpokọta asụsụ C (na ndabara, CMake gụnyere asụsụ abụọ: C na C ++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
N'ebe a, ị nwere ike ịlele ozugbo ma ọrụ anyị etinyere n'ọrụ ọzọ dị ka isiokwu. Nke a ga-enyere aka nke ukwuu n'ọdịnihu.
Nhọrọ nke mbụ bụ MYLIB_TESTING - iji gbanyụọ ule otu. Nke a nwere ike ịdị mkpa ma ọ bụrụ na anyị ji n'aka na ihe niile dị n'usoro na ule, ma anyị chọrọ naanị, dịka ọmụmaatụ, ịwụnye ma ọ bụ ngwugwu ọrụ anyị. Ma ọ bụ ọrụ anyị gụnyere dị ka isiokwu - na nke a, onye ọrụ nke ọrụ anyị enweghị mmasị na-agba ọsọ anyị ule. Ị naghị anwale dabere na ị na-eji, ị?
Na mgbakwunye, anyị ga-eme nhọrọ dị iche MYLIB_COVERAGE maka ịlele mkpuchi koodu site na ule, mana ọ ga-achọ ngwaọrụ ndị ọzọ, ya mere ọ ga-adị mkpa ka ọ rụọ ọrụ nke ọma.
Ọbá akwụkwọ anyị nwere naanị faịlụ nkụnye eji isi mee, nke pụtara na anyị enweghị mkpochapụ ọ bụla n'ụdị ọba akwụkwọ kwụ ọtọ ma ọ bụ dị ike. N'aka nke ọzọ, iji jiri ọbá akwụkwọ anyị n'èzí, ọ dị mkpa ka etinye ya, ọ dị mkpa ka a chọpụta ya na usoro ma jikọọ na ọrụ gị, na n'otu oge ahụ, otu nkụnye eji isi mee, yana ikekwe ụfọdụ ndị ọzọ, na-agbakwunyere ya Njirimara.
Maka nke a, anyị na-emepụta ọbá akwụkwọ interface.
add_library(mylib INTERFACE)
Anyị na-ekekọta nkụnye eji isi mee n'ọbá akwụkwọ interface anyị.
Oge a, ejiji, ojiji ntorobịa nke CMake na-egosi na nkụnye eji isi mee, akụrụngwa, wdg. bufere site na otu ebumnuche. Ya mere, ezuola ikwu target_link_libraries(target PRIVATE dependency), na nkụnye eji isi mee ihe niile metụtara ebumnuche dependency, ga-adị maka isi mmalite nke ebumnuche target. Ma ị chọghị nke ọ bụla [target_]include_directories. A ga-egosipụta nke a n'okpuru na nyocha CMee script maka ule otu.
Iwu a na-ejikọta ndị nkụnye eji isi mee anyị chọrọ na ọbá akwụkwọ interface anyị, ma ọ bụrụ na ọbá akwụkwọ anyị jikọtara ya na ebumnuche ọ bụla n'ime otu CMake hierarchy, mgbe ahụ, ndị nkụnye eji isi mee si na ndekọ ga-ejikọta ya na ya. ${CMAKE_CURRENT_SOURCE_DIR}/include, ma ọ bụrụ na etinyere ọbá akwụkwọ anyị na sistemụ wee jikọọ na ọrụ ọzọ site na iji iwu ahụ find_package, mgbe ahụ, ndị nkụnye eji isi mee si na ndekọ ga-ejikọta ya include ikwu na nwụnye ndekọ.
Ka anyị tọọ ọkọlọtọ asụsụ. N'ezie, nke ikpeazụ. N'otu oge ahụ, ọ bụghị nanị na anyị na-agụnye ọkọlọtọ, kamakwa na-agbatị ya nye ndị ga-eji ọbá akwụkwọ anyị. A na-enweta nke a n'ihi na ihe onwunwe setịpụrụ nwere ụdị INTERFACE (cm. target_compile_features iwu).
Ka anyị mepụta utu aha maka ọba akwụkwọ anyị. Ọzọkwa, maka ịma mma, ọ ga-abụ na "aha aha" pụrụ iche. Nke a ga-aba uru mgbe modul dị iche iche pụtara n'ọbá akwụkwọ anyị, anyị na-agakwa jikọọ ha n'adabereghị onwe ha. Dị ka na Busta, ọmụmaatụ.
Ịwụnye nkụnye eji isi mee anyị na sistemụ. Ihe niile dị mfe ebe a. Anyị na-ekwu na nchekwa nwere nkụnye eji isi mee niile kwesịrị ịbanye na ndekọ include ikwu na nwụnye ebe.
Ekwesịrị ịghọta n'asụsụ nke na-esote otu a. Mgbe n'ime ọrụ ndị ọzọ anyị na-akpọ iwu ahụ find_package(Mylib 1.2.3 REQUIRED), na ezigbo ụdị nke ọbá akwụkwọ arụnyere agaghị ekwekọ na ụdị ahụ 1.2.3CMake ga-ewepụta njehie na-akpaghị aka. Ya bụ, ịgaghị achọ iji aka gị soro ụdị dị iche iche.
Ọ bụrụ na agbanyụrụ ule n'ụzọ doro anya iji kwekọrọ nhọrọ ma ọ bụ ọrụ anyị bụ subproject, ya bụ, ejikọtara ya na ọrụ CMake ọzọ site na iji iwu ahụ add_subdirectory, anyị adịghị aga n'ihu tinyere ndị isi, na script, nke na-akọwa iwu maka na-amụba na-agba ọsọ ule, nnọọ adịghị ọsọ.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Nke mbụ, anyị na-ahụ ngwugwu nwere usoro nyocha achọrọ (dochie ya na ọkacha mmasị gị).
find_package(doctest 2.3.3 REQUIRED)
Ka anyị jiri ule mepụta faịlụ anyị nwere ike ime ya. Ọtụtụ mgbe, m na-agbakwunye ozugbo na ọnụọgụ abụọ enwere ike ime naanị faịlụ nke ga-enwe ọrụ ahụ main.
add_executable(mylib-unit-tests test_main.cpp)
M tinye faịlụ nke a na-akọwa ule n'onwe ha ma emechaa. Ma ị gaghị eme nke ahụ.
Anyị jikọtara dabere. Biko mara na anyị jikọtara naanị ebumnuche CMake anyị chọrọ na ọnụọgụ abụọ anyị na akpọghị iwu ahụ target_include_directories. Isi okwu sitere na usoro ule na nke anyị Mylib::mylib, yana wuo paramita (n'ọnọdụ anyị, nke a bụ ọkọlọtọ asụsụ C ++) tinyere ebumnuche ndị a.
N'ikpeazụ, anyị na-emepụta ebumnuche dummy, "ewu" nke ya na ule na-agba ọsọ, ma gbakwunye ihe a na-ewu ewu (njirimara ahụ bụ maka nke a). ALL). Nke a pụtara na ihe nrụpụta ndabara na-akpalite ule na-agba ọsọ, nke pụtara na anyị agaghị echefu ịgba ọsọ ha.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Na-esote, anyị na-eme ka nha mkpuchi koodu ma ọ bụrụ na akọwapụtara nhọrọ kwesịrị ekwesị. Agaghị m abanye n'ime nkọwa, n'ihi na ha na-emetụta ngwa ọrụ maka nha mkpuchi karịa CMake. Ọ dị mkpa naanị ịmara na dabere na nsonaazụ a ga-emepụta ihe mgbaru ọsọ coverage, nke ọ dị mma ịmalite ịlele mkpuchi.
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()
Ọzọ, anyị na-elele ma onye ọrụ etinyela mgbanwe asụsụ. Ọ bụrụ ee, mgbe ahụ, anyị anaghị emetụ ya aka, ọ bụrụ na ọ bụghị, mgbe ahụ, anyị na-ewere Russian. Mgbe ahụ, anyị na-ahazi faịlụ usoro Doxygen. Ngbanwe niile dị mkpa, gụnyere asụsụ, na-aga ebe ahụ n'oge nhazi nhazi (lee. команду configure_file).
Mgbe ahụ, anyị na-emepụta ihe mgbaru ọsọ doc, nke ga-amalite ịmepụta akwụkwọ. Ebe ọ bụ na iwepụta akwụkwọ abụghị ihe kacha mkpa na usoro mmepe, a gaghị eme ka ebumnobi pụta na ndabara; a ga-ewepụta ya n'ụzọ doro anya.
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 ()
N'ebe a, anyị na-ahụ Python nke atọ ma mepụta ebumnuche wandbox, nke na-ebute arịrịọ kwekọrọ na API ọrụ ahụ Wandbox, ma zilaga ya. Nzaghachi na-abịa na njikọ nke igbe ájá emechara.
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()
N'ezie, ụdị CMake 3.13 chọrọ naanị iji mee ụfọdụ iwu njikwa akọwara na enyemaka a. Site n'echiche nke syntax nke CMake scripts, ụdị 3.8 zuru ezu ma ọ bụrụ na a na-akpọ ọgbọ n'ụzọ ndị ọzọ.
CMake bụ usoro dị ike ma na-agbanwe agbanwe nke na-enye gị ohere imejuputa ọrụ maka uto na agba ọ bụla. Na, ọ bụ ezie na syntax mgbe ụfọdụ na-ahapụ ọtụtụ ihe a chọrọ, ekwensu ka na-adịghị egwu dị ka ọ na-ese. Jiri CMake wu usoro maka abamuru nke ọha na eze.