เดตเดฟเดเดธเดจ เดธเดฎเดฏเดคเตเดคเต, เดเดเดชเตเดฒเดฑเตเดเตพ เดฎเดพเดฑเตเดฑเดพเดจเตเด เดฎเตเดกเตเดเตพ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเดจเตเด เดกเดฟเดชเตปเดกเตปเดธเดฟ เดชเดคเดฟเดชเตเดชเตเดเตพ เดจเดเดคเตเดคเดพเดจเตเด เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดตเดฟเดถเดเดฒเดจเด เดจเดเดคเตเดคเดพเดจเตเด เดชเตเดฐเดเดเดจเด เด เดณเดเตเดเดพเดจเตเด เดเดตเดฑเตเดเต เดถเตเดเดฐเดฟเดเตเดเดพเดจเตเด เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป เดธเตเดทเตเดเดฟเดเตเดเดพเดจเตเด เดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต. เดเดพเตป CMake เดถเดฐเดฟเดเตเดเตเด เดเดทเตเดเดชเตเดชเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เดเดจเดฟเดเตเดเต เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเตเดฒเตเดฒเดพเด เดเตเดฏเตเดฏเดพเตป เดเดคเต เดเดจเตเดจเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
เดชเดฒเดฐเตเด CMake เดตเดฟเดฎเตผเดถเดฟเดเตเดเตเดจเตเดจเต, เดชเดฒเดชเตเดชเตเดดเตเด เด เดคเต เด เตผเดนเดฟเดเตเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดจเดฟเดเตเดเตพ เด เดคเต เดจเตเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดเดฒเตเดฒเดพเด เด เดคเตเดฐ เดฎเตเดถเดฎเดฒเตเดฒ, เด เดเตเดคเตเดคเดฟเดเต เดเดเตเดเตเด เดฎเตเดพเดทเดฎเดฒเตเดฒ, ะธ ะฝะฐะฟัะฐะฒะปะตะฝะธะต ัะฐะทะฒะธัะธั ะฒะฟะพะปะฝะต ะฟะพะทะธัะธะฒะฝะพะต.
เด เดเตเดฑเดฟเดชเตเดชเดฟเตฝ, CMake เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ C++ เตฝ เดเดฐเต เดนเตเดกเตผ เดฒเตเดฌเตเดฐเดฑเดฟ เดเดเตเดเดจเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดเตผเดเดจเตเดธเตเดเตเดฏเตเดฏเดพเดฎเตเดจเตเดจเต เดเดพเตป เดจเดฟเดเตเดเดณเตเดเต เดชเดฑเดฏเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต:
- เด เดธเดเดฌเตเดฒเดฟ;
- เดเดเตเดเตเดฑเตบ เดเตเดธเตเดฑเตเดฑเตเดเตพ;
- เดเตเดกเต เดเดตเดฑเตเดเต เด เดณเดเตเดเตฝ;
- เดเตปเดธเตเดฑเตเดฑเดฒเตเดทเตป;
- ะะฒัะพะดะพะบัะผะตะฝัะธัะพะฒะฐะฝะธะต;
- ะะตะฝะตัะฐัะธั ะพะฝะปะฐะนะฝ-ะฟะตัะพัะฝะธัั;
- เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดตเดฟเดถเดเดฒเดจเด.
เดจเตเดเตเดเดเตเดเดณเตเด เดธเดฟ-เดฎเตเดเตเดเตเดเดณเตเด เดเดคเดฟเดจเดเด เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเดจเตเดจ เดเตผเดเตเดเตเด เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดเตเดฏเตเดฏเดพเด
ัะบะฐัะฐัั ัะฐะฑะปะพะฝ ะฟัะพะตะบัะฐ เด เดคเต เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดคเตเดเดเตเดเตเด.
เดเดณเตเดณเดเดเตเดเด
ะัะพะตะบั ะธะทะฝัััะธ เดชเดฆเตเดงเดคเดฟเดฏเตเดเต เดเดเดจ เดชเตเดฐเดงเดพเดจ CMake เดซเดฏเตฝ (./CMakeLists.txt) เดชเดฆเตเดงเดคเดฟ เดตเดฟเดตเดฐเดเตเดเตพ เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดเดชเตเดทเดจเตเดเตพ เดธเดฎเดพเดนเดฐเดฃ เดเดชเตเดทเดจเตเดเตพ เดชเตเดฐเดงเดพเดจ เดฒเดเตเดทเตเดฏเด เดเตปเดธเตเดฑเตเดฑเดฒเตเดทเตป เดเตเดธเตเดฑเตเดฑเตเดเตพ เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป ะะฝะปะฐะนะฝ-ะฟะตัะพัะฝะธัะฐ
เดเตเดธเตเดฑเตเดฑเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต (test/CMakeLists.txt) เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเดจเดพเดฏเตเดณเตเดณ เดธเตโเดเตเดฐเดฟเดชเตเดฑเตเดฑเต (doc/CMakeLists.txt) ะกะบัะธะฟั ะดะปั ะพะฝะปะฐะนะฝ-ะฟะตัะพัะฝะธัั (online/CMakeLists.txt)
ะัะพะตะบั ัะฝะฐััะถะธ เดเดชเดเดฐเดฃเดเตเดเตพ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดตเดฟเดถเดเดฒเดจเด Afterword
ะัะพะตะบั ะธะทะฝัััะธ
เดชเดฆเตเดงเดคเดฟเดฏเตเดเต เดเดเดจ
.
โโโ 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 ()
ะกะบัะธะฟั ะดะปั ะพะฝะปะฐะนะฝ-ะฟะตัะพัะฝะธัั (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, ัะพััะพะธั ะธะท ะดะฒัั ััะฐะฟะพะฒ:
เดคเดฒเดฎเตเดฑ
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-เดเตเดธเตเดฑเตเดฑเตเดเตพ
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
เดเดชเดเดฐเดฃเดเตเดเตพ
-
CMake 3.13ะะฐ ัะฐะผะพะผ ะดะตะปะต ะฒะตััะธั CMake 3.13 ััะตะฑัะตััั ัะพะปัะบะพ ะดะปั ะทะฐะฟััะบะฐ ะฝะตะบะพัะพััั ะบะพะฝัะพะปัะฝัั ะบะพะผะฐะฝะด, ะพะฟะธัะฐะฝะฝัั ะฒ ะดะฐะฝะฝะพะน ัะฟัะฐะฒะบะต. ะก ัะพัะบะธ ะทัะตะฝะธั ัะธะฝัะฐะบัะธัะฐ CMake-ัะบัะธะฟัะพะฒ ะดะพััะฐัะพัะฝะพ ะฒะตััะธะธ 3.8, ะตัะปะธ ะณะตะฝะตัะฐัะธั ะฒัะทัะฒะฐัั ะดััะณะธะผะธ ัะฟะพัะพะฑะฐะผะธ.
-
เดเตเดธเตเดฑเตเดฑเดฟเดเดเต เดฒเตเดฌเตเดฐเดฑเดฟ
เดกเตเดเตเดเตผ เดชเดฐเดฟเดถเตเดงเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดเตเดเดพเด (เดเดพเดฃเตเด
).ะพะฟัะธั 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
.
Afterword
CMake เดเดจเตเดจเดคเต เดตเดณเดฐเต เดถเดเตเดคเดตเตเด เดตเดดเดเตเดเดฎเตเดณเตเดณเดคเตเดฎเดพเดฏ เดเดฐเต เดธเดเดตเดฟเดงเดพเดจเดฎเดพเดฃเต, เด เดคเต เดเดฐเต เดฐเตเดเดฟเดเตเดเตเด เดจเดฟเดฑเดคเตเดคเดฟเดจเตเด เดตเตเดฃเตเดเดฟเดฏเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. เดเตเดเดพเดคเต, เดตเดพเดเตเดฏเดเดเดจ เดเดฟเดฒเดชเตเดชเตเดดเตเดเตเดเต เดเดเตเดฐเดนเดฟเดเตเดเดคเตเดคเดเตเดเดตเดฟเดงเด เด เดตเดถเตเดทเดฟเดเตเดเตเดจเตเดจเตเดฃเตเดเตเดเตเดเดฟเดฒเตเด, เดชเดฟเดถเดพเดเต เดเดชเตเดชเตเดดเตเด เด เดตเตป เดตเดฐเดเตเดเดคเตเดชเตเดฒเต เดญเดฏเดเตเดเดฐเดจเดฒเตเดฒ. เดธเดฎเตเดนเดคเตเดคเดฟเดจเตเด เดเดฐเตเดเตเดฏเดคเตเดคเดฟเดจเตเด เดตเตเดฃเตเดเดฟ CMake เดฌเดฟเตฝเดกเต เดธเดฟเดธเตเดฑเตเดฑเด เดเดชเดฏเตเดเดฟเดเตเดเตเด.
โ
เด เดตเดฒเดเดฌเด: www.habr.com