Per progressionem placet mutare compilatores, modos aedificare, versiones dependentiae, analysin static efficere, modum effectus, colligere coverage, documenta generare, etc. Et vere amo CMake quia permittit me omnia facere quae volo.
Multi reprehendunt CMake, et saepe merito, sed si bene spectes, non omnia mala sunt, et nuper. Nec omninoac directio evolutionis omnino affirmativa est.
In hac nota tibi dicere volo quomodo bibliothecam principalem in C ++ in CMake systemate simpliciter instituas ut sequentes functiones accipias:
Conventus;
Probat Autoruni;
Codicis coverage mensurae;
Institutionem;
Auto- documentum;
Online sandbox generation;
Analysis statice.
Qui iam intelligit commoda et C-facere potest simpliciter download project template et satus utendo.
Maxime loquemur quomodo scripta CMake ordinanda sunt, ergo singillatim discutientur. Quisque videre potes reliquum files directe in Formula project pagina.
Imprimis, postulare debes CMake versionem debitam systematis. CMake evolvendo, mandatum signaturae et mores in diversis conditionibus mutantur. Ut CMake ad ea quae ex eo cupimus statim intellegamus, necesse est ut statim notare nostra requisita pro eo.
cmake_minimum_required(VERSION 3.13)
Deinde designabimus consilium nostrum, nomen, versionem, linguas adhibitas, etc. команду project).
In hoc casu lingua indicamus CXX (hoc significat C++) ut CMake non intendit et investigat pro C compilator linguae (per default CMake duas linguas: C et C++).
project(Mylib VERSION 1.0 LANGUAGES CXX)
Hic statim inspicere potes num consilium nostrum in alio incluso includatur tamquam subiectum. Hoc multum proderit in futurum.
Primum optio est MYLIB_TESTING - ut disable unitas probat. Hoc sit necessarium, si certi sumus omnia ordinare cum tentationibus, sed solum volumus, exempli gratia, inaugurationem vel sarcinam propositi nostri. Vel consilium nostrum includitur ut subprojectum - in hoc casu, uter nostri consilii non est interested in currendo nostras probationes. Non probas clientelas uteris?
Praeterea optionem separatam faciemus MYLIB_COVERAGE ad mensurandum codicem coverage per probationes, sed instrumenta additional requiret, ut explicite efficere possit.
Bibliotheca nostra tantum consistit in files header, quod significat nos non habemus in forma bibliothecae static vel dynamicae. Aliunde vero, ut nostra bibliotheca extrinsecus utatur, institui debet, necesse est ut deprehendatur in systemate et connexo cum consilio tuo, et simul iisdem capitibus, ac fortasse nonnullis additis; adnectuntur ei proprietates.
Modern, fashionable, adolescentia uti CMake implicat capitis, possessiones, etc. traducitur per unum unum scopum. Sufficit ergo hoc dicere target_link_libraries(target PRIVATE dependency)et omnes capitis qui cum scopo coniunguntur dependency, erit praesto ad scopum pertinentes target. Et non opus est omnibus [target_]include_directories. Hoc infra in analysi demonstrabitur CMake scriptor unitatis probat.
Hoc mandatum adnectitur praefectis quibus opus est cum bibliotheca nostra interfaciei, et si bibliotheca nostra cuilibet scopo in eadem CMake hierarchia coniuncta, tum caput ex directorio associetur. ${CMAKE_CURRENT_SOURCE_DIR}/include, et si bibliotheca nostra in systemate instituatur et alteri adnexa utens mandato find_package, tum capitis ex indicem cum eo coniungetur include ad institutionem presul.
Vexillum linguae transeamus. Nempe ipsa ultima. Eodem tempore non solum vexillum comprehendimus, sed etiam porrigimus iis qui nostra bibliotheca utentur. Hoc fit ex eo quod paro proprietas categoriam habet INTERFACE (Am. target_compile_features imperium).
Alias nostras bibliothecam faciamus. Praeterea, ad pulchritudinem, in speciali "nominis spatio" erit. Hoc utile erit, cum in nostra bibliotheca diversi moduli apparent, eosque separatim inter se coniungemus. Sicut in Busta, e.g.
Sequens carmen hoc modo intelligendum est. Cum in tertia parte consilii imperium vocamus find_package(Mylib 1.2.3 REQUIRED)ac vera versio bibliothecae inauguratus cum versioni repugnat 1.2.3CMake sponte generabit errorem. Hoc est, versiones manuales indagare non debes.
Nisi probat erret expressis verbis utens correspondentes optionem vel consilium nostrum est subpro- iectum, id est, annexum alteri CMake proiecto utens imperio add_subdirectoryulterius per Hierarchiam non movemur, et scriptura, quae praecepta generandi ac cursus probationes describit, simpliciter non currit.
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
clientelas conectimus. Quaeso nota nos tantum CMake scuta coniungi quae binario nostro necessaria sunt nec mandatum vocavimus target_include_directories. Capitula ex testi compage et ex nostra Mylib::mylibatque parametri (in nostro casu, hoc est vexillum linguae C++) cum his metis pervenerunt.
Denique scopum phantasticum creamus, cuius "aedificare" aequivalet cum probationibus currentibus, hoc clypeum addimus ad fabricandum default (proprietas huius responsabilis est. ALL). Hoc significat quod default aedificandi triggers probationes ad currendum, significationes numquam eas currere obliviscetur.
add_custom_target(check ALL COMMAND mylib-unit-tests)
Deinde efficimus codicem mensurationis coverage si optio opportuna specificatur. Singula non ingrediar, quia plus referunt instrumentum ad coverage metiendae quam CMake. Solum interest notare quod finis ex eventibus creabitur coveragecum quo commode metiri coverage committitur.
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()
Deinde inspicimus utrum usor linguam variabilem ponat. Si sic, non tangimus, sin minus, sumimus Russicum. Deinde configuramus tabularum systematis Doxygen. Omnes variabiles necessariae, incluso sermone, ibi per processum conformationem ituri (videatur. команду configure_file).
Deinde finis creare doc, quae documenta gignere incipiet. Cum documenta generare non est maxima necessitas in processu evolutionis, scopus per defaltam non poterit, explicite deduci debebit.
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 ()
Hic tertiam Pythonem invenimus et scopo creamus wandboxquae petitio debita servitio API . generat Wandboxac dimittit. Responsum venit cum ligamento sandbox perfecti.
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()
Facultatem praebet inactivandi unitas test constructum et scopum check. Quam ob rem mensuratio codicis coverage per probationes subversa est (videatur. MYLIB_COVERAGE).
Testis etiam automatice debilis est, si consilium alteri incepto coniungitur ut subiectum cum imperio utens add_subdirectory.
Re vera, CMake versio 3.13 tantum requiritur ad aliquid decurrendum de mandatorum console hoc auxilio descriptorum. Secundum syntaxin scriptorum CMake, versio 3.8 satis est si aliis modis generatio appellatur.
CMake ratio validissima est et flexibilis quae te permittit ad omnem saporem et colorem functionem efficiendam. Et licet syntaxin aliquando multum appetenda relinquit, diabolus tamen non tam terribilis est quam pingitur. Utere CMake systema aedificandi ad utilitatem societatis et sanitatis.