CMake và C++ mãi mãi là anh em

CMake và C++ mãi mãi là anh em

Trong quá trình phát triển, tôi muốn thay đổi trình biên dịch, chế độ xây dựng, phiên bản phụ thuộc, thực hiện phân tích tĩnh, đo lường hiệu suất, thu thập phạm vi bảo hiểm, tạo tài liệu, v.v. Và tôi thực sự yêu thích CMake vì nó cho phép tôi làm mọi thứ tôi muốn.

Nhiều người chỉ trích CMake, và thường là đáng bị như vậy, nhưng nếu nhìn vào nó, không phải mọi thứ đều tệ đến thế, và gần đây không xấu cảvà hướng phát triển khá tích cực.

Trong lưu ý này, tôi muốn cho bạn biết cách tổ chức thư viện tiêu đề trong C++ trong hệ thống CMake để có được chức năng sau:

  1. Cuộc họp;
  2. Kiểm tra tự động chạy;
  3. Đo lường phạm vi mã;
  4. Cài đặt;
  5. Tài liệu tự động;
  6. Tạo sandbox trực tuyến;
  7. Phân tích tĩnh.

Bất kỳ ai đã hiểu rõ ưu điểm và C-make có thể chỉ cần tải mẫu dự án và bắt đầu sử dụng nó.


nội dung

  1. Dự án từ bên trong
    1. Cấu trúc dự án
    2. Tệp CMake chính (./CMakeLists.txt)
      1. Thông tin dự án
      2. Tùy chọn dự án
      3. Tùy chọn biên dịch
      4. Mục tiêu chính
      5. Cài đặt
      6. Kiểm tra
      7. Tài liệu
      8. Hộp cát trực tuyến
    3. Tập lệnh kiểm tra (test/CMakeLists.txt)
      1. Kiểm tra
      2. Bảo hiểm
    4. Tập lệnh cho tài liệu (doc/CMakeLists.txt)
    5. Tập lệnh cho sandbox trực tuyến (online/CMakeLists.txt)
  2. Dự án bên ngoài
    1. Lắp ráp
      1. Thế hệ
      2. Lắp ráp
    2. Tùy chọn
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. hội mục tiêu
      1. Theo mặc định
      2. bài kiểm tra đơn vị mylib
      3. kiểm tra
      4. bảo hiểm
      5. doc
      6. hộp đựng đũa phép
    4. Ví dụ
  3. Dụng cụ
  4. Phân tích tĩnh
  5. bạt

Dự án từ bên trong

Cấu trúc dự án

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

Chúng tôi sẽ chủ yếu nói về cách sắp xếp các tập lệnh CMake, vì vậy chúng sẽ được thảo luận chi tiết. Bất kỳ ai cũng có thể xem trực tiếp phần còn lại của tệp trên trang dự án mẫu.

Tệp CMake chính (./CMakeLists.txt)

Thông tin dự án

Trước hết, bạn cần yêu cầu phiên bản bắt buộc của hệ thống CMake. CMake đang phát triển, chữ ký lệnh và hành vi trong các điều kiện khác nhau đang thay đổi. Để CMake hiểu ngay những gì chúng ta muốn từ nó, chúng ta cần ghi lại ngay những yêu cầu của mình đối với nó.

cmake_minimum_required(VERSION 3.13)

Sau đó, chúng tôi sẽ chỉ định dự án của mình, tên, phiên bản, ngôn ngữ được sử dụng, v.v. (xem. команду project).

Trong trường hợp này chúng tôi chỉ ra ngôn ngữ CXX (và điều này có nghĩa là C++) để CMake không phải căng thẳng và tìm kiếm trình biên dịch ngôn ngữ C (theo mặc định, CMake bao gồm hai ngôn ngữ: C và C++).

project(Mylib VERSION 1.0 LANGUAGES CXX)

Tại đây bạn có thể kiểm tra ngay xem dự án của chúng tôi có được đưa vào dự án khác dưới dạng dự án con hay không. Điều này sẽ giúp ích rất nhiều trong tương lai.

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

Tùy chọn dự án

Chúng tôi sẽ cung cấp hai lựa chọn.

Tùy chọn đầu tiên là MYLIB_TESTING - để vô hiệu hóa các bài kiểm tra đơn vị. Điều này có thể cần thiết nếu chúng tôi chắc chắn rằng mọi thứ đều ổn với các thử nghiệm, nhưng chúng tôi chỉ muốn cài đặt hoặc đóng gói dự án của mình chẳng hạn. Hoặc dự án của chúng tôi được đưa vào dưới dạng một dự án con - trong trường hợp này, người dùng dự án của chúng tôi không quan tâm đến việc chạy thử nghiệm của chúng tôi. Bạn không kiểm tra các phần phụ thuộc mà bạn sử dụng, phải không?

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

Ngoài ra, chúng tôi sẽ thực hiện một tùy chọn riêng MYLIB_COVERAGE để đo mức độ bao phủ mã bằng các thử nghiệm, nhưng nó sẽ yêu cầu các công cụ bổ sung, vì vậy nó sẽ cần phải được kích hoạt một cách rõ ràng.

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

Tùy chọn biên dịch

Tất nhiên, chúng tôi là những lập trình viên tuyệt vời, vì vậy chúng tôi muốn mức độ chẩn đoán thời gian biên dịch tối đa từ trình biên dịch. Không một con chuột nào lọt qua được.

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
)

Chúng tôi cũng sẽ vô hiệu hóa các tiện ích mở rộng để tuân thủ đầy đủ tiêu chuẩn ngôn ngữ C++. Chúng được bật theo mặc định trong CMake.

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

Mục tiêu chính

Thư viện của chúng tôi chỉ bao gồm các tệp tiêu đề, có nghĩa là chúng tôi không có bất kỳ nguồn thải nào ở dạng thư viện tĩnh hoặc động. Mặt khác, để sử dụng thư viện của chúng tôi từ bên ngoài, nó cần phải được cài đặt, nó cần phải được phát hiện trong hệ thống và được kết nối với dự án của bạn, đồng thời các tiêu đề tương tự này, cũng như có thể một số tiêu đề bổ sung, được gắn vào các thuộc tính của nó.

Với mục đích này, chúng tôi tạo ra một thư viện giao diện.

add_library(mylib INTERFACE)

Chúng tôi liên kết các tiêu đề với thư viện giao diện của chúng tôi.

Việc sử dụng CMake hiện đại, thời trang, trẻ trung ngụ ý rằng các tiêu đề, thuộc tính, v.v. truyền qua một mục tiêu duy nhất. Nói thế là đủ rồi target_link_libraries(target PRIVATE dependency)và tất cả các tiêu đề được liên kết với mục tiêu dependency, sẽ có sẵn cho các nguồn thuộc về mục tiêu target. Và bạn không cần bất kỳ [target_]include_directories. Điều này sẽ được chứng minh dưới đây trong phần phân tích Tập lệnh CMake cho các bài kiểm tra đơn vị.

Nó cũng đáng chú ý đến cái gọi là. выражения-генераторы: $<...>.

Lệnh này liên kết các tiêu đề chúng ta cần với thư viện giao diện của chúng ta và nếu thư viện của chúng ta được kết nối với bất kỳ mục tiêu nào trong cùng hệ thống phân cấp CMake, thì các tiêu đề từ thư mục sẽ được liên kết với nó ${CMAKE_CURRENT_SOURCE_DIR}/includevà nếu thư viện của chúng tôi được cài đặt trên hệ thống và được kết nối với dự án khác bằng lệnh find_package, khi đó các tiêu đề từ thư mục sẽ được liên kết với nó include liên quan đến thư mục cài đặt.

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

Hãy thiết lập một tiêu chuẩn ngôn ngữ. Tất nhiên, cái cuối cùng. Đồng thời, chúng tôi không chỉ đưa vào tiêu chuẩn mà còn mở rộng nó cho những người sẽ sử dụng thư viện của chúng tôi. Điều này đạt được là do thuộc tính set có một danh mục INTERFACE (Xem. lệnh target_compile_features).

target_compile_features(mylib INTERFACE cxx_std_17)

Hãy tạo bí danh cho thư viện của chúng tôi. Hơn nữa, để làm đẹp, nó sẽ nằm trong một “không gian tên” đặc biệt. Điều này sẽ hữu ích khi các mô-đun khác nhau xuất hiện trong thư viện của chúng tôi và chúng tôi sẽ kết nối chúng độc lập với nhau. Như ở Busta chẳng hạn.

add_library(Mylib::mylib ALIAS mylib)

Cài đặt

Cài đặt các tiêu đề của chúng tôi vào hệ thống. Mọi thứ đều đơn giản ở đây. Chúng tôi nói rằng thư mục có tất cả các tiêu đề sẽ nằm trong thư mục include liên quan đến vị trí lắp đặt.

install(DIRECTORY include/mylib DESTINATION include)

Tiếp theo, chúng tôi thông báo cho hệ thống xây dựng rằng chúng tôi muốn có thể gọi lệnh trong các dự án của bên thứ ba find_package(Mylib) và có được bàn thắng Mylib::mylib.

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

Câu thần chú tiếp theo nên được hiểu theo cách này. Khi ở trong dự án của bên thứ ba, chúng tôi gọi lệnh find_package(Mylib 1.2.3 REQUIRED)và phiên bản thực của thư viện đã cài đặt sẽ không tương thích với phiên bản 1.2.3CMake sẽ tự động phát sinh lỗi. Tức là bạn sẽ không cần phải theo dõi các phiên bản theo cách thủ công.

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)

Kiểm tra

Nếu các bài kiểm tra bị vô hiệu hóa một cách rõ ràng bằng cách sử dụng tùy chọn tương ứng hoặc dự án của chúng tôi là một dự án con, nghĩa là nó được kết nối với một dự án CMake khác bằng lệnh add_subdirectory, chúng tôi không di chuyển xa hơn dọc theo hệ thống phân cấp và tập lệnh mô tả các lệnh để tạo và chạy thử nghiệm đơn giản là không chạy.

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

Tài liệu

Tài liệu cũng sẽ không được tạo ra trong trường hợp là một tiểu dự án.

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

Hộp cát trực tuyến

Tương tự như vậy, tiểu dự án cũng sẽ không có hộp cát trực tuyến.

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

Tập lệnh kiểm tra (test/CMakeLists.txt)

Kiểm tra

Trước hết, chúng tôi tìm thấy một gói có khung kiểm tra bắt buộc (thay thế bằng khung yêu thích của bạn).

find_package(doctest 2.3.3 REQUIRED)

Hãy tạo tệp thực thi của chúng tôi bằng các bài kiểm tra. Thông thường tôi chỉ thêm trực tiếp vào tệp nhị phân thực thi tệp chứa hàm main.

add_executable(mylib-unit-tests test_main.cpp)

Và tôi thêm các tệp trong đó các bài kiểm tra sẽ được mô tả sau. Nhưng bạn không cần phải làm điều đó.

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

Chúng tôi kết nối các phụ thuộc. Xin lưu ý rằng chúng tôi chỉ liên kết các mục tiêu CMake mà chúng tôi cần với tệp nhị phân của mình và không gọi lệnh target_include_directories. Các tiêu đề từ khung kiểm tra và từ chúng tôi Mylib::mylib, cũng như các tham số bản dựng (trong trường hợp của chúng tôi, đây là tiêu chuẩn ngôn ngữ C++) đã đạt được cùng với các mục tiêu này.

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

Cuối cùng, chúng tôi tạo một mục tiêu giả, “bản dựng” tương đương với việc chạy thử nghiệm và thêm mục tiêu này vào bản dựng mặc định (thuộc tính chịu trách nhiệm cho việc này ALL). Điều này có nghĩa là bản dựng mặc định sẽ kích hoạt các thử nghiệm để chạy, nghĩa là chúng tôi sẽ không bao giờ quên chạy chúng.

add_custom_target(check ALL COMMAND mylib-unit-tests)

Bảo hiểm

Tiếp theo, chúng tôi kích hoạt đo lường phạm vi mã nếu tùy chọn thích hợp được chỉ định. Tôi sẽ không đi sâu vào chi tiết vì chúng liên quan nhiều đến công cụ đo lường mức độ phù hợp hơn là CMake. Điều quan trọng cần lưu ý là dựa trên kết quả, mục tiêu sẽ được tạo ra coverage, thuận tiện để bắt đầu đo phạm vi bao phủ.

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

Tập lệnh cho tài liệu (doc/CMakeLists.txt)

Tìm thấy Doxygen.

find_package(Doxygen)

Tiếp theo, chúng tôi kiểm tra xem người dùng đã đặt biến ngôn ngữ chưa. Nếu có thì không chạm vào, nếu không thì chúng ta lấy tiếng Nga. Sau đó, chúng tôi định cấu hình các tệp hệ thống Doxygen. Tất cả các biến cần thiết, bao gồm cả ngôn ngữ, đều có ở đó trong quá trình cấu hình (xem. команду configure_file).

Sau đó, chúng tôi tạo ra một mục tiêu doc, thao tác này sẽ bắt đầu tạo tài liệu. Vì việc tạo tài liệu không phải là nhu cầu lớn nhất trong quá trình phát triển nên mục tiêu sẽ không được bật theo mặc định; nó sẽ phải được khởi chạy một cách rõ ràng.

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

Tập lệnh cho sandbox trực tuyến (online/CMakeLists.txt)

Ở đây chúng tôi tìm thấy Python thứ ba và tạo mục tiêu wandbox, tạo ra một yêu cầu tương ứng với API dịch vụ Hộp đựng đũa phép, và đuổi anh ta đi. Phản hồi đi kèm với một liên kết đến hộp cát đã hoàn thành.

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

Dự án bên ngoài

Bây giờ chúng ta hãy xem làm thế nào để sử dụng tất cả điều này.

Lắp ráp

Xây dựng dự án này, giống như bất kỳ dự án nào khác trên hệ thống xây dựng CMake, bao gồm hai giai đoạn:

Thế hệ

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

Nếu lệnh trên không hoạt động do phiên bản CMake cũ, hãy thử bỏ qua -S:

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

Tìm hiểu thêm về các tùy chọn.

Xây dựng dự án

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

Tìm hiểu thêm về mục tiêu lắp ráp.

Tùy chọn

MYLIB_COVERAGE

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

Bao gồm mục tiêu coverage, nhờ đó bạn có thể bắt đầu đo mức độ bao phủ mã bằng các thử nghiệm.

MYLIB_TESTING

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

Cung cấp khả năng vô hiệu hóa mục tiêu và xây dựng thử nghiệm đơn vị check. Kết quả là, việc đo lường mức độ bao phủ mã bằng các thử nghiệm bị tắt (xem phần XNUMX). MYLIB_COVERAGE).

Việc kiểm tra cũng tự động bị vô hiệu hóa nếu dự án được kết nối với dự án khác dưới dạng dự án con bằng lệnh add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

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

Chuyển đổi ngôn ngữ của tài liệu mà mục tiêu tạo ra doc đến cái đã cho. Để biết danh sách các ngôn ngữ có sẵn, hãy xem Trang web hệ thống Doxygen.

Tiếng Nga được bật theo mặc định.

hội mục tiêu

Theo mặc định

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

Nếu mục tiêu không được chỉ định (tương đương với mục tiêu all), thu thập mọi thứ có thể và cũng gọi mục tiêu check.

bài kiểm tra đơn vị mylib

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

Biên dịch các bài kiểm tra đơn vị. Được bật theo mặc định.

kiểm tra

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

Chạy các bài kiểm tra đơn vị đã thu thập (đã thu thập, nếu chưa có). Được bật theo mặc định.

См. также mylib-unit-tests.

bảo hiểm

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

Phân tích các bài kiểm tra đơn vị đang chạy (chạy, nếu chưa) để xác định mức độ bao phủ mã bằng các bài kiểm tra bằng chương trình gcovr.

Ống xả phủ sẽ trông giống như thế này:

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

Mục tiêu chỉ khả dụng khi tùy chọn được bật MYLIB_COVERAGE.

См. также check.

doc

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

Bắt đầu tạo tài liệu mã bằng hệ thống doxygen.

hộp đựng đũa phép

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

Phản hồi từ dịch vụ trông giống như thế này:

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

Dịch vụ này được sử dụng cho việc này Hộp đựng đũa phép. Tôi không biết máy chủ của họ linh hoạt đến mức nào, nhưng tôi nghĩ rằng không nên lạm dụng cơ hội này.

Ví dụ

Xây dựng dự án ở chế độ gỡ lỗi với phép đo mức độ bao phủ

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

Cài đặt dự án mà không cần lắp ráp và thử nghiệm sơ bộ

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

Xây dựng ở chế độ phát hành với trình biên dịch nhất định

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

Tạo tài liệu bằng tiếng Anh

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

Dụng cụ

  1. CMake 3.13

    Trên thực tế, CMake phiên bản 3.13 chỉ được yêu cầu để chạy một số lệnh console được mô tả trong trợ giúp này. Từ quan điểm về cú pháp của tập lệnh CMake, phiên bản 3.8 là đủ nếu việc tạo được gọi theo những cách khác.

  2. Thư viện thử nghiệm tài liệu

    Việc kiểm tra có thể bị vô hiệu hóa (xem опцию MYLIB_TESTING).

  3. doxygen

    Để chuyển đổi ngôn ngữ mà tài liệu sẽ được tạo, một tùy chọn được cung cấp MYLIB_DOXYGEN_LANGUAGE.

  4. Phiên dịch ngôn ngữ Python 3

    Để tạo tự động hộp cát trực tuyến.

Phân tích tĩnh

Với CMake và một số công cụ tốt, bạn có thể cung cấp phân tích tĩnh mà không tốn nhiều công sức.

cppcheck

CMake có hỗ trợ tích hợp cho công cụ phân tích tĩnh cppcheck.

Để làm điều này, bạn cần sử dụng tùy chọn CMAKE_CXX_CPPCHECK:

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

Sau đó, phân tích tĩnh sẽ tự động được khởi chạy mỗi khi nguồn được biên dịch và biên dịch lại. Không cần phải làm gì thêm.

Kêu vang

Với sự trợ giúp của một công cụ tuyệt vời scan-build Bạn cũng có thể chạy phân tích tĩnh ngay lập tức:

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

Ở đây, không giống như trường hợp của Cppcheck, bạn cần chạy bản dựng mỗi lần scan-build.

bạt

CMake là một hệ thống rất mạnh mẽ và linh hoạt cho phép bạn triển khai chức năng cho mọi sở thích và màu sắc. Và, mặc dù cú pháp đôi khi còn nhiều điều chưa được mong muốn, nhưng con quỷ vẫn không khủng khiếp như được vẽ ra. Sử dụng hệ thống xây dựng CMake vì lợi ích của xã hội và sức khỏe.

Tải xuống mẫu dự án

Nguồn: www.habr.com

Thêm một lời nhận xét