I ka wā o ka hoʻomohala ʻana, makemake wau e hoʻololi i nā mea hoʻopili, kūkulu i nā ʻano, nā mana hilinaʻi, hana i ka nānā ʻana static, ana i ka hana, hōʻiliʻili i ka uhi, hana i nā palapala, etc. A makemake nui au iā CMake no ka mea hiki iaʻu ke hana i nā mea a pau aʻu e makemake ai.
He nui ka poʻe e hoʻohewa iā CMake, a pono pinepine, akā inā ʻoe e nānā iā ia, ʻaʻole maikaʻi loa nā mea āpau, a i kēia manawa. aole ino loa, a maikaʻi loa ke kuhikuhi o ka hoʻomohala ʻana.
Ma kēia memo, makemake wau e haʻi iā ʻoe pehea e hoʻonohonoho pono ai i kahi waihona poʻomanaʻo ma C ++ i ka ʻōnaehana CMake e kiʻi i kēia mau hana:
Hui;
Nā hoʻokolohua Autorun;
Ana hoʻopili code;
Hoʻokomo;
Palapala-aunoa;
Hoʻokumu ʻia ʻo Sandbox Online;
ʻIkepili paʻa.
ʻO ka mea i hoʻomaopopo mua i nā pono a me C-make hiki ke maʻalahi download template papahana a hoʻomaka e hoʻohana.
E kamaʻilio nui mākou e pili ana i ka hoʻonohonoho ʻana i nā palapala CMake, no laila e kūkākūkā nui ʻia lākou. Hiki i kekahi ke nānā pololei i ke koena o nā faila ma ka ʻaoʻao papahana template.
ʻO ka mea mua, pono ʻoe e noi i ka mana koi o ka ʻōnaehana CMake. Ke ulu nei ʻo CMake, ke hoʻololi nei nā pūlima kauoha a me nā ʻano i nā kūlana like ʻole. I mea e hoʻomaopopo koke ai ʻo CMake i kā mākou makemake mai ia mea, pono mākou e hoʻopaʻa koke i kā mākou mau koi no ia.
cmake_minimum_required(VERSION 3.13)
A laila e koho mākou i kā mākou papahana, kona inoa, ka mana, nā ʻōlelo i hoʻohana ʻia, a pēlā aku. команду project).
Ma kēia hihia, hōʻike mākou i ka ʻōlelo CXX (a ʻo ia hoʻi ʻo C++) i ʻole ʻo CMake e hoʻopaʻa a ʻimi i kahi mea hoʻopili ʻōlelo C (ma ka maʻamau, aia ʻelua ʻōlelo CMake: C a me C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Maanei hiki iā ʻoe ke nānā koke inā ua hoʻokomo ʻia kā mākou papahana i kahi papahana ʻē aʻe ma ke ʻano he subproject. E kōkua nui kēia i ka wā e hiki mai ana.
ʻO ka koho mua MYLIB_TESTING - e hoʻopau i nā hoʻokolohua ʻāpana. Pono paha kēia inā maopopo mākou ua kūpono nā mea a pau me nā hoʻokolohua, akā makemake wale mākou, no ka laʻana, e hoʻokomo a hoʻopaʻa i kā mākou papahana. A i ʻole ua hoʻokomo ʻia kā mākou papahana ma ke ʻano he subproject - i kēia hihia, ʻaʻole makemake ka mea hoʻohana i kā mākou papahana i ka holo ʻana i kā mākou hoʻokolohua. ʻAʻole ʻoe e hoʻāʻo i nā hilinaʻi āu e hoʻohana ai, ʻeā?
Eia hou, e hana mākou i kahi koho kaʻawale MYLIB_COVERAGE no ke ana ʻana i ka uhi code e nā hoʻāʻo, akā pono ia i nā mea hana hou aʻe, no laila pono e ʻae ʻia.
ʻOiaʻiʻo, he mau mea hoʻolalelale a hauʻoli mākou, no laila makemake mākou i ka pae kiʻekiʻe o nā diagnostics compile-time mai ka compiler. ʻAʻole e paheʻe kekahi ʻiole.
He waihona poʻomanaʻo wale nō kā mākou waihona, ʻo ia hoʻi, ʻaʻohe o mākou pau i ke ʻano o nā hale waihona puke paʻa a i ʻole nā hale waihona puke. Ma ka lima ʻē aʻe, i mea e hoʻohana ai i kā mākou waihona ma waho, pono e hoʻokomo ʻia, pono e ʻike ʻia i loko o ka ʻōnaehana a pili i kāu papahana, a ma ka manawa like kēia mau poʻomanaʻo, a me kekahi mau mea hou aʻe. ua pili i na waiwai.
No kēia kumu, hana mākou i kahi waihona waihona.
add_library(mylib INTERFACE)
Hoʻopili mākou i nā poʻomanaʻo i kā mākou waihona kikowaena.
ʻO ka hoʻohana ʻana o CMake i kēia manawa, ʻano ʻōpio, nā poʻo, nā waiwai, etc. hoʻouna ʻia ma o ka pahuhopu hoʻokahi. No laila ua lawa ka ʻōlelo ʻana target_link_libraries(target PRIVATE dependency), a me nā poʻomanaʻo a pau e pili ana i ka pahu hopu dependency, e loaʻa no nā kumu no ka pahuhopu target. A ʻaʻole pono ʻoe i kekahi [target_]include_directories. E hōʻike ʻia kēia ma ka ʻikepili ma lalo nei ʻO ka palapala CMake no nā hoʻokolohua ʻāpana.
Hoʻopili kēia kauoha i nā poʻomanaʻo e pono ai mākou me kā mākou waihona waihona, a inā pili kā mākou waihona i kekahi pahuhopu i loko o ka hierarchy CMake like, a laila e pili pū nā poʻo mai ka papa kuhikuhi me ia. ${CMAKE_CURRENT_SOURCE_DIR}/include, a inā hoʻokomo ʻia kā mākou waihona ma ka ʻōnaehana a pili i kahi papahana ʻē aʻe me ka hoʻohana ʻana i ke kauoha find_package, a laila e hoʻopili ʻia nā poʻomanaʻo mai ka papa kuhikuhi include pili i ka papa kuhikuhi hoʻonoho.
E hoʻonoho kākou i ka pae ʻōlelo. ʻOiaʻiʻo, ka mea hope loa. I ka manawa like, ʻaʻole mākou e hoʻokomo wale i ka maʻamau, akā hoʻonui pū i ka poʻe e hoʻohana i kā mākou waihona. Loaʻa kēia ma muli o ka loaʻa ʻana o ka waiwai i hoʻonohonoho ʻia he ʻāpana INTERFACE (e nānā i para. kauoha target_compile_features).
E hana mākou i inoa inoa no kā mākou waihona. Eia kekahi, no ka nani, aia ia i kahi "namespace" kūikawā. Pono kēia i ka wā e ʻike ʻia ai nā modula like ʻole i loko o kā mākou waihona, a hele mākou e hoʻopili kūʻokoʻa iā lākou. E like me Busta, no ka laʻana.
Ke kau ʻana i kā mākou mau poʻo i loko o ka ʻōnaehana. He mea maʻalahi nā mea a pau maʻaneʻi. 'Ōlelo mākou e hele ka waihona me nā poʻomanaʻo āpau i ka papa kuhikuhi include pili i kahi hoʻokomo.
A laila, hōʻike mākou i ka ʻōnaehana kūkulu e makemake mākou e kāhea i ke kauoha i nā papahana ʻaoʻao ʻekolu find_package(Mylib) a loaʻa kahi pahuhopu Mylib::mylib.
Pono e hoʻomaopopo ʻia ka ʻōlelo aʻe ma kēia ʻano. I ka wā ma kahi papahana ʻaoʻao ʻekolu mākou e kāhea i ke kauoha find_package(Mylib 1.2.3 REQUIRED), a ʻaʻole kūpono ka mana maoli o ka waihona i hoʻokomo ʻia me ka mana 1.2.3E hoʻopuka aunoa ʻo CMake i kahi hewa. ʻO ia hoʻi, ʻaʻole pono ʻoe e hahai i nā mana me ka lima.
Inā paʻa nā hoʻokolohua me ka hoʻohana koho kūpono a i ʻole kā mākou papahana he subproject, ʻo ia hoʻi, pili ia i kahi papahana CMake e hoʻohana ana i ke kauoha add_subdirectory, ʻaʻole mākou e neʻe hou aku ma ka hierarchy, a ʻo ka palapala, e wehewehe ana i nā kauoha no ka hana ʻana a me ka holo ʻana i nā hoʻokolohua, ʻaʻole holo wale.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Hoʻohui mākou i nā hilinaʻi. E ʻoluʻolu e hoʻopili mākou i nā pahuhopu CMake wale nō mākou e pono ai i kā mākou binary a ʻaʻole i kāhea i ke kauoha target_include_directories. Nā poʻomanaʻo mai ka papa hana hoʻāʻo a mai kā mākou Mylib::mylib, a me ke kūkulu ʻana i nā ʻāpana (i kā mākou hihia, ʻo ia ka maʻamau ʻōlelo C++) i hele pū me kēia mau pahuhopu.
ʻO ka hope, hana mākou i kahi pahuhopu dummy, ʻo ka "kūkulu" o ia mea e like me ka holo ʻana i nā hoʻokolohua, a hoʻohui i kēia pahuhopu i ka hale paʻamau (ʻo ke ʻano ke kuleana no kēia. ALL). ʻO kēia ke kumu o ka hana paʻamau e hoʻomaka i nā hoʻāʻo e holo, ʻo ia hoʻi, ʻaʻole loa mākou e poina e holo iā lākou.
add_custom_target(check ALL COMMAND mylib-unit-tests)
A laila, hiki iā mākou ke ana i ka uhi ʻana o ke code inā ʻike ʻia ke koho kūpono. ʻAʻole wau e hele i nā kikoʻī, no ka mea pili lākou i kahi mea hana no ke ana ʻana i ka uhi ma mua o CMake. He mea nui wale nō e hoʻomaopopo ma muli o nā hopena e hana ʻia kahi pahuhopu coverage, me ka maʻalahi o ka hoʻomaka ʻana e ana i ka uhi.
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()
A laila, nānā mākou inā ua hoʻonohonoho ka mea hoʻohana i ka ʻōlelo hoʻololi. Inā ʻae, ʻaʻole mākou e hoʻopā iā ia, inā ʻaʻole, a laila lawe mākou i ka Lūkini. A laila hoʻonohonoho mākou i nā faila ʻōnaehana Doxygen. ʻO nā ʻano like ʻole a pau, me ka ʻōlelo, e hele i laila i ka wā o ke kaʻina hoʻonohonoho (ʻike. команду configure_file).
A laila hana mākou i kahi pahuhopu doc, e hoʻomaka ana e hana i nā palapala. No ka mea, ʻaʻole ʻo ka hoʻokumu ʻana i nā palapala ka mea e pono ai i ke kaʻina hana hoʻomohala, ʻaʻole hiki ke hoʻohana ʻia ka pahuhopu ma ka paʻamau; pono e hoʻokuʻu ʻia.
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 ()
Maanei mākou e ʻike ai i ka Python ʻekolu a hana i kahi pahuhopu wandbox, ka mea e hoʻopuka i kahi noi e pili ana i ka API lawelawe Wadbox, a hookuu aku ia ia. Hiki mai ka pane me kahi loulou i ka pahu one i pau.
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()
Hāʻawi i ka hiki ke hoʻopau i ke kūkulu ʻana a me ka pahu hoʻāʻo ʻāpana check. ʻO ka hopena, ua hoʻopau ʻia ke ana o ka uhi code e nā hoʻāʻo (e ʻike. MYLIB_COVERAGE).
Hoʻopau ʻia ka hoʻāʻo ʻana inā pili ka papahana i kahi papahana ʻē aʻe ma ke ʻano he subproject me ka hoʻohana ʻana i ke kauoha add_subdirectory.
Hoʻololi i ka ʻōlelo o ka palapala i hoʻopuka ʻia e ka pahu hopu doc i ka mea i haawiia. No ka papa inoa o nā ʻōlelo i loaʻa, e ʻike ʻO ka pūnaewele pūnaewele Doxygen.
Hoʻohana ʻia ka lawelawe no kēia Wadbox. ʻAʻole maopopo iaʻu i ka maʻalahi o kā lākou mau kikowaena, akā manaʻo wau ʻaʻole pono e hoʻomāinoino ʻia kēia manawa.
ʻO ka ʻoiaʻiʻo, koi ʻia ka mana CMake 3.13 e holo i kekahi o nā kauoha console i wehewehe ʻia i kēia kōkua. Mai ka manaʻo o ka syntax o nā palapala CMake, lawa ka mana 3.8 inā kāhea ʻia ka hanauna ma nā ʻano ʻē aʻe.
Ma hope o kēia, e hoʻokuʻu ʻia ka loiloi static i kēlā me kēia manawa i hōʻuluʻulu ʻia a hoʻohui hou ʻia ke kumu. ʻAʻohe pono e hana i kekahi mea hou aku.
kani
Me ke kōkua o kahi mea hana kupanaha scan-build Hiki iā ʻoe ke holo i ka loiloi static i ka manawa:
He ʻōnaehana ikaika a maʻalahi ʻo CMake e hiki ai iā ʻoe ke hoʻokō i nā hana no kēlā me kēia ʻono a me nā kala. A, ʻoiai ʻo ka syntax i kekahi manawa e waiho nui i ka makemake, ʻaʻole i weliweli ka diabolo e like me kona pena ʻia. E hoʻohana i ka ʻōnaehana kūkulu CMake no ka pono o ke kaiāulu a me ke olakino.