Το CMake και η C++ είναι αδέρφια για πάντα

Το CMake και η C++ είναι αδέρφια για πάντα

Κατά τη διάρκεια της ανάπτυξης, μου αρέσει να αλλάζω μεταγλωττιστές, να δημιουργώ τρόπους λειτουργίας, εκδόσεις εξάρτησης, να εκτελώ στατική ανάλυση, να μετρώ την απόδοση, να συλλέγω κάλυψη, να δημιουργώ τεκμηρίωση και ούτω καθεξής. Και αγαπώ πολύ το CMake γιατί μου επιτρέπει να κάνω ό,τι θέλω.

Πολλοί επιπλήττουν το CMake, και συχνά επάξια, αλλά αν κοιτάξετε, δεν είναι τόσο κακό, αλλά τελευταία καθόλου κακό, και η κατεύθυνση ανάπτυξης είναι αρκετά θετική.

Σε αυτήν τη σημείωση, θέλω να σας πω πόσο εύκολο είναι να οργανώσετε μια βιβλιοθήκη κεφαλίδων C++ σε ένα σύστημα CMake για να έχετε την ακόλουθη λειτουργικότητα:

  1. συνέλευση;
  2. Δοκιμές αυτόματης εκτέλεσης.
  3. Μέτρηση κάλυψης κωδικού.
  4. εγκατάσταση;
  5. Αυτόματη τεκμηρίωση;
  6. Online παραγωγή sandbox.
  7. Στατική ανάλυση.

Όποιος καταλαβαίνει ήδη τα πλεονεκτήματα και το si-make μπορεί απλώς κατεβάστε το πρότυπο έργου και αρχίστε να το χρησιμοποιείτε.


περιεχόμενο

  1. Έργο από μέσα
    1. Δομή έργου
    2. Κύριο αρχείο CMake (./CMakeLists.txt)
      1. Πληροφορίες έργου
      2. Επιλογές Έργου
      3. Επιλογές Σύνταξης
      4. Ο κύριος στόχος
      5. Εγκατάσταση
      6. Δοκιμές
      7. Εγγραφές
      8. Online sandbox
    3. Σενάριο για δοκιμές (test/CMakeLists.txt)
      1. Δοκιμές
      2. Κάλυψη
    4. Σενάριο τεκμηρίωσης (doc/CMakeLists.txt)
    5. Σενάριο για online sandbox (online/CMakeLists.txt)
  2. έργο έξω
    1. συνέλευση
      1. Γενιά
      2. συνέλευση
    2. Επιλογές
      1. MYLIB_CAVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. στόχους συναρμολόγησης
      1. Από προεπιλογή
      2. mylib-unit-tests
      3. έλεγχος
      4. κάλυψη
      5. προκυμαία
      6. ράβδος
    4. παραδείγματα
  3. Εργαλεία
  4. Στατική Ανάλυση
  5. Επίλογος

Έργο από μέσα

Δομή έργου

.
├── 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

Αυτό θα επικεντρωθεί κυρίως στον τρόπο οργάνωσης των σεναρίων CMake, επομένως θα αναλυθούν λεπτομερώς. Τα υπόλοιπα αρχεία μπορούν να προβληθούν απευθείας από οποιονδήποτε. στη σελίδα του προτύπου έργου.

Κύριο αρχείο CMake (./CMakeLists.txt)

Πληροφορίες έργου

Πρώτα απ 'όλα, πρέπει να ζητήσετε την επιθυμητή έκδοση του συστήματος CMake. Το CMake αναπτύσσεται, οι υπογραφές εντολών αλλάζουν, η συμπεριφορά υπό διαφορετικές συνθήκες. Για να καταλάβει αμέσως το CMake τι θέλουμε από αυτό, πρέπει να διορθώσουμε αμέσως τις απαιτήσεις μας για αυτό.

cmake_minimum_required(VERSION 3.13)

Στη συνέχεια δηλώνουμε το έργο μας, το όνομά του, την έκδοση, τις χρησιμοποιούμενες γλώσσες κ.λπ. команду project).

Σε αυτήν την περίπτωση, καθορίστε τη γλώσσα CXX (που σημαίνει C++) έτσι ώστε το CMake να μην ασχολείται με την αναζήτηση ενός μεταγλωττιστή C (από προεπιλογή, δύο γλώσσες περιλαμβάνονται στο CMake: C και C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Εδώ μπορείτε να ελέγξετε αμέσως εάν το έργο μας περιλαμβάνεται σε άλλο έργο ως υποέργο. Αυτό θα βοηθήσει πολύ στο μέλλον.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Επιλογές Έργου

Ας εξετάσουμε δύο επιλογές.

Η πρώτη επιλογή είναι MYLIB_TESTING - για να απενεργοποιήσετε τις δοκιμές μονάδας. Αυτό μπορεί να είναι απαραίτητο εάν είμαστε σίγουροι ότι όλα είναι εντάξει με τις δοκιμές και θέλουμε, για παράδειγμα, μόνο να εγκαταστήσουμε ή να συσκευάσουμε το έργο μας. Ή το έργο μας περιλαμβάνεται ως υποέργο - σε αυτήν την περίπτωση, ο χρήστης του έργου μας δεν ενδιαφέρεται να εκτελέσει τις δοκιμές μας. Δεν δοκιμάζεις τις εξαρτήσεις που χρησιμοποιείς, σωστά;

option(MYLIB_TESTING "Включить модульное тестирование" ON)

Επιπλέον, θα κάνουμε μια ξεχωριστή επιλογή MYLIB_COVERAGE για τη μέτρηση της κάλυψης κώδικα με δοκιμές, αλλά θα απαιτηθούν πρόσθετα εργαλεία, επομένως θα πρέπει να το ενεργοποιήσετε ρητά.

option(MYLIB_COVERAGE "Включить измерение покрытия кода тестами" OFF)

Επιλογές Σύνταξης

Φυσικά, είμαστε ωραίοι θετικοί προγραμματιστές, επομένως θέλουμε το μέγιστο επίπεδο διαγνωστικών μεταγλώττισης από τον μεταγλωττιστή. Ούτε ένα ποντίκι δεν θα περάσει.

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
)

Θα απενεργοποιήσουμε επίσης τις επεκτάσεις για να συμμορφώνονται πλήρως με το πρότυπο γλώσσας C ++. Είναι ενεργοποιημένα από προεπιλογή στο CMake.

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

Ο κύριος στόχος

Η βιβλιοθήκη μας αποτελείται μόνο από αρχεία κεφαλίδας, πράγμα που σημαίνει ότι δεν έχουμε έξοδο με τη μορφή στατικών ή δυναμικών βιβλιοθηκών. Από την άλλη πλευρά, για να χρησιμοποιήσετε τη βιβλιοθήκη μας από έξω, πρέπει να την εγκαταστήσετε, πρέπει να μπορείτε να τη βρείτε στο σύστημα και να τη συνδέσετε με το έργο σας, και ταυτόχρονα αυτές ακριβώς οι κεφαλίδες, καθώς και όπως, ενδεχομένως, κάποιες πρόσθετες ιδιότητες.

Για το σκοπό αυτό, δημιουργούμε μια βιβλιοθήκη διεπαφής.

add_library(mylib INTERFACE)

Συνδέουμε τις κεφαλίδες στη βιβλιοθήκη διεπαφής μας.

Σύγχρονη, μοντέρνα, νεανική χρήση του CMake σημαίνει ότι οι κεφαλίδες, οι ιδιότητες κ.λπ. μεταδίδεται μέσω ενός μόνο στόχου. Αρκεί λοιπόν να πούμε target_link_libraries(target PRIVATE dependency)και όλες οι κεφαλίδες που σχετίζονται με τον στόχο dependency, θα είναι διαθέσιμο για πηγές που ανήκουν στον στόχο target. Και δεν χρειάζεσαι κανένα [target_]include_directories. Αυτό θα αποδειχθεί παρακάτω κατά την ανάλυση CMake σενάριο για δοκιμές μονάδας.

Αξίζει επίσης να δοθεί προσοχή στο λεγόμενο. выражения-генераторы: $<...>.

Αυτή η εντολή συσχετίζει τις κεφαλίδες που χρειαζόμαστε με τη βιβλιοθήκη διεπαφής μας και εάν η βιβλιοθήκη μας είναι συνδεδεμένη με οποιονδήποτε στόχο εντός της ίδιας ιεραρχίας CMake, τότε οι κεφαλίδες από τον κατάλογο θα συσχετιστούν με αυτόν ${CMAKE_CURRENT_SOURCE_DIR}/include, και εάν η βιβλιοθήκη μας είναι εγκατεστημένη στο σύστημα και συνδέεται με άλλο έργο χρησιμοποιώντας την εντολή find_package, τότε οι κεφαλίδες από τον κατάλογο θα συσχετιστούν με αυτό include σε σχέση με τον κατάλογο εγκατάστασης.

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

Ορίστε το πρότυπο γλώσσας. Φυσικά, το τελευταίο. Ταυτόχρονα, όχι μόνο συμπεριλαμβάνουμε το πρότυπο, αλλά το διανέμουμε και σε όσους θα χρησιμοποιήσουν τη βιβλιοθήκη μας. Αυτό επιτυγχάνεται με το να έχει η ιδιότητα που έχει μια κατηγορία INTERFACE (Βλέπε εντολή target_compile_features).

target_compile_features(mylib INTERFACE cxx_std_17)

Παίρνουμε ένα ψευδώνυμο για τη βιβλιοθήκη μας. Και για ομορφιά, θα είναι σε ειδικό «χώρο ονομάτων». Αυτό θα είναι χρήσιμο όταν εμφανίζονται διαφορετικές λειτουργικές μονάδες στη βιβλιοθήκη μας και πηγαίνουμε να τις συνδέσουμε ανεξάρτητα το ένα από το άλλο. Όπως στη Μπούστα, για παράδειγμα.

add_library(Mylib::mylib ALIAS mylib)

Εγκατάσταση

Εγκατάσταση των κεφαλίδων μας στο σύστημα. Όλα είναι απλά εδώ. Λέμε ότι ο φάκελος με όλες τις κεφαλίδες πρέπει να πέσει στον κατάλογο include σχετικά με τη θέση εγκατάστασης.

install(DIRECTORY include/mylib DESTINATION include)

Στη συνέχεια, λέμε στο σύστημα κατασκευής ότι θέλουμε να μπορούμε να καλούμε την εντολή σε έργα τρίτων find_package(Mylib) και βάλε στόχο Mylib::mylib.

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

Η ακόλουθη επωδία πρέπει να γίνει κατανοητή έτσι. Όταν σε ένα side project καλούμε την εντολή find_package(Mylib 1.2.3 REQUIRED), και ταυτόχρονα η πραγματική έκδοση της εγκατεστημένης βιβλιοθήκης δεν θα είναι συμβατή με την έκδοση 1.2.3, το CMake θα δημιουργήσει αυτόματα ένα σφάλμα. Δηλαδή, δεν θα χρειαστεί να παρακολουθείτε τις εκδόσεις χειροκίνητα.

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)

Δοκιμές

Εάν οι δοκιμές είναι ρητά απενεργοποιημένες με αντίστοιχη επιλογή ή το έργο μας είναι υποέργο, δηλαδή συνδέεται με άλλο έργο CMake χρησιμοποιώντας την εντολή add_subdirectory, δεν πηγαίνουμε πιο κάτω στην ιεραρχία και το σενάριο, το οποίο περιγράφει τις εντολές για τη δημιουργία και την εκτέλεση δοκιμών, απλά δεν ξεκινά.

if(NOT MYLIB_TESTING)
    message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
    add_subdirectory(test)
endif()

Εγγραφές

Επίσης, δεν θα δημιουργηθεί τεκμηρίωση στην περίπτωση υποέργου.

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

Online sandbox

Ομοίως, το υποέργο δεν θα έχει ούτε διαδικτυακό sandbox.

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

Σενάριο για δοκιμές (test/CMakeLists.txt)

Δοκιμές

Πρώτα απ 'όλα, βρίσκουμε ένα πακέτο με το επιθυμητό πλαίσιο δοκιμής (αντικαταστήστε το με το αγαπημένο σας).

find_package(doctest 2.3.3 REQUIRED)

Δημιουργούμε το εκτελέσιμο αρχείο μας με δοκιμές. Συνήθως, απευθείας στο εκτελέσιμο δυαδικό, προσθέτω μόνο το αρχείο στο οποίο θα βρίσκεται η συνάρτηση main.

add_executable(mylib-unit-tests test_main.cpp)

Και τα αρχεία στα οποία περιγράφονται τα ίδια τα τεστ, τα προσθέτω αργότερα. Δεν είναι όμως απαραίτητο να το κάνουμε.

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

Συνδέουμε εξαρτήσεις. Λάβετε υπόψη ότι επισυνάψαμε μόνο τους στόχους CMake που χρειαζόμασταν στο δυαδικό μας αρχείο και δεν καλέσαμε την εντολή target_include_directories. Κεφαλίδες από το πλαίσιο δοκιμής και από το δικό μας Mylib::mylib, καθώς και επιλογές δόμησης (στην περίπτωσή μας, το πρότυπο γλώσσας C++) ανιχνεύτηκαν μαζί με αυτούς τους στόχους.

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

Τέλος, δημιουργούμε έναν εικονικό στόχο του οποίου το "build" ισοδυναμεί με δοκιμές εκτέλεσης και προσθέτουμε αυτόν τον στόχο στην προεπιλεγμένη κατασκευή (αυτή είναι ευθύνη του χαρακτηριστικού ALL). Αυτό σημαίνει ότι η προεπιλεγμένη έκδοση θα ενεργοποιήσει την εκτέλεση των δοκιμών, που σημαίνει ότι δεν θα ξεχάσουμε ποτέ να τα εκτελέσουμε.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Κάλυψη

Στη συνέχεια, ενεργοποιήστε τη μέτρηση κάλυψης κωδικού, εάν έχει οριστεί η αντίστοιχη επιλογή. Δεν θα μπω σε λεπτομέρειες, γιατί σχετίζονται περισσότερο με το εργαλείο μέτρησης κάλυψης παρά με το CMake. Είναι σημαντικό μόνο να σημειωθεί ότι τα αποτελέσματα θα δημιουργήσουν έναν στόχο coverage, με το οποίο είναι βολικό να ξεκινήσετε τη μέτρηση της κάλυψης.

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

Σενάριο τεκμηρίωσης (doc/CMakeLists.txt)

Βρέθηκε Doxygen.

find_package(Doxygen)

Στη συνέχεια, ελέγχουμε αν η μεταβλητή με τη γλώσσα έχει οριστεί από τον χρήστη. Εάν ναι, τότε δεν το αγγίζουμε, αν όχι, τότε παίρνουμε τα ρωσικά. Στη συνέχεια διαμορφώνουμε τα αρχεία συστήματος Doxygen. Όλες οι απαραίτητες μεταβλητές, συμπεριλαμβανομένης της γλώσσας, φτάνουν εκεί κατά τη διαδικασία διαμόρφωσης (βλ. команду configure_file).

Μετά δημιουργούμε έναν στόχο doc, το οποίο θα αρχίσει να δημιουργεί τεκμηρίωση. Δεδομένου ότι η δημιουργία τεκμηρίωσης δεν είναι η μεγαλύτερη ανάγκη στη διαδικασία ανάπτυξης, ο στόχος δεν θα περιλαμβάνεται από προεπιλογή, θα πρέπει να εκτελείται ρητά.

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

Σενάριο για online sandbox (online/CMakeLists.txt)

Εδώ βρίσκουμε την τρίτη Python και δημιουργούμε έναν στόχο wandbox, το οποίο δημιουργεί ένα αίτημα που αντιστοιχεί στο API υπηρεσίας Ραβδί, και το στέλνει. Σε απάντηση, έρχεται ένας σύνδεσμος προς το έτοιμο sandbox.

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

έργο έξω

Τώρα ας δούμε πώς να τα χρησιμοποιήσετε όλα.

συνέλευση

Η κατασκευή αυτού του έργου, όπως κάθε άλλο έργο στο σύστημα κατασκευής CMake, αποτελείται από δύο στάδια:

Γενιά

cmake -S путь/к/исходникам -B путь/к/сборочной/директории [опции ...]

Εάν η παραπάνω εντολή δεν λειτούργησε λόγω παλαιότερης έκδοσης του CMake, δοκιμάστε να την παραλείψετε -S:

cmake путь/к/исходникам -B путь/к/сборочной/директории [опции ...]

Περισσότερα για τις επιλογές.

Κατασκευή έργου

cmake --build путь/к/сборочной/директории [--target target]

Περισσότερα για τους στόχους της συναρμολόγησης.

Επιλογές

MYLIB_CAVERAGE

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прочие опции ...]

Περιλαμβάνει στόχο coverage, με το οποίο μπορείτε να ξεκινήσετε τη μέτρηση της κάλυψης κωδικών με δοκιμές.

MYLIB_TESTING

cmake -S ... -B ... -DMYLIB_TESTING=OFF [прочие опции ...]

Παρέχει την επιλογή απενεργοποίησης της έκδοσης και του στόχου δοκιμής μονάδας check. Ως αποτέλεσμα, η μέτρηση της κάλυψης κωδικού από δοκιμές απενεργοποιείται (βλ MYLIB_COVERAGE).

Επίσης, η δοκιμή απενεργοποιείται αυτόματα εάν το έργο συνδεθεί με άλλο έργο ως υποέργο χρησιμοποιώντας την εντολή add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прочие опции ...]

Αλλάζει τη γλώσσα της τεκμηρίωσης που δημιουργεί ο στόχος doc στο δεδομένο. Για μια λίστα με τις διαθέσιμες γλώσσες, βλ Ιστοσελίδα Doxygen.

Τα Ρωσικά είναι ενεργοποιημένα από προεπιλογή.

στόχους συναρμολόγησης

Από προεπιλογή

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

Εάν ο στόχος δεν έχει καθοριστεί (που είναι ισοδύναμος με τον στόχο all), συλλέγει ό,τι είναι δυνατό και καλεί επίσης τον στόχο check.

mylib-unit-tests

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

Συγκεντρώνει δοκιμές μονάδων. Ενεργοποιημένο από προεπιλογή.

έλεγχος

cmake --build путь/к/сборочной/директории --target check

Εκτελεί ενσωματωμένες (κατασκευάζει αν όχι ήδη) δοκιμές μονάδων. Ενεργοποιημένο από προεπιλογή.

Δείτε επίσης mylib-unit-tests.

κάλυψη

cmake --build путь/к/сборочной/директории --target coverage

Αναλύει τις δοκιμές μονάδων που εκτελούνται (εκτελούνται, αν όχι ακόμα) για κάλυψη κώδικα από δοκιμές που χρησιμοποιούν το πρόγραμμα gcovr.

Η έξοδος κάλυψης θα μοιάζει κάπως έτσι:

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

Ο στόχος είναι διαθέσιμος μόνο όταν η επιλογή είναι ενεργοποιημένη. MYLIB_COVERAGE.

Δείτε επίσης check.

προκυμαία

cmake --build путь/к/сборочной/директории --target doc

Ξεκινά τη δημιουργία τεκμηρίωσης για τον κώδικα χρησιμοποιώντας το σύστημα οξυγόνο.

ράβδος

cmake --build путь/к/сборочной/директории --target wandbox

Η απάντηση από την υπηρεσία μοιάζει κάπως έτσι:

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

Η υπηρεσία χρησιμοποιείται για αυτό. Ραβδί. Δεν ξέρω πώς έχουν διακομιστές από καουτσούκ, αλλά νομίζω ότι δεν πρέπει να κάνετε κατάχρηση αυτής της δυνατότητας.

παραδείγματα

Δημιουργία έργου σε λειτουργία εντοπισμού σφαλμάτων με μέτρηση κάλυψης

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сборочной/директории --target coverage --parallel 16

Εγκατάσταση έργου χωρίς προκατασκευή και δοκιμή

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/установойной/директории
cmake --build путь/к/сборочной/директории --target install

Δημιουργία σε λειτουργία απελευθέρωσης από τον καθορισμένο μεταγλωττιστή

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/директории/куда/установлены/зависимости
cmake --build путь/к/сборочной/директории --parallel 4

Δημιουργία τεκμηρίωσης στα αγγλικά

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сборочной/директории --target doc

Εργαλεία

  1. CMake 3.13

    Στην πραγματικότητα, η έκδοση 3.13 του CMake απαιτείται μόνο για την εκτέλεση ορισμένων από τις εντολές της κονσόλας που περιγράφονται σε αυτήν τη βοήθεια. Από τη σκοπιά της σύνταξης των σεναρίων CMake, η έκδοση 3.8 είναι επαρκής εάν η παραγωγή καλείται με άλλους τρόπους.

  2. Βιβλιοθήκη δοκιμών διδακτορικό

    Η δοκιμή μπορεί να απενεργοποιηθεί (βλ опцию MYLIB_TESTING).

  3. οξυγόνο

    Για να αλλάξετε τη γλώσσα στην οποία θα δημιουργηθεί η τεκμηρίωση, υπάρχει μια επιλογή MYLIB_DOXYGEN_LANGUAGE.

  4. διερμηνέας PL Python 3

    Για αυτόματη παραγωγή online sandboxes.

Στατική Ανάλυση

Με τη βοήθεια του CMake και μερικών καλών εργαλείων, μπορείτε να παρέχετε στατική ανάλυση με ελάχιστες στροφές.

Cppcheck

Υποστήριξη για εργαλείο στατικής ανάλυσης ενσωματωμένο στο CMake Cppcheck.

Για να το κάνετε αυτό, χρησιμοποιήστε την επιλογή CMAKE_CXX_CPPCHECK:

cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/исходникам/include"

Μετά από αυτό, η στατική ανάλυση θα εκκινείται αυτόματα κάθε φορά κατά τη μεταγλώττιση και την εκ νέου μεταγλώττιση των πηγών. Δεν χρειάζεται να γίνει τίποτα επιπλέον.

Κλαγγή

Με ένα υπέροχο εργαλείο scan-build Μπορείτε επίσης να εκτελέσετε στατική ανάλυση σε ελάχιστο χρόνο:

scan-build cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сборочной/директории

Εδώ, σε αντίθεση με την περίπτωση με το Cppcheck, απαιτείται η εκτέλεση του build κάθε φορά scan-build.

Επίλογος

Το CMake είναι ένα πολύ ισχυρό και ευέλικτο σύστημα που σας επιτρέπει να εφαρμόσετε λειτουργικότητα για κάθε γούστο και χρώμα. Και, αν και η σύνταξη μερικές φορές αφήνει πολλά να είναι επιθυμητά, ο διάβολος εξακολουθεί να μην είναι τόσο τρομερός όσο είναι ζωγραφισμένος. Χρησιμοποιήστε το σύστημα κατασκευής CMake προς όφελος της κοινωνίας και της υγείας.

Κατεβάστε το πρότυπο έργου

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο