I te wa o te whakawhanaketanga, he pai ki ahau te whakarereke i nga kaitoi, te hanga tikanga, nga putanga whakawhirinaki, te mahi tātari pateko, te ine mahi, te kohi kapi, te whakaputa tuhinga, aha atu. A ka tino aroha ahau ki a CMake na te mea ka taea e au te mahi i nga mea katoa e hiahia ana ahau.
He maha nga tangata e whakahee ana i a CMake, he maha nga wa e tika ana, engari mena ka tirohia e koe, ehara nga mea katoa i te kino rawa atu, a tata nei. karekau he kino, a he tino pai te ahunga o te whanaketanga.
I roto i tenei tuhipoka, e hiahia ana ahau ki te korero ki a koe me pehea te whakarite noa i te whare pukapuka pane i roto i te C++ i roto i te punaha CMake ki te tiki i nga mahi e whai ake nei:
Huihuinga;
Nga whakamatautau autorun;
Te inenga o te kapi waehere;
Tāutatanga;
Tuhituhi-aunoa;
Te hanga pouaka kirikiri ipurangi;
Te tātari pateko.
Ko te tangata e mohio ana ki nga painga me te C-make ka taea noa tikiake tauira kaupapa ka timata ki te whakamahi.
Ko te nuinga ka korerohia me pehea te whakariterite i nga tuhinga CMake, na reira ka korerohia nga korero. Ka taea e te tangata te tiro tika ki te toenga o nga konae i te wharangi kaupapa tauira.
Tuatahi, me tono koe i te putanga e hiahiatia ana o te punaha CMake. Kei te tipu haere a CMake, kei te huri nga hainatanga whakahau me nga whanonga i roto i nga ahuatanga rereke. Kia mohio ai a CMake ki ta tatou e hiahia ana mai i a ia, me tuhi tonu i a tatou whakaritenga mo taua mea.
cmake_minimum_required(VERSION 3.13)
Na ka tohua to maatau kaupapa, tona ingoa, putanga, reo whakamahia, aha atu (tirohia. команду project).
I tenei keehi ka tohuhia te reo CXX (a ko te tikanga tenei ko C++) kia kore ai a CMake e whakararu me te rapu mo te kaitoi reo C (ma te taunoa, kei roto i a CMake nga reo e rua: C me C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
I konei ka taea e koe te tirotiro tonu mena kua whakauruhia to maatau kaupapa ki tetahi atu kaupapa hei kaupapa iti. Ka awhina nui tenei i nga wa kei te heke mai.
Ko te kōwhiringa tuatahi MYLIB_TESTING — ki te whakakore i nga whakamatautau wae. Ka tika pea tenei mena ka mohio tatou kei te pai nga mea katoa me nga whakamatautau, engari ko te hiahia anake, hei tauira, ki te whakauru, ki te whakaemi ranei i ta maatau kaupapa. Ko ta maatau kaupapa ranei kua whakauruhia hei kaupapa iti - i tenei keehi, kaore te kaiwhakamahi o ta maatau kaupapa e aro ki te whakahaere i o maatau whakamatautau. Kaore koe e whakamatautau i nga whakawhirinaki e whakamahia ana e koe?
I tua atu, ka mahia e matou he waahanga motuhake MYLIB_COVERAGE mo te ine i te kapinga waehere ma nga whakamatautau, engari me whai taputapu taapiri, no reira me tino whakahoehia.
Ae ra, he hauhautanga matou me nga kaihōtaka, no reira kei te pirangi matou ki te taumata teitei o nga tātaritanga-wa-whakahiato mai i te kaitoi. E kore tetahi kiore e paheke.
Kei roto noa i ta maatau whare pukapuka nga konae pane, ko te tikanga karekau he ruha i te ahua o nga whare pukapuka pateko, hihiri ranei. I tetahi atu taha, mo te whakamahi i to maatau whare pukapuka ki waho, me whakauru, me kitea i roto i te punaha me te hono atu ki to kaupapa, i te wa ano ko enei pane, me etahi atu taapiri, e piri ana ki ona taonga.
Mo tenei kaupapa, ka hangaia e matou he whare pukapuka atanga.
add_library(mylib INTERFACE)
Ka herea e matou nga pane ki to matou puna atanga.
Ko te whakamahinga hou, huatau, taiohi o CMake e kii ana ko nga pane, taonga, aha atu. ka tukuna ma te kaupapa kotahi. Heoi ano te korero target_link_libraries(target PRIVATE dependency), me nga pane katoa e hono ana ki te whaainga dependency, ka watea mai mo nga puna korero no te whaainga target. A kaore koe e hiahia [target_]include_directories. Ka whakaatuhia tenei i raro i te tātaritanga CMake tuhinga mo nga whakamatautau wae.
Ka hono tenei whakahau i nga pane e hiahiatia ana e matou ki to maatau whare pukapuka atanga, a ki te hono to maatau whare pukapuka ki tetahi whaainga i roto i te hierarchy CMake kotahi, ka hono nga pane mai i te whaiaronga ki tera. ${CMAKE_CURRENT_SOURCE_DIR}/include, a ki te whakauruhia to maatau whare pukapuka ki runga i te punaha ka hono atu ki tetahi atu kaupapa ma te whakamahi i te whakahau find_package, ka hono nga pane mai i te whaiaronga ki taua mea include e pa ana ki te whaiaronga whakaurunga.
Me whakatakoto he paerewa reo. Ko te tikanga, ko te mea whakamutunga. I te wa ano, ehara i te mea ka whakauru noa i te paerewa, engari ka toro atu ki te hunga ka whakamahi i to maatau whare pukapuka. Ka tutuki tenei na te mea he waahanga te taonga kua whakaritea INTERFACE (tirohia para. target_compile_features whakahau).
Me hanga he ingoa ingoa mo to tatou whare pukapuka. Ano, mo te ataahua, ka waiho i roto i te "mokowā ingoa" motuhake. Ka whai hua tenei ina puta mai nga momo waahanga rereke i roto i to maatau whare pukapuka, a ka haere tatou ki te hono takitahi tetahi ki tetahi. Ka rite ki a Busta, hei tauira.
Te whakauru i o maatau pane ki roto i te punaha. He ngawari nga mea katoa i konei. E kii ana matou me uru te kōpaki me nga pane katoa ki roto i te raarangi include e pa ana ki te waahi whakaurunga.
I muri mai, ka whakamohiohia e matou te punaha hanga e hiahia ana matou ki te karanga i te whakahau i roto i nga kaupapa tuatoru find_package(Mylib) ka whiwhi whainga Mylib::mylib.
Ko te tikanga o muri mai me maarama penei. A, no te i roto i te kaupapa tuatoru-rōpū karanga matou te whakahau find_package(Mylib 1.2.3 REQUIRED), a ko te tino putanga o te whare pukapuka kua whakauruhia ka kore e hototahi ki te putanga 1.2.3Ka whakaputa aunoa a CMake i te hapa. Arā, karekau koe e whai ki te whai a ringa i nga putanga.
Mena kua monoa nga whakamatautau ma te whakamahi kōwhiringa hāngai ko to maatau kaupapa he kaupapa iti, ara, he hono ki tetahi atu kaupapa CMake ma te whakamahi i te whakahau add_subdirectory, kaore matou e neke atu i runga i te hierarchy, me te tuhinga, e whakaatu ana i nga whakahau mo te whakaputa me te whakahaere i nga whakamatautau, kaore i te rere.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Tuatahi, ka kitea e matou he kete me te anga whakamatautau e hiahiatia ana (whakakapi ki to tino pai).
find_package(doctest 2.3.3 REQUIRED)
Me hanga to tatou konae kawe me nga whakamatautau. I te nuinga o te wa ka taapiri tika ahau ki te rua ka taea te whakahaere ko te konae kei roto te mahi main.
add_executable(mylib-unit-tests test_main.cpp)
Na ka taapirihia e au nga konae kei te whakaahuahia nga whakamatautau i muri mai. Engari kaore koe e mahi i tera.
Ka hono tatou i nga whakawhirinaki. Kia mahara mai i honoa e matou nga whaainga CMake anake e hiahiatia ana e matou ki to maatau rua, kaore i karangahia te whakahau target_include_directories. Nga upoko mai i te anga whakamatautau me ta maatau Mylib::mylib, me te hanga tawhā (i roto i a maatau, ko te paerewa reo C++ tenei) i tae mai me enei whainga.
Ka mutu, ka hangahia e matou he piro hangarua, ko te "hanga" he rite ki te whakahaere i nga whakamatautau, ka taapirihia tenei whaainga ki te hanga taunoa (ko te huanga te kawenga mo tenei ALL). Ko te tikanga ko te hanga taunoa ka tiimata nga whakamatautau kia rere, ko te tikanga kare rawa tatou e wareware ki te whakahaere.
add_custom_target(check ALL COMMAND mylib-unit-tests)
I muri mai, ka taea e matou te ine ine kapitanga waehere mena ka tohua te whiringa tika. E kore ahau e haere ki nga korero, na te mea e pa ana ki tetahi taputapu mo te ine i te kapinga atu i te CMake. He mea nui anake kia mohiohia i runga i nga hua ka hangaia he whainga coverage, he pai ki te timata ki te ine i te kapi.
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()
Whai muri, ka tirohia mena kua tautuhia e te kaiwhakamahi te taurangi reo. Mena ae, kaore matou e pa ki a ia, ki te kore, ka tango matou i te Russian. Na ka whirihorahia e matou nga konae punaha Doxygen. Ko nga taurangi katoa e tika ana, tae atu ki te reo, haere ki reira i te wa o te whirihoranga (tirohia. команду configure_file).
Na ka hanga e matou he whainga doc, ka timata te whakaputa tuhinga. I te mea ehara i te mea ko te whakaputa tuhinga te hiahia nui rawa atu i roto i te tukanga whanaketanga, karekau e taea te whainga ma te taunoa; me tino whakarewahia.
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 ()
I konei ka kitea te tuatoru o te Python me te hanga i tetahi whaainga wandbox, ka puta he tono e rite ana ki te API ratonga Pouaka toka, a tonoa atu ana ia. Ka tae mai te whakautu me te hono ki te pouaka kirikiri kua oti.
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()
Ka whakarato i te kaha ki te whakakore i te hanga whakamatautau me te whaainga check. Ko te mutunga, ka wetohia te inenga o te kapi waehere ma nga whakamatautau (tirohia. MYLIB_COVERAGE).
Ka monokia aunoatia te whakamatautau mena ka hono te kaupapa ki tetahi atu kaupapa hei kaupapa iti ma te whakamahi i te whakahau add_subdirectory.
Ka huri i te reo o nga tuhinga ka mahia e te whaainga doc ki te mea kua hoatu. Mo te rarangi o nga reo e waatea ana, tirohia pae tukutuku Doxygen System.
Ka whakamahia te ratonga mo tenei Pouaka toka. Kaore au e mohio he pehea te ngawari o o raatau kaitoro, engari ki taku whakaaro kia kaua e tukinotia tenei waahi.
Ko te tikanga, ko te putanga CMake 3.13 anake e hiahiatia ana hei whakahaere i etahi o nga whakahau papatohu e whakaahuatia ana i roto i tenei awhina. Mai i te tirohanga o te wetereo o nga tuhinga CMake, he ranea te putanga 3.8 mena ka karangahia te reanga ki etahi atu huarahi.
Whai muri i tenei, ka whakarewahia aunoatia te wetewete i nga wa katoa ka whakahiatohia, ka whakahiatotia ano te puna. Kaore he take ki te mahi i tetahi mea taapiri.
Ngatata
Ma te awhina o tetahi taputapu whakamiharo scan-build Ka taea hoki e koe te whakahaere tātaritanga pateko i roto i te wa poto:
Ko te CMake he punaha tino kaha me te ngawari e taea ai e koe te whakatinana i nga mahi mo ia reka me nga tae. Na, ahakoa he maha nga wa ka waiho e te syntax nga mea e hiahiatia ana, kaore ano te rewera i te tino whakamataku pera i tana peita. Whakamahia te punaha hanga CMake mo te painga o te hapori me te hauora.