అభివృద్ధి సమయంలో, నేను కంపైలర్లను మార్చడం, మోడ్లను రూపొందించడం, డిపెండెన్సీ వెర్షన్లు, స్టాటిక్ విశ్లేషణ చేయడం, పనితీరును కొలవడం, కవరేజీని సేకరించడం, డాక్యుమెంటేషన్ను రూపొందించడం మొదలైనవి చేయాలనుకుంటున్నాను. మరియు నేను CMakeని నిజంగా ఇష్టపడుతున్నాను ఎందుకంటే ఇది నాకు కావలసిన ప్రతిదాన్ని చేయడానికి నన్ను అనుమతిస్తుంది.
చాలా మంది CMakeని విమర్శిస్తారు మరియు తరచుగా అర్హులే, కానీ మీరు దానిని చూస్తే, ప్రతిదీ అంత చెడ్డది కాదు మరియు ఇటీవల అంత చెడ్డదేమీ కాదు, మరియు అభివృద్ధి దిశ చాలా సానుకూలంగా ఉంటుంది.
ఈ గమనికలో, కింది కార్యాచరణను పొందడానికి CMake సిస్టమ్లో C++లో హెడర్ లైబ్రరీని ఎలా నిర్వహించాలో నేను మీకు చెప్పాలనుకుంటున్నాను:
CMake స్క్రిప్ట్లను ఎలా నిర్వహించాలో మేము ప్రధానంగా మాట్లాడతాము, కాబట్టి అవి వివరంగా చర్చించబడతాయి. మిగిలిన ఫైల్లను ఎవరైనా నేరుగా వీక్షించవచ్చు టెంప్లేట్ ప్రాజెక్ట్ పేజీలో.
అన్నింటిలో మొదటిది, మీరు CMake సిస్టమ్ యొక్క అవసరమైన సంస్కరణను అభ్యర్థించాలి. CMake అభివృద్ధి చెందుతోంది, వివిధ పరిస్థితులలో కమాండ్ సంతకాలు మరియు ప్రవర్తన మారుతున్నాయి. CMake నుండి మనకు ఏమి కావాలో వెంటనే అర్థం చేసుకోవడానికి, దాని కోసం మన అవసరాలను వెంటనే రికార్డ్ చేయాలి.
cmake_minimum_required(VERSION 3.13)
అప్పుడు మేము మా ప్రాజెక్ట్, దాని పేరు, వెర్షన్, ఉపయోగించిన భాషలు మొదలైనవాటిని నిర్దేశిస్తాము (చూడండి. команду project).
ఈ సందర్భంలో, మేము భాషను సూచిస్తాము CXX (మరియు దీని అర్థం C++) కాబట్టి CMake కష్టపడదు మరియు C భాష కంపైలర్ కోసం శోధించదు (డిఫాల్ట్గా, CMake రెండు భాషలను కలిగి ఉంటుంది: C మరియు C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
ఇక్కడ మీరు మా ప్రాజెక్ట్ మరొక ప్రాజెక్ట్లో ఉపప్రాజెక్ట్గా చేర్చబడిందో లేదో వెంటనే తనిఖీ చేయవచ్చు. ఇది భవిష్యత్తులో చాలా సహాయపడుతుంది.
మొదటి ఎంపిక MYLIB_TESTING - యూనిట్ పరీక్షలను నిలిపివేయడానికి. ప్రతిదీ పరీక్షలకు అనుగుణంగా ఉందని మేము ఖచ్చితంగా అనుకుంటే ఇది అవసరం కావచ్చు, కానీ మేము మా ప్రాజెక్ట్ను ఇన్స్టాల్ చేయడం లేదా ప్యాకేజీ చేయడం మాత్రమే కోరుకుంటున్నాము. లేదా మా ప్రాజెక్ట్ ఉపప్రాజెక్ట్గా చేర్చబడింది - ఈ సందర్భంలో, మా ప్రాజెక్ట్ యొక్క వినియోగదారు మా పరీక్షలను అమలు చేయడానికి ఆసక్తి చూపరు. మీరు ఉపయోగించే డిపెండెన్సీలను మీరు పరీక్షించరు, లేదా?
అదనంగా, మేము ఒక ప్రత్యేక ఎంపికను చేస్తాము MYLIB_COVERAGE పరీక్షల ద్వారా కోడ్ కవరేజీని కొలిచేందుకు, కానీ దీనికి అదనపు సాధనాలు అవసరమవుతాయి, కనుక ఇది స్పష్టంగా ప్రారంభించబడాలి.
వాస్తవానికి, మేము కూల్ ప్లస్ ప్రోగ్రామర్లు, కాబట్టి మేము కంపైలర్ నుండి కంపైల్-టైమ్ డయాగ్నస్టిక్స్ యొక్క గరిష్ట స్థాయిని కోరుకుంటున్నాము. ఒక్క ఎలుక కూడా జారిపోదు.
మా లైబ్రరీ హెడర్ ఫైల్లను మాత్రమే కలిగి ఉంటుంది, అంటే స్టాటిక్ లేదా డైనమిక్ లైబ్రరీల రూపంలో మాకు ఎటువంటి ఎగ్జాస్ట్ లేదు. మరోవైపు, మా లైబ్రరీని బాహ్యంగా ఉపయోగించడానికి, ఇది ఇన్స్టాల్ చేయబడాలి, ఇది సిస్టమ్లో గుర్తించదగినదిగా మరియు మీ ప్రాజెక్ట్కి కనెక్ట్ చేయబడి ఉండాలి మరియు అదే సమయంలో ఇదే హెడర్లు, అలాగే కొన్ని అదనపు వాటిని కలిగి ఉండాలి, దాని లక్షణాలు జోడించబడ్డాయి.
ఈ ప్రయోజనం కోసం, మేము ఇంటర్ఫేస్ లైబ్రరీని సృష్టిస్తాము.
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 ఇన్స్టాలేషన్ డైరెక్టరీకి సంబంధించి.
భాషా ప్రమాణాన్ని సెట్ చేద్దాం. వాస్తవానికి, చివరిది. అదే సమయంలో, మేము ప్రమాణాన్ని చేర్చడమే కాకుండా, మా లైబ్రరీని ఉపయోగించే వారికి కూడా విస్తరిస్తాము. సెట్ ప్రాపర్టీకి ఒక వర్గం ఉన్నందున ఇది సాధించబడుతుంది INTERFACE (Cm. target_compile_features కమాండ్).
మన లైబ్రరీకి మారుపేరును క్రియేట్ చేద్దాం. అంతేకాకుండా, అందం కోసం, ఇది ప్రత్యేక "నేమ్స్పేస్" లో ఉంటుంది. మా లైబ్రరీలో విభిన్న మాడ్యూల్స్ కనిపించినప్పుడు ఇది ఉపయోగకరంగా ఉంటుంది మరియు మేము వాటిని ఒకదానికొకటి స్వతంత్రంగా కనెక్ట్ చేయడానికి వెళ్తాము. ఉదాహరణకు, బస్టాలో వలె.
సిస్టమ్లో మా హెడర్లను ఇన్స్టాల్ చేస్తోంది. ఇక్కడ ప్రతిదీ సులభం. అన్ని హెడర్లతో కూడిన ఫోల్డర్ డైరెక్టరీలోకి వెళ్లాలని మేము చెప్తున్నాము include సంస్థాపన స్థానానికి సంబంధించి.
తరువాత, మేము మూడవ పక్ష ప్రాజెక్ట్లలో కమాండ్ను కాల్ చేయాలనుకుంటున్నాము అని బిల్డ్ సిస్టమ్కు తెలియజేస్తాము find_package(Mylib) మరియు ఒక లక్ష్యాన్ని పొందండి Mylib::mylib.
తదుపరి మంత్రాన్ని ఈ విధంగా అర్థం చేసుకోవాలి. మూడవ పక్ష ప్రాజెక్ట్లో ఉన్నప్పుడు మేము ఆదేశాన్ని పిలుస్తాము find_package(Mylib 1.2.3 REQUIRED), మరియు ఇన్స్టాల్ చేయబడిన లైబ్రరీ యొక్క వాస్తవ సంస్కరణ సంస్కరణకు అనుకూలంగా ఉండదు 1.2.3CMake స్వయంచాలకంగా లోపాన్ని సృష్టిస్తుంది. అంటే, మీరు సంస్కరణలను మాన్యువల్గా ట్రాక్ చేయవలసిన అవసరం లేదు.
పరీక్షలను స్పష్టంగా ఉపయోగించడం నిలిపివేయబడితే సంబంధిత ఎంపిక లేదా మా ప్రాజెక్ట్ ఒక ఉపప్రాజెక్ట్, అంటే, ఇది ఆదేశాన్ని ఉపయోగించి మరొక CMake ప్రాజెక్ట్కి కనెక్ట్ చేయబడింది add_subdirectory, మేము సోపానక్రమం వెంట మరింత ముందుకు వెళ్లము మరియు పరీక్షలను రూపొందించడానికి మరియు అమలు చేయడానికి ఆదేశాలను వివరించే స్క్రిప్ట్ కేవలం అమలు చేయబడదు.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
అన్నింటిలో మొదటిది, మేము అవసరమైన పరీక్ష ఫ్రేమ్వర్క్తో ఒక ప్యాకేజీని కనుగొంటాము (మీకు ఇష్టమైన దానితో భర్తీ చేయండి).
find_package(doctest 2.3.3 REQUIRED)
పరీక్షలతో మన ఎక్జిక్యూటబుల్ ఫైల్ని క్రియేట్ చేద్దాం. సాధారణంగా నేను ఫంక్షన్ను కలిగి ఉన్న ఫైల్ను మాత్రమే ఎక్జిక్యూటబుల్ బైనరీకి నేరుగా జోడిస్తాను main.
add_executable(mylib-unit-tests test_main.cpp)
మరియు నేను ఫైల్లను జోడిస్తాను, అందులో పరీక్షలు స్వయంగా తరువాత వివరించబడతాయి. కానీ మీరు అలా చేయనవసరం లేదు.
మేము డిపెండెన్సీలను కనెక్ట్ చేస్తాము. మేము మా బైనరీకి అవసరమైన CMake లక్ష్యాలను మాత్రమే లింక్ చేసాము మరియు ఆదేశానికి కాల్ చేయలేదని దయచేసి గమనించండి target_include_directories. పరీక్ష ఫ్రేమ్వర్క్ నుండి మరియు మా నుండి శీర్షికలు Mylib::mylib, అలాగే నిర్మాణ పారామితులు (మా విషయంలో, ఇది C++ భాషా ప్రమాణం) ఈ లక్ష్యాలతో పాటుగా వచ్చాయి.
చివరగా, మేము ఒక నకిలీ లక్ష్యాన్ని సృష్టిస్తాము, దాని "బిల్డ్" అనేది నడుస్తున్న పరీక్షలకు సమానం మరియు ఈ లక్ష్యాన్ని డిఫాల్ట్ బిల్డ్కు జోడిస్తుంది (దీనికి గుణమే బాధ్యత వహిస్తుంది 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()
తరువాత, వినియోగదారు భాష వేరియబుల్ని సెట్ చేసారో లేదో తనిఖీ చేస్తాము. అవును అయితే, మేము దానిని తాకము, కాకపోతే, మేము రష్యన్ తీసుకుంటాము. అప్పుడు మేము డాక్సిజెన్ సిస్టమ్ ఫైళ్ళను కాన్ఫిగర్ చేస్తాము. కాన్ఫిగరేషన్ ప్రక్రియలో భాషతో సహా అవసరమైన అన్ని వేరియబుల్స్ అక్కడికి వెళ్తాయి (చూడండి. команду 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 ()
ఇక్కడ మనం మూడవ పైథాన్ని కనుగొని లక్ష్యాన్ని సృష్టిస్తాము 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()
యూనిట్ టెస్ట్ బిల్డ్ మరియు టార్గెట్ని డిసేబుల్ చేసే సామర్థ్యాన్ని అందిస్తుంది check. ఫలితంగా, పరీక్షల ద్వారా కోడ్ కవరేజ్ యొక్క కొలత ఆఫ్ చేయబడింది (చూడండి. MYLIB_COVERAGE).
ప్రాజెక్ట్ కమాండ్ని ఉపయోగించి ఉపప్రాజెక్ట్గా మరొక ప్రాజెక్ట్కి కనెక్ట్ చేయబడితే టెస్టింగ్ కూడా స్వయంచాలకంగా నిలిపివేయబడుతుంది add_subdirectory.
దీని కోసం సేవ ఉపయోగించబడుతుంది మంత్రదండం. వారి సర్వర్లు ఎంత సరళంగా ఉన్నాయో నాకు తెలియదు, కానీ ఈ అవకాశాన్ని దుర్వినియోగం చేయకూడదని నేను భావిస్తున్నాను.
వాస్తవానికి, ఈ సహాయంలో వివరించిన కొన్ని కన్సోల్ ఆదేశాలను అమలు చేయడానికి CMake వెర్షన్ 3.13 మాత్రమే అవసరం. CMake స్క్రిప్ట్ల సింటాక్స్ దృష్ట్యా, ఇతర మార్గాల్లో జనరేషన్ అని పిలిస్తే వెర్షన్ 3.8 సరిపోతుంది.
దీని తరువాత, మూలం కంపైల్ చేయబడిన మరియు తిరిగి కంపైల్ చేయబడిన ప్రతిసారీ స్టాటిక్ విశ్లేషణ స్వయంచాలకంగా ప్రారంభించబడుతుంది. అదనంగా ఏమీ చేయవలసిన అవసరం లేదు.
క్లాంగ్
అద్భుతమైన సాధనం సహాయంతో scan-build మీరు ఏ సమయంలోనైనా స్టాటిక్ విశ్లేషణను కూడా అమలు చేయవచ్చు:
CMake అనేది చాలా శక్తివంతమైన మరియు సౌకర్యవంతమైన వ్యవస్థ, ఇది ప్రతి రుచి మరియు రంగు కోసం కార్యాచరణను అమలు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. మరియు, వాక్యనిర్మాణం కొన్నిసార్లు చాలా కోరుకున్నప్పటికీ, దెయ్యం ఇప్పటికీ అతను చిత్రించినంత భయంకరమైనది కాదు. సమాజం మరియు ఆరోగ్యం కోసం CMake బిల్డ్ సిస్టమ్ను ఉపయోగించండి.