د پراختیا په جریان کې ، زه خوښوم چې تالیف کونکي بدل کړئ ، حالتونه رامینځته کړئ ، د انحصار نسخې ، جامد تحلیل ترسره کړئ ، فعالیت اندازه کړئ ، پوښښ راټول کړئ ، اسناد رامینځته کړئ ، او داسې نور. او زه واقعیا د CMake سره مینه لرم ځکه چې دا ما ته اجازه راکوي هرڅه چې زه یې غواړم ترسره کړم.
ډیری خلک په CMake نیوکه کوي، او ډیری وختونه د دې مستحق دي، مګر که تاسو ورته وګورئ، هر څه دومره خراب ندي، او پدې وروستیو کې هیڅ بد ندی، او د پرمختګ لوري خورا مثبت دی.
په دې یادښت کې، زه غواړم تاسو ته ووایم چې څنګه په ساده ډول په C++ کې د CMake سیسټم کې د سرلیک کتابتون تنظیم کړئ ترڅو لاندې فعالیت ترلاسه کړئ:
- مجلس
- د اتوماتیک ازموینې؛
- د کوډ پوښښ اندازه کول؛
- نصبول
- اتوماتیک اسناد؛
- آنلاین سینڈ باکس نسل؛
- جامد تحلیل.
هرڅوک چې دمخه په ګټو پوهیږي او C-make کولی شي په ساده ډول
د پروژې ټیمپلیټ ډاونلوډ کړئ او د هغې کارول پیل کړئ.
منځپانګې
له دننه څخه پروژه بهر پروژه توکي جامد تحلیل وروسته
له دننه څخه پروژه
د پروژې جوړښت
.
├── 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_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)
ازموینې
که ازمایښتونه په ښکاره ډول غیر فعال وي 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 ()
د آنلاین سینڈ باکس لپاره سکریپټ (آنلاین/CMakeLists.txt)
دلته موږ دریم پایتون پیدا کوو او یو هدف جوړوو 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
روسی په ډیفالټ فعال دی.
د مجلس اهداف
په تلواله
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
د برنامه په کارولو سره د ازموینو په واسطه د کوډ پوښښ لپاره د چلولو (چلولو ، که دمخه نه وي) د واحد ازموینې تحلیل کوي
د کوټینګ اخراج به داسې ښکاري:
------------------------------------------------------------------------------
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
توکي
-
سي ایم کی 3.13په حقیقت کې، د CMake نسخه 3.13 یوازې د دې مرستې کې تشریح شوي کنسول کمانډونو چلولو لپاره اړین دی. د CMake سکریپټونو ترکیب له نظره، نسخه 3.8 کافي ده که چیرې نسل په نورو لارو ویل کیږي.
-
د ازموینې کتابتون
doctest ازموینه غیر فعال کیدی شي (وګورئ
).опцию MYLIB_TESTING
-
د هغه ژبې بدلولو لپاره چې اسناد به یې تولید شي، یو اختیار چمتو شوی
.MYLIB_DOXYGEN_LANGUAGE
-
د ژبې ژباړونکی
پیټون 3 د اتوماتیک نسل لپاره
آنلاین شګه بکسونه .
جامد تحلیل
د CMake او یو څو ښه وسیلو سره، تاسو کولی شئ د لږې هڅې سره جامد تحلیل چمتو کړئ.
Cppcheck
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 جوړونې سیسټم وکاروئ.
سرچینه: www.habr.com