рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрджрд▓рдирд╛, рдореЛрдб рдмрдирд╛рдирд╛, рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛, рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛, рдкреНрд░рджрд░реНрд╢рди рдорд╛рдкрдирд╛, рдХрд╡рд░реЗрдЬ рдПрдХрддреНрд░ рдХрд░рдирд╛, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЖрджрд┐ рдкрд╕рдВрдж рд╣реИред рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдПрдордХреЗ рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╕реАрдПрдордХреЗ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рдЗрд╕рдХреЗ рд╣рдХрджрд╛рд░ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рджреЗрдЦреЗрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдмреБрд░рд╛ рдирд╣реАрдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рджрд┐рд╢рд╛ рдХрд╛рдлреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИред
рдЗрд╕ рдиреЛрдЯ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдПрдордХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реА++ рдореЗрдВ рд╣реЗрдбрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
- рд╡рд┐рдзрд╛рдирд╕рднрд╛;
- рдСрдЯреЛрд░рди рдкрд░реАрдХреНрд╖рдг;
- рдХреЛрдб рдХрд╡рд░реЗрдЬ рдорд╛рдк;
- рд╕реНрдерд╛рдкрдирд╛;
- рдСрдЯреЛ-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг;
- рдСрдирд▓рд╛рдЗрди рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреАрдврд╝реА;
- рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг.
рдЬреЛ рдХреЛрдИ рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╛рдпрджреЗ рдФрд░ рд╕реА-рдореЗрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рд╡рд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ.
рд╕рд╛рдордЧреНрд░реА
рдЕрдВрджрд░ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдореБрдЦреНрдп CMake рдлрд╝рд╛рдЗрд▓ (./CMakeLists.txt) рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдкрд░реАрдХреНрд╖рдг/CMakeLists.txt) рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ (doc/CMakeLists.txt) рдСрдирд▓рд╛рдЗрди рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ (online/CMakeLists.txt)
рдмрд╛рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рдЙрдкрдХрд░рдг рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрдВрддрднрд╛рд╖рдг
рдЕрдВрджрд░ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛
.
тФЬтФАтФА 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 рдлрд╝рд╛рдЗрд▓ (./CMakeLists.txt)
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕реАрдПрдордХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реАрдПрдордХреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрдорд╛рдВрдб рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВред рд╕реАрдПрдордХреЗ рдХреЛ рддреБрд░рдВрдд рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдЙрд╕рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
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)
рд╣рдо рд╣реЗрдбрд░ рдХреЛ рдЕрдкрдиреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╕реАрдПрдордХреЗ рдХреЗ рдЖрдзреБрдирд┐рдХ, рдлреИрд╢рдиреЗрдмрд▓, рдпреБрд╡рд╛ рдЙрдкрдпреЛрдЧ рд╕реЗ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рд╣реЗрдбрд░, рдЧреБрдг рдЗрддреНрдпрд╛рджрд┐ред рдПрдХ рд╣реА рд▓рдХреНрд╖реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рддред рдЗрддрдирд╛ рдХрд╣рдирд╛ рдХрд╛рдлреА рд╣реИ target_link_libraries(target PRIVATE dependency)
dependency
, рд▓рдХреНрд╖реНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ target
. рдФрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ [target_]include_directories
. рдЗрд╕реЗ рдиреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред ╨▓╤Л╤А╨░╨╢╨╡╨╜╨╕╤П-╨│╨╡╨╜╨╡╤А╨░╤В╨╛╤А╤Л: $<...>
рдпрд╣ рдХрдорд╛рдВрдб рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрд╕реА рд╕реАрдПрдордХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд▓рдХреНрд╖реНрдп рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╣реЗрдбрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗ ${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()
рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдкрд░реАрдХреНрд╖рдг/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)
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рднрд╛рд╖рд╛ рдЪрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдЫреВрддреЗ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд░реВрд╕реА рд▓реЗрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдбреЙрдХреНрд╕реАрдЬрди рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рднрд╛рд╖рд╛ рд╕рд╣рд┐рдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЪрд░, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ)ред ╨║╨╛╨╝╨░╨╜╨┤╤Г 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
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 -S ╨┐╤Г╤В╤М/╨║/╨╕╤Б╤Е╨╛╨┤╨╜╨╕╨║╨░╨╝ -B ╨┐╤Г╤В╤М/╨║/╤Б╨▒╨╛╤А╨╛╤З╨╜╨╛╨╣/╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ [╨╛╨┐╤Ж╨╕╨╕ ...]
рдпрджрд┐ рд╕реАрдПрдордХреЗ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░рдг рдЙрдкрд░реЛрдХреНрдд рдЖрджреЗрд╢ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
-S
:cmake ╨┐╤Г╤В╤М/╨║/╨╕╤Б╤Е╨╛╨┤╨╜╨╕╨║╨░╨╝ -B ╨┐╤Г╤В╤М/╨║/╤Б╨▒╨╛╤А╨╛╤З╨╜╨╛╨╣/╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ [╨╛╨┐╤Ж╨╕╨╕ ...]
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
cmake --build ╨┐╤Г╤В╤М/╨║/╤Б╨▒╨╛╤А╨╛╤З╨╜╨╛╨╣/╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ [--target target]
рд╡рд┐рдХрд▓реНрдк
MYLIB_рдХрд╡рд░реЗрдЬ
cmake -S ... -B ... -DMYLIB_COVERAGE=ON [╨┐╤А╨╛╤З╨╕╨╡ ╨╛╨┐╤Ж╨╕╨╕ ...]
рд▓рдХреНрд╖реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ coverage
MYLIB_рдкрд░реАрдХреНрд╖рдг
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
рдорд╛рдпрд▓рд┐рдм-рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг
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рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реАрдПрдордХреЗ рд╕рдВрд╕реНрдХрд░рдг 3.13 рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рд╣рд╛рдпрддрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдЫ рдХрдВрд╕реЛрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕реАрдПрдордХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрджрд┐ рдкреАрдврд╝реА рдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕рдВрд╕реНрдХрд░рдг 3.8 рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
-
рдкрд░реАрдХреНрд╖рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рджреЗрдЦреЗрдВ
).╨╛╨┐╤Ж╨╕╤О MYLIB_TESTING
-
рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЙрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
.MYLIB_DOXYGEN_LANGUAGE
-
рднрд╛рд╖рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛
рдЕрдЬрдЧрд░ 3 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП
рдСрдирд▓рд╛рдЗрди рд╕реИрдВрдбрдмреЙрдХреНрд╕ .
рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рд╕реАрдПрдордХреЗ рдФрд░ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЯреВрд▓ рдХреЗ рд╕рд╛рде, рдЖрдк рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реАрдкреАрдкреАрдЪреЗрдХ
рд╕реАрдПрдордХреЗ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ 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
.
рдЕрдВрддрднрд╛рд╖рдг
рд╕реАрдПрдордХреЗ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд▓рдЪреАрд▓реА рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╣рд░ рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдФрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрднреА-рдХрднреА рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд╢реИрддрд╛рди рдЕрднреА рднреА рдЙрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЙрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдорд╛рдЬ рдФрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рд╕реАрдПрдордХреЗ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
тЖТ
рд╕реНрд░реЛрдд: www.habr.com