Yn ystod y datblygiad, rwy'n hoffi newid casglwyr, adeiladu moddau, fersiynau dibyniaeth, perfformio dadansoddiad statig, mesur perfformiad, casglu sylw, cynhyrchu dogfennaeth, ac ati. Ac rydw i wir yn caru CMake oherwydd mae'n caniatΓ‘u i mi wneud popeth rydw i eisiau.
Mae llawer o bobl yn beirniadu CMake, ac yn aml yn haeddiannol, ond os edrychwch arno, nid yw popeth mor ddrwg, ac yn ddiweddar ddim yn ddrwg o gwbl, ac mae cyfeiriad y datblygiad yn eithaf cadarnhaol.
Yn y nodyn hwn, rwyf am ddweud wrthych sut i drefnu llyfrgell pennawd yn C ++ yn system CMake i gael y swyddogaeth ganlynol:
Cynulliad;
Profion Autorun;
Mesur cwmpas y cod;
Gosod;
Auto-dogfennaeth;
Cynhyrchu blychau tywod ar-lein;
Dadansoddiad statig.
Gall unrhyw un sydd eisoes yn deall y manteision a C-wneud yn syml lawrlwytho templed prosiect a dechrau ei ddefnyddio.
Byddwn yn siarad yn bennaf am sut i drefnu sgriptiau CMake, felly byddant yn cael eu trafod yn fanwl. Gall unrhyw un weld gweddill y ffeiliau yn uniongyrchol ar dudalen templed y prosiect.
Yn gyntaf oll, mae angen i chi ofyn am y fersiwn ofynnol o'r system CMake. Mae CMake yn esblygu, mae llofnodion gorchymyn ac ymddygiad o dan amodau gwahanol yn newid. Er mwyn i CMake ddeall ar unwaith yr hyn yr ydym ei eisiau ganddo, mae angen inni gofnodi ein gofynion ar ei gyfer ar unwaith.
cmake_minimum_required(VERSION 3.13)
Yna byddwn yn dynodi ein prosiect, ei enw, fersiwn, yr ieithoedd a ddefnyddir, ac ati (gweler. ΠΊΠΎΠΌΠ°Π½Π΄Ρ project).
Yn yr achos hwn rydym yn nodi'r iaith CXX (ac mae hyn yn golygu C++) fel nad yw CMake yn straen ac yn chwilio am gasglwr iaith C (yn ddiofyn, mae CMake yn cynnwys dwy iaith: C a C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Yma gallwch wirio ar unwaith a yw ein prosiect wedi'i gynnwys mewn prosiect arall fel is-brosiect. Bydd hyn yn helpu llawer yn y dyfodol.
Yr opsiwn cyntaf yw MYLIB_TESTING β analluogi profion uned. Efallai y bydd hyn yn angenrheidiol os ydym yn siΕ΅r bod popeth mewn trefn gyda'r profion, ond dim ond, er enghraifft, yr ydym am osod neu becynnu ein prosiect. Neu mae ein prosiect wedi'i gynnwys fel is-brosiect - yn yr achos hwn, nid oes gan ddefnyddiwr ein prosiect ddiddordeb mewn rhedeg ein profion. Nid ydych chi'n profi'r dibyniaethau rydych chi'n eu defnyddio, ydych chi?
Yn ogystal, byddwn yn gwneud opsiwn ar wahΓ’n MYLIB_COVERAGE ar gyfer mesur cwmpas cod gan brofion, ond bydd angen offer ychwanegol, felly bydd angen ei alluogi'n benodol.
Wrth gwrs, rydym yn rhaglenwyr cΕ΅l a mwy, felly rydym am gael y lefel uchaf o ddiagnosteg amser llunio gan y casglwr. Ni fydd un llygoden yn llithro drwodd.
Mae ein llyfrgell yn cynnwys ffeiliau pennawd yn unig, sy'n golygu nad oes gennym unrhyw bibell wacΓ‘u ar ffurf llyfrgelloedd statig neu ddeinamig. Ar y llaw arall, er mwyn defnyddio ein llyfrgell yn allanol, mae angen ei osod, mae angen ei ganfod yn y system a'i gysylltu Γ’'ch prosiect, ac ar yr un pryd yr un penawdau hyn, yn ogystal Γ’ rhai ychwanegol o bosibl, ynghlwm wrth ei eiddo.
At y diben hwn, rydym yn creu llyfrgell rhyngwyneb.
add_library(mylib INTERFACE)
Rydym yn rhwymo penawdau i'n llyfrgell rhyngwyneb.
Mae defnydd modern, ffasiynol, ieuenctid o CMake yn awgrymu bod penawdau, priodweddau, ac ati. yn cael ei drosglwyddo drwy un targed unigol. Digon yw dweud target_link_libraries(target PRIVATE dependency), a'r holl benawdau sy'n gysylltiedig Γ’'r targed dependency, ar gael ar gyfer ffynonellau sy'n perthyn i'r targed target. Ac nid oes angen unrhyw un arnoch chi [target_]include_directories. Bydd hyn yn cael ei ddangos isod yn y dadansoddiad Sgript CMake ar gyfer profion uned.
Mae'r gorchymyn hwn yn cysylltu'r penawdau sydd eu hangen arnom Γ’'n llyfrgell rhyngwyneb, ac os yw ein llyfrgell wedi'i chysylltu ag unrhyw darged o fewn yr un hierarchaeth CMake, yna bydd y penawdau o'r cyfeiriadur yn gysylltiedig ag ef ${CMAKE_CURRENT_SOURCE_DIR}/include, ac os yw ein llyfrgell wedi'i gosod ar y system ac wedi'i chysylltu Γ’ phrosiect arall gan ddefnyddio'r gorchymyn find_package, yna bydd penawdau o'r cyfeiriadur yn gysylltiedig ag ef include mewn perthynas Γ’'r cyfeiriadur gosod.
Gadewch i ni osod safon iaith. Wrth gwrs, yr un olaf un. Ar yr un pryd, rydym nid yn unig yn cynnwys y safon, ond hefyd yn ei ymestyn i'r rhai a fydd yn defnyddio ein llyfrgell. Cyflawnir hyn oherwydd bod gan yr eiddo gosod gategori INTERFACE (gw gorchymyn target_compile_features).
Gadewch i ni greu alias ar gyfer ein llyfrgell. Ar ben hynny, ar gyfer harddwch, bydd mewn βgofod enwauβ arbennig. Bydd hyn yn ddefnyddiol pan fydd gwahanol fodiwlau yn ymddangos yn ein llyfrgell, ac rydym yn mynd i'w cysylltu yn annibynnol ar ei gilydd. Fel yn Busta, er enghraifft.
Gosod ein penawdau yn y system. Mae popeth yn syml yma. Rydyn ni'n dweud y dylai'r ffolder gyda'r penawdau i gyd fynd i'r cyfeiriadur include mewn perthynas Γ’'r lleoliad gosod.
Dylid deall y sillafu nesaf fel hyn. Pan mewn prosiect trydydd parti rydym yn galw'r gorchymyn find_package(Mylib 1.2.3 REQUIRED), a bydd y fersiwn go iawn o'r llyfrgell osod yn anghydnaws Γ’'r fersiwn 1.2.3Bydd CMake yn cynhyrchu gwall yn awtomatig. Hynny yw, ni fydd angen i chi olrhain fersiynau Γ’ llaw.
Os yw profion wedi'u hanalluogi'n benodol gan ddefnyddio opsiwn cyfatebol neu mae ein prosiect yn is-brosiect, hynny yw, mae'n gysylltiedig Γ’ phrosiect CMake arall gan ddefnyddio'r gorchymyn add_subdirectory, nid ydym yn symud ymhellach ar hyd yr hierarchaeth, ac nid yw'r sgript, sy'n disgrifio'r gorchmynion ar gyfer cynhyrchu a rhedeg profion, yn rhedeg yn syml.
Yn gyntaf oll, rydym yn dod o hyd i becyn gyda'r fframwaith prawf gofynnol (amnewid gyda'ch hoff un).
find_package(doctest 2.3.3 REQUIRED)
Gadewch i ni greu ein ffeil gweithredadwy gyda phrofion. Fel arfer rwy'n ychwanegu'n uniongyrchol at y deuaidd gweithredadwy dim ond y ffeil a fydd yn cynnwys y swyddogaeth main.
add_executable(mylib-unit-tests test_main.cpp)
Ac rwy'n ychwanegu ffeiliau lle disgrifir y profion eu hunain yn ddiweddarach. Ond does dim rhaid i chi wneud hynny.
Rydym yn cysylltu dibyniaethau. Sylwch ein bod wedi cysylltu'r targedau CMake yr oedd eu hangen arnom Γ’'n deuaidd yn unig ac ni wnaethom alw'r gorchymyn target_include_directories. Penawdau o'r fframwaith prawf ac o'n un ni Mylib::mylib, yn ogystal Γ’ pharamedrau adeiladu (yn ein hachos ni, dyma'r safon iaith C ++) a ddaeth drwodd ynghyd Γ’'r nodau hyn.
Yn olaf, rydym yn creu targed ffug, y mae ei βadeiladuβ yn cyfateb i redeg profion, ac yn ychwanegu'r targed hwn at y gosodiad rhagosodedig (y nodwedd sy'n gyfrifol am hyn ALL). Mae hyn yn golygu bod y gosodiad rhagosodedig yn sbarduno'r profion i redeg, sy'n golygu na fyddwn byth yn anghofio eu rhedeg.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Nesaf, rydym yn galluogi mesur cwmpas cod os nodir yr opsiwn priodol. Nid af i fanylion, oherwydd maent yn ymwneud yn fwy ag offeryn ar gyfer mesur cwmpas nag Γ’ CMake. Mae'n bwysig nodi y bydd nod yn cael ei greu ar sail y canlyniadau coverage, y mae'n gyfleus i ddechrau mesur sylw.
Nesaf, rydym yn gwirio a yw'r defnyddiwr wedi gosod y newidyn iaith. Os oes, yna nid ydym yn ei gyffwrdd, os na, yna rydym yn cymryd Rwsieg. Yna rydym yn ffurfweddu'r ffeiliau system Doxygen. Mae'r holl newidynnau angenrheidiol, gan gynnwys yr iaith, yn mynd yno yn ystod y broses ffurfweddu (gweler. ΠΊΠΎΠΌΠ°Π½Π΄Ρ configure_file).
Yna rydyn ni'n creu nod doc, a fydd yn dechrau cynhyrchu dogfennaeth. Gan nad cynhyrchu dogfennaeth yw'r angen mwyaf yn y broses ddatblygu, ni fydd y targed yn cael ei alluogi yn ddiofyn; bydd yn rhaid ei lansio'n benodol.
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 ()
Yma rydym yn dod o hyd i'r trydydd Python ac yn creu targed wandbox, sy'n cynhyrchu cais sy'n cyfateb i'r API gwasanaeth Wandbox, ac yn ei anfon ymaith. Daw'r ymateb gyda dolen i'r blwch tywod gorffenedig.
Yn darparu'r gallu i analluogi adeiladu profion uned a thargedu check. O ganlyniad, mae mesur cwmpas cod gan brofion yn cael ei ddiffodd (gweler. MYLIB_COVERAGE).
Mae profi hefyd wedi'i analluogi'n awtomatig os yw'r prosiect wedi'i gysylltu Γ’ phrosiect arall fel is-brosiect gan ddefnyddio'r gorchymyn add_subdirectory.
Mewn gwirionedd, dim ond rhai o'r gorchmynion consol a ddisgrifir yn y cymorth hwn sy'n ofynnol i CMake fersiwn 3.13 redeg. O safbwynt cystrawen sgriptiau CMake, mae fersiwn 3.8 yn ddigonol os gelwir cenhedlaeth mewn ffyrdd eraill.
Ar Γ΄l hyn, bydd dadansoddiad statig yn cael ei lansio'n awtomatig bob tro y bydd y ffynhonnell yn cael ei llunio a'i hail-grynhoi. Nid oes angen gwneud dim byd ychwanegol.
clang
Gyda chymorth offeryn gwych scan-build Gallwch hefyd redeg dadansoddiad statig mewn dim o amser:
Mae CMake yn system bwerus a hyblyg iawn sy'n eich galluogi i weithredu ymarferoldeb ar gyfer pob chwaeth a lliw. Ac, er fod y gystrawen weithiau yn gadael llawer i'w ddymuno, nid yw y diafol eto mor ofnadwy ag y mae wedi ei baentio. Defnyddio system adeiladu CMake er budd cymdeithas ac iechyd.