CMake እና C++ ለዘላለም ወንድሞች ናቸው።

CMake እና C++ ለዘላለም ወንድሞች ናቸው።

በእድገት ጊዜ, አቀናባሪዎችን መለወጥ, ሁነታዎችን መገንባት, የጥገኝነት ስሪቶች, የማይለዋወጥ ትንታኔዎችን ማከናወን, አፈፃፀምን መለካት, ሽፋን መሰብሰብ, ሰነዶችን ማመንጨት, ወዘተ. እና CMakeን በጣም እወዳለሁ ምክንያቱም የፈለግኩትን ሁሉ ለማድረግ ይፈቅድልኛል.

ብዙዎች CMakeን ይወቅሳሉ፣ እና ብዙ ጊዜ ይገባቸዋል፣ ነገር ግን ከተመለከቱት በጣም መጥፎ አይደለም፣ ግን በቅርቡ መጥፎ አይደለም, እና የእድገት አቅጣጫ በጣም አዎንታዊ ነው.

በዚህ ማስታወሻ ውስጥ የሚከተለውን ተግባር ለማግኘት የC++ ራስጌ ላይብረሪ በCMake ሥርዓት ውስጥ ማደራጀት ምን ያህል ቀላል እንደሆነ ልነግርዎ እፈልጋለሁ።

  1. ስብሰባ;
  2. Autorun ሙከራዎች;
  3. የኮድ ሽፋን መለኪያ;
  4. መጫን;
  5. አውቶማቲክ;
  6. የመስመር ላይ ማጠሪያ ማመንጨት;
  7. የማይንቀሳቀስ ትንተና.

ማን ቀድሞውንም ጥቅሙን የተረዳ እና ሲ-ማድረግ ይችላል። የፕሮጀክት አብነት አውርድ እና እሱን መጠቀም ይጀምሩ።


ይዘቶች

  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-unit-ሙከራዎች
      3. ቼክ
      4. ሽፋን
      5. doc
      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 እና 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(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)

የሚከተለው ቅኝት በዚህ መንገድ መረዳት አለበት። በጎን ፕሮጀክት ውስጥ ሲሆኑ ትዕዛዙን እንጠራዋለን 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()

የመስመር ላይ ማጠሪያ

በተመሳሳይ፣ ንኡስ ፕሮጀክቱም የመስመር ላይ ማጠሪያ አይኖረውም።

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)

ማቅለሚያ

በመቀጠል, ተጓዳኝ አማራጩ ከተዘጋጀ የኮድ ሽፋን መለኪያን ያብሩ. ወደ ዝርዝሮቹ አልገባም, ምክንያቱም እነሱ ከሲኤምኤክ ይልቅ ከሽፋን መለኪያ መሳሪያ ጋር በጣም የተያያዙ ናቸው. ውጤቶቹ ግብ እንደሚፈጥሩ ብቻ ልብ ማለት ያስፈልጋል 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)

በመቀጠል፣ ከቋንቋው ጋር ያለው ተለዋዋጭ በተጠቃሚው መዘጋጀቱን እናረጋግጣለን። አዎ ከሆነ, እኛ አንነካውም, ካልሆነ, ሩሲያኛ እንወስዳለን. ከዚያ የ 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)

እዚህ ሦስተኛውን Python እናገኛለን እና ዒላማ እንፈጥራለን wandboxከአገልግሎት ኤፒአይ ጋር የሚዛመድ ጥያቄ የሚያመነጭ የኪስ ቦርሳ, እና ይልካል. በምላሹ, ወደ ተጠናቀቀው ማጠሪያ አገናኝ ይመጣል.

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 ለተሰጠው. የሚገኙትን ቋንቋዎች ዝርዝር ይመልከቱ Doxygen ድር ጣቢያ.

ሩሲያኛ በነባሪነት ነቅቷል።

የመሰብሰቢያ ዒላማዎች

በነባሪ

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

ዒላማው ካልተገለጸ (ከዒላማው ጋር እኩል ነው all), የሚቻለውን ሁሉ ይሰበስባል, እና ኢላማውንም ይጠራል check.

mylib-unit-ሙከራዎች

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

የክፍል ፈተናዎችን ያጠናቅራል። በነባሪነት የነቃ።

ቼክ

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

አብሮ የተሰራ (ካልሆነ ይገነባል) የክፍል ሙከራዎችን ያካሂዳል። በነባሪነት የነቃ።

በተጨማሪ ይመልከቱ mylib-unit-tests.

ሽፋን

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

አሂድ (እስካሁን ካልሆነ) የክፍል ሙከራዎችን ለኮድ ሽፋን በፈተናዎች ፕሮግራሙን በመጠቀም ይመረምራል። ግኮቭር.

የሽፋን ውፅዓት እንደዚህ ያለ ነገር ይመስላል።

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

doc

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. ሲማክ 3.13

    በእርግጥ፣ በዚህ እገዛ ውስጥ የተገለጹትን አንዳንድ የኮንሶል ትዕዛዞችን ለማስኬድ የCMake ስሪት 3.13 ብቻ ያስፈልጋል። ከ CMake ስክሪፕቶች አገባብ አንጻር ትውልዱ በሌላ መንገድ ከተጠራ 3.8 ስሪት በቂ ነው።

  2. የሙከራ ቤተ-መጽሐፍት ዶክተር

    ሙከራ ሊሰናከል ይችላል (ተመልከት опцию MYLIB_TESTING).

  3. ዶክሲን

    ሰነዶቹ የሚፈጠሩበትን ቋንቋ ለመቀየር አንድ አማራጭ አለ። MYLIB_DOXYGEN_LANGUAGE.

  4. PL አስተርጓሚ ዘንዶ 3

    ለራስ-ሰር ማመንጨት የመስመር ላይ ማጠሪያ ሳጥኖች.

የማይንቀሳቀስ ትንተና

በሲሜክ እና በሁለት ጥሩ መሳሪያዎች እገዛ በትንሹ ቅልጥፍና የማይንቀሳቀስ ትንታኔ መስጠት ይችላሉ።

ሲፒኬክ

በCMake ውስጥ ለተሰራ የማይንቀሳቀስ ትንተና መሳሪያ ድጋፍ ሲፒኬክ.

ይህንን ለማድረግ, አማራጩን ይጠቀሙ 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 ግንባታ ስርዓትን ይጠቀሙ።

→ የፕሮጀክት አብነት አውርድ

ምንጭ: hab.com

አስተያየት ያክሉ