
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 a hoʻomaka e hoʻohana.
Nā mea
.
├── CMakeLists.txt
├── README.en.md
├── README.md
├── doc
│ ├── CMakeLists.txt
│ └── Doxyfile.in
├── include
│ └── mylib
│ └── myfeature.hpp
├── online
│ ├── CMakeLists.txt
│ ├── mylib-example.cpp
│ └── wandbox.py
└── test
├── CMakeLists.txt
├── mylib
│ └── myfeature.cpp
└── test_main.cppE 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 .
ʻ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. ).
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.
get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)
E hāʻawi mākou i ʻelua koho.
ʻO ka koho mua - 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ā?
option(MYLIB_TESTING "Включить модульное тестирование" ON)Eia hou, e hana mākou i kahi koho kaʻawale 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.
option(MYLIB_COVERAGE "Включить измерение покрытия кода тестами" OFF)
ʻ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.
add_compile_options(
-Werror
-Wall
-Wextra
-Wpedantic
-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo
)E hoʻopau pū mākou i nā mea hoʻonui i mea e hoʻokō pono ai i ke kūlana ʻōlelo C++. Hoʻohana ʻia lākou ma ka paʻamau ma CMake.
if(NOT CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
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 , 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 .
He mea pono no hoi ka noonoo ana i ka mea i kapaia. .
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 , a laila e hoʻopili ʻia nā poʻomanaʻo mai ka papa kuhikuhi include pili i ka papa kuhikuhi hoʻonoho.
target_include_directories(mylib INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)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. ).
target_compile_features(mylib INTERFACE cxx_std_17)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. .
add_library(Mylib::mylib ALIAS mylib)
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.
install(DIRECTORY include/mylib DESTINATION include)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.
install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)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.
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake"
VERSION
${PROJECT_VERSION}
COMPATIBILITY
AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake" DESTINATION share/Mylib/cmake)
Inā paʻa nā hoʻokolohua me ka hoʻohana 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 , ʻ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()
ʻAʻole e hana ʻia nā palapala i ka hihia o kahi papahana.
if(NOT IS_SUBPROJECT)
add_subdirectory(doc)
endif()
Pēlā nō, ʻaʻole loaʻa i ka subproject kahi pahu one online.
if(NOT IS_SUBPROJECT)
add_subdirectory(online)
endif()
ʻO ka mea mua, ʻike mākou i kahi pūʻolo me ka ʻōnaehana hoʻāʻo e koi ʻia (e hoʻololi me kāu mea punahele).
find_package(doctest 2.3.3 REQUIRED)E hana mākou i kā mākou faila hiki ke hoʻokō me nā hoʻāʻo. Hoʻohui pinepine wau i ka binary executable wale nō ka faila e loaʻa ai ka hana main.
add_executable(mylib-unit-tests test_main.cpp)A hoʻohui au i nā faila i wehewehe ʻia nā hoʻokolohua ma hope. Akā ʻaʻole pono ʻoe e hana pēlā.
target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)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.
target_link_libraries(mylib-unit-tests
PRIVATE
Mylib::mylib
doctest::doctest
)ʻ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 , 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()
.
find_package(Doxygen)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. ).
A laila hana mākou i kahi pahuhopu , 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 , ka mea e hoʻopuka i kahi noi e pili ana i ka API lawelawe , 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()
I kēia manawa, e nānā kākou pehea e hoʻohana ai i kēia mau mea a pau.
ʻO ke kūkulu ʻana i kēia papahana, e like me nā papahana ʻē aʻe ma ka ʻōnaehana kūkulu CMake, ʻelua mau pae:
cmake -S путь/к/исходникам -B путь/к/сборочной/директории [опции ...]Inā ʻaʻole i hana ke kauoha ma luna ma muli o kahi mana kahiko o CMake, e hoʻāʻo e haʻalele
-S:cmake путь/к/исходникам -B путь/к/сборочной/директории [опции ...]
.
cmake --build путь/к/сборочной/директории [--target target].
cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прочие опции ...]Loaʻa i ka pahuhopu , hiki iā ʻoe ke hoʻomaka e ana i ka uhi code ma o nā hoʻokolohua.
cmake -S ... -B ... -DMYLIB_TESTING=OFF [прочие опции ...]Hāʻawi i ka hiki ke hoʻopau i ke kūkulu ʻana a me ka pahu hoʻāʻo ʻāpana . ʻO ka hopena, ua hoʻopau ʻia ke ana o ka uhi code e nā hoʻāʻo (e ʻike. ).
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 .
cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прочие опции ...]Hoʻololi i ka ʻōlelo o ka palapala i hoʻopuka ʻia e ka pahu hopu i ka mea i haawiia. No ka papa inoa o nā ʻōlelo i loaʻa, e ʻike .
Hoʻohana ʻia ʻo Lūkini ma ka paʻamau.
cmake --build path/to/build/directory
cmake --build path/to/build/directory --target allInā ʻaʻole i kuhikuhi ʻia ka pahuhopu (ʻo ia ka mea e like me ka pahuhopu all), hōʻiliʻili i nā mea a pau hiki iā ia, a kāhea pū i ka pahuhopu .
cmake --build path/to/build/directory --target mylib-unit-testsHoʻopili i nā hoʻokolohua ʻāpana. Hoʻohana ʻia e ka paʻamau.
cmake --build путь/к/сборочной/директории --target checkHolo i nā hoʻāʻo ʻāpana i hōʻiliʻili ʻia (i ʻohi ʻia, inā ʻaʻole). Hoʻohana ʻia e ka paʻamau.
E nānā hoʻi .
cmake --build путь/к/сборочной/директории --target coverageNānā i ka holo (holo, inā ʻaʻole i kēia manawa) nā hoʻāʻo ʻāpana no ka uhi code ma o nā hoʻāʻo e hoʻohana ana i ka papahana .
E like me kēia ke ʻano o ka exhaust coating:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp 2 2 100%
------------------------------------------------------------------------------
TOTAL 2 2 100%
------------------------------------------------------------------------------Loaʻa ka pahu hopu inā hiki ke koho .
E nānā hoʻi .
cmake --build путь/к/сборочной/директории --target docHoʻomaka ka hana ʻana i nā palapala code me ka hoʻohana ʻana i ka ʻōnaehana .
cmake --build путь/к/сборочной/директории --target wandboxʻO ka pane mai ka lawelawe e like me kēia:
{
"permlink" : "QElvxuMzHgL9fqci",
"status" : "0",
"url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}Hoʻohana ʻia ka lawelawe no kēia . ʻ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.
E kūkulu i ka papahana ma ke ʻano debug me ke ana uhi
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сборочной/директории --target coverage --parallel 16Ke hoʻouka ʻana i kahi papahana me ka ʻole o ka hui mua ʻana a me ka hoʻāʻo ʻana
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/установойной/директории
cmake --build путь/к/сборочной/директории --target installKūkulu ʻia ma ke ʻano hoʻokuʻu me kahi compiler i hāʻawi ʻia
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/директории/куда/установлены/зависимости
cmake --build путь/к/сборочной/директории --parallel 4Ke hana nei i nā palapala ma ka ʻōlelo Pelekania
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сборочной/директории --target doc
3.13
ʻ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.
Hale waihona hoʻāʻo
Hiki ke hoʻopau ʻia ka hoʻāʻo ʻana (e nānā ).
No ka hoʻololi ʻana i ka ʻōlelo e hana ʻia ai ka palapala, hāʻawi ʻia kahi koho .
Mea unuhi ʻōlelo
No ka hana ʻakomi .
Me CMake a me kekahi mau mea hana maikaʻi, hiki iā ʻoe ke hāʻawi i ka loiloi static me ka hoʻoikaika liʻiliʻi.
Cppcheck
Ua kākoʻo ʻia ʻo CMake no kahi mea hana loiloi static .
No ka hana ʻana i kēia pono ʻoe e hoʻohana i ke koho :
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/исходникам/include"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 Hiki iā ʻoe ke holo i ka loiloi static i ka manawa:
scan-build cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сборочной/директорииEia, ʻaʻole like me ka Cppcheck, pono ʻoe e holo i ke kūkulu ʻana i kēlā me kēia manawa scan-build.
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.
→
Source: www.habr.com
