CMake lan C ++ iku sedulur ing salawas-lawase

CMake lan C ++ iku sedulur ing salawas-lawase

Sajrone pangembangan, aku seneng ngganti kompiler, mbangun mode, versi dependensi, nindakake analisis statis, ngukur kinerja, ngumpulake jangkoan, ngasilake dokumentasi, lsp. Lan aku seneng banget karo CMake amarga ngidini aku nindakake kabeh sing dakkarepake.

Akeh wong sing ngritik CMake, lan asring pantes, nanging yen sampeyan ndeleng, ora kabeh ala, lan bubar. ora ala babar pisan, lan arah pembangunan cukup positif.

Ing cathetan iki, aku pengin menehi pitutur marang kowe carane mung ngatur perpustakaan header ing C ++ ing sistem CMake kanggo entuk fungsi ing ngisor iki:

  1. Majelis;
  2. tes Autorun;
  3. Pangukuran jangkoan kode;
  4. Instalasi;
  5. Dokumentasi otomatis;
  6. Generasi kothak wedhi online;
  7. Analisis statis.

Sapa wae sing wis ngerti kaluwihan lan C-make mung bisa download template proyek lan miwiti nggunakake.


Isi

  1. Proyek saka njero
    1. Struktur proyek
    2. File CMake utama (./CMakeLists.txt)
      1. Informasi proyek
      2. Pilihan Proyek
      3. Pilihan kompilasi
      4. Tujuan utama
      5. Instalasi
      6. Tes
      7. Dokumentasi
      8. Kothak wedhi online
    3. Skrip tes (test/CMakeLists.txt)
      1. Tes
      2. Jangkoan
    4. Skrip kanggo dokumentasi (doc/CMakeLists.txt)
    5. Skrip kanggo kothak wedhi online (online/CMakeLists.txt)
  2. Proyek njaba
    1. Majelis
      1. Generasi
      2. Majelis
    2. Pilihan
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. Sasaran Majelis
      1. standar
      2. mylib-unit-tests
      3. dipriksa
      4. jangkoan
      5. doc
      6. kothak wand
    4. conto
  3. Piranti
  4. Analisis statis
  5. Afterword

Proyek saka njero

Struktur proyek

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

Kita bakal ngomong babagan cara ngatur skrip CMake, mula bakal dibahas kanthi rinci. Sapa wae bisa ndeleng file liyane kanthi langsung ing kaca proyek cithakan.

File CMake utama (./CMakeLists.txt)

Informasi proyek

Kaping pisanan, sampeyan kudu njaluk versi sistem CMake sing dikarepake. CMake berkembang, teken printah lan prilaku ing macem-macem kahanan ganti. Supaya CMake langsung ngerti apa sing dikarepake, kita kudu langsung nyathet syarat kasebut.

cmake_minimum_required(VERSION 3.13)

Banjur kita bakal nemtokake proyek kita, jenenge, versi, basa sing digunakake, lsp. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ project).

Ing kasus iki kita nuduhake basa CXX (lan iki tegese C ++) supaya CMake ora ketegangan lan nelusuri compiler basa C (kanthi standar, CMake kalebu rong basa: C lan C ++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Ing kene sampeyan bisa langsung mriksa apa proyek kita kalebu ing proyek liyane minangka subproyek. Iki bakal mbantu akeh ing mangsa ngarep.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Pilihan Proyek

Kita bakal menehi rong pilihan.

Pilihan pisanan yaiku MYLIB_TESTING - kanggo mateni tes unit. Iki bisa uga perlu yen kita yakin manawa kabeh wis cocog karo tes, nanging mung pengin, contone, nginstal utawa ngemas proyek kita. Utawa proyek kita kalebu minangka subproyek - ing kasus iki, pangguna proyek kita ora kasengsem nglakokake tes kita. Sampeyan ora nyoba dependensi sing sampeyan gunakake, ta?

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

Kajaba iku, kita bakal nggawe pilihan sing kapisah MYLIB_COVERAGE kanggo ngukur jangkoan kode kanthi tes, nanging mbutuhake alat tambahan, mula kudu diaktifake kanthi jelas.

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

Pilihan kompilasi

Mesthi, kita kelangan plus programer, supaya kita pengin tingkat maksimum kompilasi-wektu diagnostik saka compiler. Ora ana mouse siji sing bakal mlebu.

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
)

Kita uga bakal mateni ekstensi supaya bisa tundhuk karo standar basa C ++. Dheweke diaktifake kanthi standar ing CMake.

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

Tujuan utama

Pustaka kita mung kasusun saka file header, tegese kita ora duwe exhaust ing wangun perpustakaan statis utawa dinamis. Ing sisih liya, kanggo nggunakake perpustakaan eksternal, kudu diinstal, kudu dideteksi ing sistem lan disambungake menyang proyek sampeyan, lan ing wektu sing padha, header sing padha, uga sawetara tambahan, digandhengake karo sifat-sifat kasebut.

Kanggo maksud iki, kita nggawe perpustakaan antarmuka.

add_library(mylib INTERFACE)

Kita ikatan header menyang perpustakaan antarmuka.

Panggunaan CMake sing modern, modern, lan modern nuduhake manawa header, properti, lsp. ditularake liwat siji target. Dadi cukup kanggo ngomong target_link_libraries(target PRIVATE dependency), lan kabeh header sing ana gandhengane karo target dependency, bakal kasedhiya kanggo sumber sing duwe target target. Lan sampeyan ora butuh [target_]include_directories. Iki bakal dituduhake ing analisis ing ngisor iki Skrip CMake kanggo tes unit.

Iku uga worth mbayar manungsa waΓ© kanggo sing disebut. выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: $<...>.

Printah iki nggandhengake header sing dibutuhake karo perpustakaan antarmuka, lan yen perpustakaan kita disambungake menyang target ing hierarki CMake sing padha, mula header saka direktori kasebut bakal digandhengake. ${CMAKE_CURRENT_SOURCE_DIR}/include, lan yen perpustakaan kita wis diinstal ing sistem lan disambungake menyang project liyane nggunakake printah find_package, banjur header saka direktori bakal digandhengake karo include relatif kanggo direktori instalasi.

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

Ayo netepake standar basa. Mesthi, sing paling pungkasan. Ing wektu sing padha, kita ora mung kalebu standar, nanging uga ngluwihi kanggo wong-wong sing bakal nggunakake perpustakaan kita. Iki digayuh amarga kasunyatan manawa properti sing disetel duwe kategori INTERFACE (ndeleng printah target_compile_features).

target_compile_features(mylib INTERFACE cxx_std_17)

Ayo nggawe alias kanggo perpustakaan kita. Kajaba iku, kanggo kaendahan, bakal ana ing "ruang jeneng" khusus. Iki bakal migunani nalika modul beda katon ing perpustakaan kita, lan kita pindhah menyang nyambungake independen saka saben liyane. Kaya ing Busta, contone.

add_library(Mylib::mylib ALIAS mylib)

Instalasi

Nginstal header kita menyang sistem. Kabeh iku prasaja ing kene. Kita ngomong yen folder karo kabeh header kudu pindhah menyang direktori include relatif kanggo lokasi instalasi.

install(DIRECTORY include/mylib DESTINATION include)

Sabanjure, kita ngandhani sistem mbangun yen kita pengin bisa nelpon perintah kasebut ing proyek pihak katelu find_package(Mylib) lan entuk gol Mylib::mylib.

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

Mantra sabanjure kudu dimangerteni kanthi cara iki. Nalika ing proyek pihak katelu kita nelpon printah find_package(Mylib 1.2.3 REQUIRED), lan versi nyata saka perpustakaan diinstal bakal ora kompatibel karo versi 1.2.3CMake bakal nggawe kesalahan kanthi otomatis. Tegese, sampeyan ora perlu nglacak versi kanthi manual.

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)

Tes

Yen tes dipateni kanthi jelas nggunakake pilihan sing cocog utawa proyek kita minangka subproyek, yaiku, disambungake menyang proyek CMake liyane nggunakake perintah kasebut add_subdirectory, kita ora mindhah luwih bebarengan hirarki, lan script, kang njlèntrèhaké printah kanggo ngasilaken lan mbukak tes, mung ora mbukak.

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

Dokumentasi

Dokumentasi uga ora bakal digawe ing kasus subproyek.

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

Kothak wedhi online

Kajaba iku, subproyek kasebut ora bakal duwe kothak wedhi online.

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

Skrip tes (test/CMakeLists.txt)

Tes

Kaping pisanan, kita nemokake paket kanthi kerangka tes sing dibutuhake (ganti karo sing paling disenengi).

find_package(doctest 2.3.3 REQUIRED)

Ayo nggawe file eksekusi kanthi tes. Biasane aku nambah langsung menyang binar eksekusi mung file sing bakal ngemot fungsi kasebut main.

add_executable(mylib-unit-tests test_main.cpp)

Lan aku nambah file sing tes kasebut diterangake mengko. Nanging sampeyan ora kudu nglakoni.

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

Kita nyambungake dependensi. Wigati dimangerteni manawa kita mung ngubungake target CMake sing dibutuhake kanggo binar lan ora nelpon perintah kasebut target_include_directories. Judhul saka kerangka test lan saka kita Mylib::mylib, uga mbangun paramèter (ing kasus kita, iki standar basa C ++) teka bebarengan karo gol iki.

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

Pungkasan, kita nggawe target goblok, "mbangun" sing padha karo tes sing mlaku, lan nambah target iki menyang bangunan standar (atribut tanggung jawab kanggo iki. ALL). Iki tegese mbangun gawan micu tes kanggo mbukak, tegese kita ora bakal lali kanggo mbukak.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Jangkoan

Sabanjure, kita ngaktifake pangukuran jangkoan kode yen pilihan sing cocog wis ditemtokake. Aku ora bakal njlèntrèhaké rincian, amarga padha hubungane liyane kanggo alat kanggo ngukur jangkoan saka CMake. Iku mung penting kanggo Wigati sing adhedhasar asil goal bakal digawe coverage, sing trep kanggo miwiti ngukur jangkoan.

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

Skrip kanggo dokumentasi (doc/CMakeLists.txt)

Doxygen ditemokake.

find_package(Doxygen)

Sabanjure, priksa manawa pangguna wis nyetel variabel basa. Yen ya, banjur kita ora ndemek, yen ora, banjur njupuk basa Rusia. Banjur kita ngatur file sistem Doxygen. Kabeh variabel sing dibutuhake, kalebu basa, mlebu sajrone proses konfigurasi (pirsani. ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ configure_file).

Banjur kita nggawe gol doc, sing bakal miwiti ngasilake dokumentasi. Amarga nggawe dokumentasi dudu kabutuhan paling gedhe ing proses pangembangan, target kasebut ora bakal diaktifake kanthi standar; kudu diluncurake kanthi jelas.

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

Skrip kanggo kothak wedhi online (online/CMakeLists.txt)

Ing kene kita nemokake Python katelu lan nggawe target wandbox, sing ngasilake panjalukan sing cocog karo API layanan Wandbox, lan dikongkon lunga. Tanggepan nerangake karo link menyang kothak wedhi rampung.

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

Proyek njaba

Saiki ayo goleki carane nggunakake kabeh iki.

Majelis

Mbangun proyek iki, kaya proyek liyane ing sistem mbangun CMake, dumadi saka rong tahap:

Generasi

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

Yen printah ing ndhuwur ora bisa digunakake amarga versi lawas saka CMake, coba ngilangi -S:

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

Liyane babagan opsi.

Nggawe proyek

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

Liyane babagan tujuan perakitan.

Pilihan

MYLIB_COVERAGE

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

Kalebu target coverage, sing sampeyan bisa miwiti ngukur jangkoan kode kanthi tes.

MYLIB_TESTING

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

Nyedhiyakake kemampuan kanggo mateni mbangun lan target tes unit check. AkibatΓ©, pangukuran jangkoan kode kanthi tes dipateni (pirsani. MYLIB_COVERAGE).

Pengujian uga otomatis dipateni yen proyek disambungake menyang proyek liyane minangka subproyek nggunakake printah add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Ngalih basa dokumentasi sing digawe target doc marang sing diwenehi. Kanggo dhaptar basa sing kasedhiya, deleng Situs web sistem doxygen.

Rusian diaktifake kanthi gawan.

Sasaran Majelis

standar

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

Yen target ora ditemtokake (sing padha karo target all), ngumpulake kabeh sing bisa, lan uga nelpon target check.

mylib-unit-tests

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

Nglumpukake tes unit. Diaktifake kanthi gawan.

dipriksa

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

Nglakokake tes unit sing diklumpukake (dikumpulake, yen durung). Diaktifake kanthi gawan.

Deleng uga mylib-unit-tests.

jangkoan

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

Nganalisa mlaku (mlaku, yen durung) tes unit kanggo jangkoan kode kanthi tes nggunakake program kasebut gcovr.

Exhaust coating bakal katon kaya iki:

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

Target mung kasedhiya yen opsi diaktifake MYLIB_COVERAGE.

Deleng uga check.

doc

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

Miwiti nggawe dokumentasi kode nggunakake sistem Oksigen.

kothak wand

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

Tanggapan saka layanan katon kaya iki:

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

Layanan iki digunakake kanggo iki Wandbox. Aku ora ngerti carane fleksibel server sing, nanging aku sing kesempatan iki ora kudu dilecehke.

conto

Gawe proyek ing mode debug kanthi pangukuran jangkoan

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

Nginstal proyek tanpa perakitan lan uji coba

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

Mbangun ing mode release karo compiler diwenehi

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

Nggawe dokumentasi ing basa Inggris

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

Piranti

  1. CMake 3.13

    Nyatane, CMake versi 3.13 mung dibutuhake kanggo mbukak sawetara printah console diterangake ing bantuan iki. Saka sudut pandang sintaks skrip CMake, versi 3.8 cukup yen generasi diarani kanthi cara liya.

  2. Tes perpustakaan doctest

    Pengujian bisa dipateni (pirsani ΠΎΠΏΡ†ΠΈΡŽ MYLIB_TESTING).

  3. Oksigen

    Kanggo ngalih basa ing ngendi dokumentasi bakal digawe, ana pilihan MYLIB_DOXYGEN_LANGUAGE.

  4. Juru basa Python 3

    Kanggo generasi otomatis kothak wedhi online.

Analisis statis

Kanthi CMake lan sawetara alat sing apik, sampeyan bisa menehi analisis statis kanthi minimal gaweyan.

Cppcheck

CMake duwe dhukungan kanggo alat analisis statis Cppcheck.

Kanggo nindakake iki, sampeyan kudu nggunakake pilihan CMAKE_CXX_CPPCHECK:

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

Sawise iki, analisis statis bakal diluncurake kanthi otomatis saben sumber dikompilasi lan dikompilasi maneh. Ora perlu nindakake apa-apa tambahan.

clingak-clinguk

Kanthi bantuan alat sing apik banget scan-build Sampeyan uga bisa mbukak analisis statis kanthi cepet:

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

Ing kene, ora kaya kasus Cppcheck, sampeyan kudu mbukak mbangun saben wektu scan-build.

Afterword

CMake minangka sistem sing kuat lan fleksibel sing ngidini sampeyan ngetrapake fungsi kanggo saben rasa lan warna. Lan, sanajan sintaksis kadhangkala ninggalake akeh sing dikarepake, setan isih ora nggegirisi kaya sing dicet. Gunakake sistem mbangun CMake kanggo entuk manfaat saka masyarakat lan kesehatan.

β†’ Download template proyek

Source: www.habr.com

Add a comment