
Le linn na forbartha, is maith liom tiomsaitheoirí a athrú, modhanna a thógáil, leaganacha spleáchais, anailís statach a dhéanamh, feidhmíocht a thomhas, clúdach a bhailiú, doiciméadú a ghiniúint, etc. Agus is breá liom CMake go mór mar ligeann sé dom gach rud a theastaíonn uaim a dhéanamh.
Tá go leor daoine ag cáineadh CMake, agus is minic a bhíonn sé tuillte acu, ach má fhéachann tú air, níl gach rud chomh dona, agus le déanaí ní dona ar chor ar bith, agus tá treo na forbartha dearfach go leor.
Sa nóta seo, ba mhaith liom a insint duit conas leabharlann ceanntásca a eagrú i C ++ sa chóras CMake chun an fheidhmiúlacht seo a leanas a fháil:
- Tionól;
- tástálacha Autorun;
- Tomhas clúdach cód;
- Suiteáil;
- Doiciméadúchán uathoibríoch;
- Giniúint bosca gainimh ar líne;
- Anailís statach.
Is féidir le duine ar bith a thuigeann cheana féin na buntáistí agus C-dhéanamh go simplí agus tús a úsáid.
Ábhar
.
├── 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.cppDéanfaimid labhairt go príomha faoi conas scripteanna CMake a eagrú, mar sin déanfar iad a phlé go mion. Is féidir le duine ar bith an chuid eile de na comhaid a fheiceáil go díreach .
Ar an gcéad dul síos, ní mór duit an leagan riachtanach den chóras CMake a iarraidh. Tá CMake ag athrú, tá sínithe orduithe agus iompar i gcoinníollacha éagsúla ag athrú. Chun go dtuigfidh CMake láithreach cad ba mhaith linn uaidh, ní mór dúinn ár gceanglais maidir leis a thaifeadadh láithreach.
cmake_minimum_required(VERSION 3.13)Ansin ainmneoimid ár dtionscadal, a ainm, a leagan, na teangacha a úsáidtear, etc. (féach. ).
Sa chás seo cuirimid in iúl an teanga CXX (agus ciallaíonn sé seo C++) ionas nach ndéanann CMake brú agus cuardach a dhéanamh ar tiomsaitheoir teanga C (de réir réamhshocraithe, folaíonn CMake dhá theanga: C agus C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)Anseo, is féidir leat a sheiceáil láithreach an bhfuil ár dtionscadal san áireamh i dtionscadal eile mar fho-thionscadal. Cabhróidh sé seo go leor sa todhchaí.
get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)
Cuirfimid dhá rogha ar fáil.
Is é an chéad rogha — tástálacha aonaid a dhíchumasú. D'fhéadfadh sé seo a bheith riachtanach má táimid cinnte go bhfuil gach rud in ord leis na tástálacha, ach ba mhaith linn ach, mar shampla, ár dtionscadal a shuiteáil nó a phacáistiú. Nó tá ár dtionscadal san áireamh mar fhothionscadal - sa chás seo, níl suim ag úsáideoir ár dtionscadal ár dtástálacha a reáchtáil. Ní dhéanann tú tástáil ar na spleáchais a úsáideann tú, an ndéanann tú?
option(MYLIB_TESTING "Включить модульное тестирование" ON)Ina theannta sin, déanfaimid rogha ar leithligh chun cumhdach cód a thomhas trí thástálacha, ach beidh gá le huirlisí breise, mar sin beidh gá é a chumasú go sainráite.
option(MYLIB_COVERAGE "Включить измерение покрытия кода тестами" OFF)
Ar ndóigh, is ríomhchláraitheoirí móide fionnuar muid, agus mar sin ba mhaith linn an leibhéal uasta diagnóisic ama tiomsaithe ón tiomsaitheoir. Ní sleamhnóidh luch amháin tríd.
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
)Déanfaimid síntí a dhíchumasú freisin chun an caighdeán teanga C++ a chomhlíonadh go hiomlán. Tá siad cumasaithe de réir réamhshocraithe i CMake.
if(NOT CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
Níl sa leabharlann seo ach comhaid cheanntásc, rud a chiallaíonn nach bhfuil aon sceite againn i bhfoirm leabharlanna statacha nó dinimiciúla. Ar an láimh eile, chun ár leabharlann a úsáid go seachtrach, ní mór í a shuiteáil, ní mór é a bheith inbhraite sa chóras agus ceangailte le do thionscadal, agus ag an am céanna na ceannteidil chéanna seo, chomh maith le roinnt cinn breise b'fhéidir, ag gabháil leis airíonna.
Chun na críche sin, cruthaímid leabharlann comhéadan.
add_library(mylib INTERFACE)Ceanglaíonn muid ceanntásca lenár leabharlann comhéadain.
Tugann úsáid nua-aimseartha, faiseanta, óige CMake le tuiscint go bhfuil ceanntásca, airíonna, etc. a tharchur trí aon sprioc amháin. Mar sin is leor é a rá , agus gach ceanntásc a bhaineann leis an sprioc dependency, ar fáil d'fhoinsí a bhaineann leis an sprioc target. Agus ní gá duit aon [target_]include_directories. Léireofar é seo thíos san anailís .
Is fiú aird a thabhairt freisin ar an mar a thugtar air. .
Comhcheanglaíonn an t-ordú seo na ceanntásca a theastaíonn uainn lenár leabharlann comhéadain, agus má tá ár leabharlann ceangailte le haon sprioc laistigh den ordlathas CMake céanna, beidh na ceanntásca ón eolaire comhcheangailte leis ${CMAKE_CURRENT_SOURCE_DIR}/include, agus má tá ár leabharlann suiteáilte ar an gcóras agus ceangailte le tionscadal eile ag baint úsáide as an ordú , ansin beidh ceanntásca ón eolaire bainteach leis include i gcoibhneas leis an eolaire suiteála.
target_include_directories(mylib INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)Déanaimis caighdeán teanga a shocrú. Ar ndóigh, an ceann deireanach. Ag an am céanna, ní hamháin go gcuirfimid an caighdeán san áireamh, ach leathaimid freisin é dóibh siúd a úsáidfidh ár leabharlann. Baintear é seo amach mar gheall ar an bhfíric go bhfuil catagóir ag an maoin socraithe INTERFACE (Féach ).
target_compile_features(mylib INTERFACE cxx_std_17)Cruthaímid ailias dár leabharlann. Ina theannta sin, ar mhaithe le háilleacht, beidh sé i “spás ainm” speisialta. Beidh sé seo úsáideach nuair a bhíonn modúil éagsúla le feiceáil inár leabharlann, agus téann muid chun iad a nascadh go neamhspleách ar a chéile. .
add_library(Mylib::mylib ALIAS mylib)
Ár gceanntásca a shuiteáil isteach sa chóras. Tá gach rud simplí anseo. Deirimid gur chóir an fillteán leis na ceanntásca go léir dul isteach san eolaire include i gcoibhneas leis an suíomh suiteála.
install(DIRECTORY include/mylib DESTINATION include)Ansin, cuirimid in iúl don chóras tógála gur mhaith linn a bheith in ann an t-ordú a ghlaoch i dtionscadail tríú páirtí find_package(Mylib) agus sprioc a fháil Mylib::mylib.
install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)Ba cheart an chéad litriú eile a thuiscint mar seo. Nuair atá i dtionscadal tríú páirtí tugaimid an t-ordú find_package(Mylib 1.2.3 REQUIRED), agus beidh an leagan fíor den leabharlann suiteáilte ar neamhréir leis an leagan 1.2.3Ginfidh CMake earráid go huathoibríoch. Is é sin, ní bheidh ort a rianú leaganacha de láimh.
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)
Má tá tástálacha díchumasaithe go sainráite ag baint úsáide as nó is fothionscadal é ár dtionscadal, is é sin, tá sé ceangailte le tionscadal CMake eile ag baint úsáide as an ordú , ní bhogaimid níos faide ar feadh an ordlathais, agus ní ritheann an script, a chuireann síos ar na horduithe le haghaidh tástálacha a ghiniúint agus a rith.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
Ní ghinfear doiciméadú ach oiread i gcás fothionscadail.
if(NOT IS_SUBPROJECT)
add_subdirectory(doc)
endif()
Mar an gcéanna, ní bheidh bosca gainimh ar líne ag an bhfothionscadal ach an oiread.
if(NOT IS_SUBPROJECT)
add_subdirectory(online)
endif()
Ar an gcéad dul síos, aimsímid pacáiste leis an gcreat tástála riachtanach (cuir an ceann is fearr leat in ionad).
find_package(doctest 2.3.3 REQUIRED)Cruthaímid ár gcomhad inrite le tástálacha. De ghnáth ní chuirim go díreach leis an dénártha inrite ach an comhad a mbeidh an fheidhm ann main.
add_executable(mylib-unit-tests test_main.cpp)Agus cuirim comhaid isteach ina ndéantar cur síos ar na tástálacha féin níos déanaí. Ach ní gá duit é sin a dhéanamh.
target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)Ceanglaíonn muid spleáchais. Tabhair faoi deara le do thoil nach ndearnamar ach na spriocanna CMake a theastaigh uainn a nascadh lenár ndénártha agus nár ghlaoigh muid an t-ordú target_include_directories. Ceannteidil ón gcreat tástála agus ónár gceann Mylib::mylib, chomh maith le paraiméadair a thógáil (inár gcás, is é seo an caighdeán teanga C ++) a tháinig tríd chomh maith leis na spriocanna seo.
target_link_libraries(mylib-unit-tests
PRIVATE
Mylib::mylib
doctest::doctest
)Mar fhocal scoir, cruthaímid sprioc chaochadán, a bhfuil a “thógáil” comhionann le tástálacha a rith, agus cuirimid an sprioc seo leis an leagan réamhshocraithe (tá an aitreabúid freagrach as seo ALL). Ciallaíonn sé seo go spreagann an tógáil réamhshocraithe na tástálacha a rith, rud a chiallaíonn nach ndéanfaimid dearmad choíche iad a rith.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Ansin, cuirimid ar chumas tomhas clúdach cód má shonraítear an rogha chuí. Ní dhéanfaidh mé sonraí, toisc go mbaineann siad níos mó le huirlis chun clúdach a thomhas ná le CMake. Níl sé tábhachtach ach a thabhairt faoi deara go gcruthófar sprioc bunaithe ar na torthaí , a bhfuil sé áisiúil clúdach a thomhas a thosú.
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)Ansin, déanaimid seiceáil an bhfuil an athróg teanga socraithe ag an úsáideoir. Má tá, ansin ní dhéanaimid teagmháil leis, mura bhfuil, glacaimid Rúisis. Ansin déanaimid comhaid an chórais Doxygen a chumrú. Téann na hathróga riachtanacha go léir, lena n-áirítear an teanga, ann le linn an phróisis chumraíochta (féach. ).
Ansin cruthaímid sprioc , a chuirfidh tús le doiciméid a ghiniúint. Ós rud é nach é giniúint doiciméadaithe an riachtanas is mó sa phróiseas forbartha, ní bheidh an sprioc cumasaithe de réir réamhshocraithe;
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 ()
Anseo aimsímid an tríú Python agus cruthaítear sprioc , a ghineann iarratas a fhreagraíonn don API seirbhíse , agus cuireann sé uaidh é. Tagann an freagra le nasc chuig an bosca gainimh críochnaithe.
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()
Anois, déanaimis féachaint ar conas é seo go léir a úsáid.
Tá dhá chéim i dtógáil an tionscadail seo, cosúil le haon tionscadal eile ar chóras tógála CMake:
cmake -S путь/к/исходникам -B путь/к/сборочной/директории [опции ...]Murar oibrigh an t-ordú thuas mar gheall ar sheanleagan de CMake, déan iarracht é a fhágáil ar lár
-S:cmake путь/к/исходникам -B путь/к/сборочной/директории [опции ...]
.
cmake --build путь/к/сборочной/директории [--target target].
cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прочие опции ...]Áirítear sprioc , leis ar féidir leat tosú ag tomhas clúdach cód le tástálacha.
cmake -S ... -B ... -DMYLIB_TESTING=OFF [прочие опции ...]Soláthraíonn sé an cumas tógáil tástála aonad agus spriocdhíriú a dhíchumasú . Mar thoradh air sin, déantar tomhas clúdach cód de réir tástálacha a mhúchadh (féach. ).
Déantar tástáil a dhíchumasú go huathoibríoch freisin má tá an tionscadal ceangailte le tionscadal eile mar fhothionscadail ag baint úsáide as an ordú .
cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прочие опции ...]Aistríonn sé teanga an doiciméid a ghineann an sprioc don cheann tugtha. Le haghaidh liosta de na teangacha atá ar fáil, féach .
Tá Rúisis cumasaithe de réir réamhshocraithe.
cmake --build path/to/build/directory
cmake --build path/to/build/directory --target allMura bhfuil an sprioc sonraithe (atá comhionann leis an sprioc all), bailíonn sé gach rud is féidir, agus glaonna ar an sprioc freisin .
cmake --build path/to/build/directory --target mylib-unit-testsTiomsaíonn tástálacha aonaid. Cumasaithe de réir réamhshocraithe.
cmake --build путь/к/сборочной/директории --target checkRitheann na tástálacha aonaid bailithe (bailithe, mura bhfuil cheana). Cumasaithe de réir réamhshocraithe.
См. также .
cmake --build путь/к/сборочной/директории --target coverageAnailís a dhéanamh ar thástálacha aonaid a rith (ritheann, mura bhfuil cheana) le haghaidh clúdach cód trí thástálacha a úsáideann an clár .
Breathnóidh an sciath sceite rud éigin mar seo:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp 2 2 100%
------------------------------------------------------------------------------
TOTAL 2 2 100%
------------------------------------------------------------------------------Níl an sprioc ar fáil ach amháin nuair a bhíonn an rogha cumasaithe .
См. также .
cmake --build путь/к/сборочной/директории --target docTosaíonn giniúint doiciméadú cód ag baint úsáide as an gcóras .
cmake --build путь/к/сборочной/директории --target wandboxBreathnaíonn an freagra ón tseirbhís rud éigin mar seo:
{
"permlink" : "QElvxuMzHgL9fqci",
"status" : "0",
"url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}Úsáidtear an tseirbhís chuige seo . Níl a fhios agam cé chomh solúbtha agus atá a gcuid freastalaithe, ach is dóigh liom nár cheart an deis seo a úsáid.
Tóg an tionscadal i mód dífhabhtaithe le tomhas clúdach
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сборочной/директории --target coverage --parallel 16Tionscadal a shuiteáil gan réamhthionól agus tástáil
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/установойной/директории
cmake --build путь/к/сборочной/директории --target installTóg i mód scaoileadh le tiomsaitheoir ar leith
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/директории/куда/установлены/зависимости
cmake --build путь/к/сборочной/директории --parallel 4Doiciméid a ghiniúint i mbéarla
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сборочной/директории --target doc
3.13
Go deimhin, níl ach leagan CMake 3.13 ag teastáil chun cuid de na horduithe consól a thuairiscítear sa chabhair seo a rith. Ó thaobh chomhréir na scripteanna CMake de, is leor leagan 3.8 má thugtar giniúint ar bhealaí eile.
Leabharlann tástála
Is féidir tástáil a dhíchumasú (féach ).
Chun an teanga ina gineadh an doiciméadú a athrú, cuirtear rogha ar fáil .
Ateangaire teanga
Le haghaidh giniúna uathoibríoch .
Le CMake agus cúpla dea-uirlisí, is féidir leat anailís statach a sholáthar gan mórán iarrachta.
Seiceáil cpp
Tá tacaíocht ionsuite ag CMake d'uirlis anailíse statach .
Chun seo a dhéanamh ní mór duit an rogha a úsáid :
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/исходникам/include"Tar éis seo, seolfar anailís statach go huathoibríoch gach uair a dhéantar an fhoinse a thiomsú agus a ath-thiomsú. Ní gá aon rud breise a dhéanamh.
Clag
Le cabhair ó uirlis iontach Is féidir leat anailís statach a rith in am ar bith freisin:
scan-build cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сборочной/директорииAnseo, murab ionann agus an cás le Cppcheck, ní mór duit an tógáil a reáchtáil gach uair tríd scan-build.
Is córas an-chumhachtach agus solúbtha é CMake a ligeann duit feidhmiúlacht a chur i bhfeidhm do gach blas agus dath. Agus, cé go bhfágann an chomhréir mórán le bheith inmhianaithe uaireanta, níl an diabhal fós chomh uafásach agus atá sé péinteáilte. Bain úsáid as an gcóras tógála CMake ar mhaithe leis an tsochaí agus leis an tsláinte.
→
Foinse: will.com
