CMake සහ C++ සදාකාලික සහෝදරයන්

CMake සහ C++ සදාකාලික සහෝදරයන්

සංවර්ධනය අතරතුර, මම සම්පාදක වෙනස් කිරීමට, මාතයන් ගොඩනැගීමට, පරායත්ත අනුවාද කිරීමට, ස්ථිතික විශ්ලේෂණය කිරීමට, කාර්ය සාධනය මැනීමට, ආවරණය එකතු කිරීමට, ලේඛන උත්පාදනය කිරීමට යනාදියට කැමතියි. ඒ වගේම මම CMake වලට ඇත්තටම කැමතියි මොකද මට අවශ්‍ය හැම දෙයක්ම කරන්න ඒකෙන් ඉඩ දෙනවා.

බොහෝ අය CMake විවේචනය කරන අතර බොහෝ විට එය සුදුසු ය, නමුත් ඔබ එය දෙස බැලුවහොත්, සියල්ල එතරම් නරක නැත, සහ මෑතකදී නරක නැහැ, සහ සංවර්ධනයේ දිශාව බෙහෙවින් ධනාත්මක ය.

මෙම සටහනේදී, පහත ක්‍රියාකාරීත්වය ලබා ගැනීම සඳහා CMake පද්ධතියේ C++ හි ශීර්ෂ පුස්තකාලයක් සරලව සංවිධානය කරන්නේ කෙසේදැයි මට ඔබට පැවසීමට අවශ්‍යය:

  1. එකලස් කිරීම;
  2. ස්වයංක්‍රීය පරීක්ෂණ;
  3. කේත ආවරණ මැනීම;
  4. ස්ථාපන;
  5. ස්වයං-ලේඛනගත කිරීම;
  6. මාර්ගගත වැලිපිල්ල උත්පාදනය;
  7. ස්ථිතික විශ්ලේෂණය.

වාසි සහ C-make දැනටමත් තේරුම් ගෙන ඇති ඕනෑම කෙනෙකුට සරලව කළ හැකිය ව්‍යාපෘති අච්චුව බාගන්න සහ එය භාවිතා කිරීමට පටන් ගන්න.


අන්තර්ගතය

  1. ඇතුළත සිට ව්යාපෘතිය
    1. ව්යාපෘති ව්යුහය
    2. ප්‍රධාන CMake ගොනුව (./CMakeLists.txt)
      1. ව්යාපෘති තොරතුරු
      2. ව්යාපෘති විකල්ප
      3. සම්පාදන විකල්ප
      4. මූලික අරමුණ
      5. ස්ථාපනය
      6. පරීක්ෂණ
      7. ප්‍රලේඛනය
      8. මාර්ගගත වැලිපිල්ල
    3. පරීක්ෂණ පිටපත (test/CMakeLists.txt)
      1. පරීක්ෂා කිරීම
      2. Покрытие
    4. ලේඛන සඳහා ස්ක්‍රිප්ට් (doc/CMakeLists.txt)
    5. සබැඳි වැලිපිල්ල සඳහා ස්ක්‍රිප්ට් (online/CMakeLists.txt)
  2. පිටත ව්යාපෘතිය
    1. සභාව
      1. පරම්පරාව
      2. සභාව
    2. විකල්ප
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. එකලස් කිරීමේ ඉලක්ක
      1. පෙරනිමියෙන්
      2. mylib-ඒකක-පරීක්ෂණ
      3. චෙක්පත
      4. ආවරණය
      5. ඩී
      6. wandbox
    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 scripts සංවිධානය කරන්නේ කෙසේද යන්න ගැන කතා කරමු, එබැවින් ඒවා විස්තරාත්මකව සාකච්ඡා කරනු ඇත. ඕනෑම කෙනෙකුට ඉතිරි ගොනු කෙලින්ම බැලිය හැක අච්චු ව්‍යාපෘති පිටුවේ.

ප්‍රධාන 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)

අපි අපේ පුස්තකාලයට අන්වර්ථයක් හදමු. එපමණක් නොව, අලංකාරය සඳහා, එය විශේෂ "නාම අවකාශයක්" වනු ඇත. අපගේ පුස්තකාලයේ විවිධ මොඩියුල දිස්වන විට මෙය ප්‍රයෝජනවත් වනු ඇත, අපි ඒවා එකිනෙකට ස්වාධීනව සම්බන්ධ කිරීමට යමු. උදාහරණයක් ලෙස Busta හි මෙන්.

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)

මීළඟ මන්ත්‍රය මෙසේ තේරුම් ගත යුතුය. තෙවන පාර්ශවීය ව්‍යාපෘතියකදී අපි විධානය අමතන්නෙමු find_package(Mylib 1.2.3 REQUIRED), සහ ස්ථාපිත පුස්තකාලයේ සැබෑ අනුවාදය අනුවාදය සමඟ නොගැලපේ 1.2.3CMake ස්වයංක්‍රීයව දෝෂයක් ජනනය කරයි. එනම්, ඔබට අනුවාද අතින් නිරීක්ෂණය කිරීමට අවශ්‍ය නොවනු ඇත.

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

මාර්ගගත වැලිපිල්ල

එලෙසම, උප ව්‍යාපෘතියට සබැඳි වැලිපිල්ලක් ද නැත.

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
)

අවසාන වශයෙන්, අපි ව්‍යාජ ඉලක්කයක් සාදන්නෙමු, එහි “ගොඩනැගීම” ධාවන පරීක්ෂණවලට සමාන වන අතර, මෙම ඉලක්කය පෙරනිමි ගොඩනැගීමට එක් කරන්න (මේ සඳහා ගුණාංගය වගකිව යුතුය. 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)

ඩොක්සිජන් සොයා ගත්තා.

find_package(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/CMakeLists.txt)

මෙන්න අපි තුන්වන පයිතන් සොයාගෙන ඉලක්කයක් නිර්මාණය කරමු wandbox, සේවා API ට අනුරූප ඉල්ලීමක් ජනනය කරයි සැරයටිය, සහ ඔහුව පිටත් කර යවයි. ප්‍රතිචාරය නිමි වැලිපිල්ල වෙත සබැඳියක් සමඟ පැමිණේ.

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_COVERAGE

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 දීපු එකට. පවතින භාෂා ලැයිස්තුවක් සඳහා, බලන්න ඩොක්සිජන් පද්ධති වෙබ් අඩවිය.

රුසියානු පෙරනිමියෙන් සක්රිය කර ඇත.

එකලස් කිරීමේ ඉලක්ක

පෙරනිමියෙන්

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

ඉලක්කය නිශ්චිතව දක්වා නොමැති නම් (එය ඉලක්කයට සමාන වේ all), හැකි සෑම දෙයක්ම එකතු කරයි, එසේම ඉලක්කය අමතන්න check.

mylib-ඒකක-පරීක්ෂණ

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

පද්ධතිය භාවිතයෙන් කේත ලේඛන උත්පාදනය ආරම්භ කරයි ඩොක්සිජන්.

wandbox

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

    ඇත්ත වශයෙන්ම, CMake අනුවාදය 3.13 අවශ්‍ය වන්නේ මෙම උදව්වේ විස්තර කර ඇති සමහර කොන්සෝල විධාන ක්‍රියාත්මක කිරීමට පමණි. CMake ස්ක්‍රිප්ට් වල වාක්‍ය ඛණ්ඩයේ දෘෂ්ටිකෝණයෙන්, වෙනත් ආකාරවලින් උත්පාදනය හැඳින්වුවහොත් 3.8 අනුවාදය ප්‍රමාණවත් වේ.

  2. පරීක්ෂණ පුස්තකාලය doctest

    පරීක්ෂා කිරීම අබල කළ හැක (බලන්න опцию MYLIB_TESTING).

  3. ඩොක්සිජන්

    ලේඛන උත්පාදනය කරනු ලබන භාෂාව මාරු කිරීමට, විකල්පයක් සපයනු ලැබේ MYLIB_DOXYGEN_LANGUAGE.

  4. භාෂා පරිවර්තක Python 3

    ස්වයංක්‍රීය උත්පාදනය සඳහා මාර්ගගත වැලි පෙට්ටි.

ස්ථිතික විශ්ලේෂණය

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 සමඟ ඇති නඩුව මෙන් නොව, ඔබ සෑම විටම ගොඩනැගීම ධාවනය කළ යුතුය scan-build.

පසු පදය

CMake යනු සෑම රසය සහ වර්ණය සඳහාම ක්රියාකාරිත්වය ක්රියාත්මක කිරීමට ඉඩ සලසන ඉතා ප්රබල සහ නම්යශීලී පද්ධතියකි. තවද, වාක්‍ය ඛණ්ඩය සමහර විට අපේක්ෂා කිරීමට බොහෝ දේ ඉතිරි කළද, යක්ෂයා තවමත් ඔහු පින්තාරු කර ඇති තරම් භයානක නොවේ. CMake ගොඩනැගීමේ ක්‍රමය සමාජයේ සහ සෞඛ්‍යයේ යහපත සඳහා භාවිතා කරන්න.

ව්‍යාපෘති අච්චුව බාගන්න

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න