Mae CMake a C ++ yn frodyr am byth

Mae CMake a C ++ yn frodyr am byth

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:

  1. Cynulliad;
  2. Profion Autorun;
  3. Mesur cwmpas y cod;
  4. Gosod;
  5. Auto-dogfennaeth;
  6. Cynhyrchu blychau tywod ar-lein;
  7. Dadansoddiad statig.

Gall unrhyw un sydd eisoes yn deall y manteision a C-wneud yn syml lawrlwytho templed prosiect a dechrau ei ddefnyddio.


Cynnwys

  1. Prosiect o'r tu mewn
    1. Strwythur y prosiect
    2. Prif ffeil CMake (./CMakeLists.txt)
      1. Gwybodaeth am y prosiect
      2. Opsiynau Prosiect
      3. Opsiynau casglu
      4. Prif amcan
      5. Gosod
      6. Profion
      7. Cofnodion
      8. Blwch tywod ar-lein
    3. Sgript prawf (prawf/CMakeLists.txt)
      1. Profi
      2. Gorchuddio
    4. Sgript ar gyfer dogfennaeth (doc/CMakeLists.txt)
    5. Sgript ar gyfer blwch tywod ar-lein (ar-lein/CMakeLists.txt)
  2. Prosiect y tu allan
    1. Cynulliad
      1. Cynhyrchu
      2. Cynulliad
    2. Opsiynau
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Targedau'r Cynulliad
      1. Yn ddiofyn
      2. mylib-uned-profion
      3. gwirio
      4. sylw
      5. doc
      6. hudlath
    4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
  3. Offer
  4. Dadansoddiad statig
  5. Afterword

Prosiect o'r tu mewn

Strwythur y prosiect

.
β”œβ”€β”€ 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.cpp

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.

Prif ffeil CMake (./CMakeLists.txt)

Gwybodaeth am 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.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Opsiynau Prosiect

Byddwn yn darparu dau opsiwn.

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?

option(MYLIB_TESTING "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС" ON)

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.

option(MYLIB_COVERAGE "Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ покрытия ΠΊΠΎΠ΄Π° тСстами" OFF)

Opsiynau casglu

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.

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
)

Byddwn hefyd yn analluogi estyniadau er mwyn cydymffurfio'n llawn Γ’ safon iaith C++. Maent yn cael eu galluogi yn ddiofyn yn CMake.

if(NOT CMAKE_CXX_EXTENSIONS)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

Prif amcan

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 hefyd yn werth talu sylw i'r hyn a elwir. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

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.

target_include_directories(mylib INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

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).

target_compile_features(mylib INTERFACE cxx_std_17)

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.

add_library(Mylib::mylib ALIAS mylib)

Gosod

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.

install(DIRECTORY include/mylib DESTINATION include)

Nesaf, rydym yn hysbysu'r system adeiladu ein bod am allu galw'r gorchymyn mewn prosiectau trydydd parti find_package(Mylib) a chael nod Mylib::mylib.

install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

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.

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)

Profion

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.

if(NOT MYLIB_TESTING)
    message(STATUS "ВСстированиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Mylib Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib Π½Π΅ тСстируСтся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ подмодуля")
else()
    add_subdirectory(test)
endif()

Cofnodion

Ni chynhyrchir dogfennaeth ychwaith yn achos is-brosiect.

if(NOT IS_SUBPROJECT)
    add_subdirectory(doc)
endif()

Blwch tywod ar-lein

Yn yr un modd, ni fydd gan yr is-brosiect flwch tywod ar-lein ychwaith.

if(NOT IS_SUBPROJECT)
    add_subdirectory(online)
endif()

Sgript prawf (prawf/CMakeLists.txt)

Profi

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.

target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)

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.

target_link_libraries(mylib-unit-tests
    PRIVATE
        Mylib::mylib
        doctest::doctest
)

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)

Gorchuddio

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.

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()

Sgript ar gyfer dogfennaeth (doc/CMakeLists.txt)

Wedi dod o hyd i Doxygen.

find_package(Doxygen)

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 ()

Sgript ar gyfer blwch tywod ar-lein (ar-lein/CMakeLists.txt)

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.

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()

Prosiect y tu allan

Nawr, gadewch i ni edrych ar sut i ddefnyddio hyn i gyd.

Cynulliad

Mae adeiladu'r prosiect hwn, fel unrhyw brosiect arall ar system adeiladu CMake, yn cynnwys dau gam:

Cynhyrchu

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [ΠΎΠΏΡ†ΠΈΠΈ ...]

Os na weithiodd y gorchymyn uchod oherwydd hen fersiwn o CMake, ceisiwch hepgor -S:

cmake ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [ΠΎΠΏΡ†ΠΈΠΈ ...]

Mwy am opsiynau.

Adeiladu'r prosiect

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ [--target target]

Mwy am nodau'r cynulliad.

Opsiynau

MYLIB_COVERAGE

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

Yn cynnwys targed coverage, y gallwch chi ddechrau mesur cwmpas cod trwy brofion.

MYLIB_TESTING

cmake -S ... -B ... -DMYLIB_TESTING=OFF [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

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.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ...]

Yn newid iaith y ddogfennaeth y mae'r targed yn ei chynhyrchu doc i'r un a roddwyd. Am restr o'r ieithoedd sydd ar gael, gw Gwefan system Doxygen.

Mae Rwsieg wedi'i alluogi yn ddiofyn.

Targedau'r Cynulliad

Yn ddiofyn

cmake --build path/to/build/directory
cmake --build path/to/build/directory --target all

Os nad yw'r targed wedi'i nodi (sy'n cyfateb i'r targed all), yn casglu popeth y gall, a hefyd yn galw'r targed check.

mylib-uned-profion

cmake --build path/to/build/directory --target mylib-unit-tests

Yn llunio profion uned. Wedi'i alluogi yn ddiofyn.

gwirio

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target check

Yn rhedeg y profion uned a gasglwyd (a gasglwyd, os nad yn barod). Wedi'i alluogi yn ddiofyn.

Gweler hefyd mylib-unit-tests.

sylw

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target coverage

Yn dadansoddi rhedeg (yn rhedeg, os nad yn barod) profion uned ar gyfer cwmpas cod gan brofion sy'n defnyddio'r rhaglen gcovr.

Bydd y gwacΓ‘u cotio yn edrych yn rhywbeth fel hyn:

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp                            2       2   100%   
------------------------------------------------------------------------------
TOTAL                                          2       2   100%
------------------------------------------------------------------------------

Dim ond pan fydd yr opsiwn wedi'i alluogi y mae'r targed ar gael MYLIB_COVERAGE.

Gweler hefyd check.

doc

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target doc

Yn dechrau cynhyrchu dogfennaeth cod gan ddefnyddio'r system docsigen.

hudlath

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target wandbox

Mae ymateb y gwasanaeth yn edrych rhywbeth fel hyn:

{
    "permlink" :    "QElvxuMzHgL9fqci",
    "status" :  "0",
    "url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}

Defnyddir y gwasanaeth ar gyfer hyn Wandbox. Nid wyf yn gwybod pa mor hyblyg yw eu gweinyddwyr, ond credaf na ddylid camddefnyddio'r cyfle hwn.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Adeiladwch y prosiect yn y modd dadfygio gyda mesuriad cwmpas

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target coverage --parallel 16

Gosod prosiect heb gydosod a phrofi rhagarweiniol

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=ΠΏΡƒΡ‚ΡŒ/ΠΊ/установойной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target install

Adeiladwch yn y modd rhyddhau gyda chasglydd penodol

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=ΠΏΡƒΡ‚ΡŒ/ΠΊ/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ/ΠΊΡƒΠ΄Π°/установлСны/зависимости
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --parallel 4

Cynhyrchu dogfennaeth yn Saesneg

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target doc

Offer

  1. CMake 3.13

    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.

  2. Profi llyfrgell athrawiaeth

    Gellir analluogi profion (gweler ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. docsigen

    I newid yr iaith y bydd y ddogfennaeth yn cael ei chynhyrchu ynddi, darperir opsiwn MYLIB_DOXYGEN_LANGUAGE.

  4. Dehonglydd iaith Python 3

    Ar gyfer cynhyrchu awtomatig blychau tywod ar-lein.

Dadansoddiad statig

Gyda CMake a chwpl o offer da, gallwch ddarparu dadansoddiad statig heb fawr o ymdrech.

Gwiriad Cpp

Mae gan CMake gefnogaeth fewnol ar gyfer offeryn dadansoddi statig Gwiriad Cpp.

I wneud hyn mae angen i chi ddefnyddio'r opsiwn CMAKE_CXX_CPPCHECK:

cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-IΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам/include"

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:

scan-build cmake -S ΠΏΡƒΡ‚ΡŒ/ΠΊ/исходникам -B ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ

Yma, yn wahanol i'r achos gyda Cppcheck, mae angen i chi redeg yr adeilad bob tro scan-build.

Afterword

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.

β†’ Lawrlwytho templed prosiect

Ffynhonnell: hab.com

Ychwanegu sylw