cmake-library-template

Шаблон
0

Описание

Шаблон создания библиотеки CMake

Шаблон

Используйте репозиторий как шаблон для создания нового репозитория

Языки

  • CMake91,3%
  • C++8,7%
README.md

Шаблон библиотеки на CMake

Лицензия: MIT — см. файл

LICENCE
в корне репозитория.

Шаблон минимальной C++ библиотеки с готовыми CMake-модулями для:

  • генерации export-header,
  • установки и экспорта целей (static/shared),
  • создания CMake package-config (
    cmake/<project>*.cmake
    ),
  • заготовки для тестов, примеров и документации.

Файл

CMakeLists.txt
задаёт имя проекта через переменную
LIBRARY_PROJECT_NAME
(по умолчанию
Library
) — переименуйте проект перед использованием шаблона.

Содержание

Особенности

  • Требуется
    CMake
    >= 4.0.2 (см.
    cmake_minimum_required
    в
    CMakeLists.txt
    ).
  • Генерация export-header (
    cmake/ConfigureExports.cmake
    ).
  • Установка и экспорт CMake-пакета (
    cmake/<project>...-config.cmake
    и сопутствующие
    *-targets.cmake
    ).
  • Поддержка сборки static/shared через опцию
    <PROJECT_UPPER>_SHARED_LIBS
    .
  • Пресеты сборки (см.
    CMakeUserPresets.json
    ) для удобной конфигурации.
  • Заготовки для
    examples
    ,
    tests
    ,
    docs
    .

Структура репозитория

  • CMakeLists.txt
    — основной файл сборки.
  • cmake/
    — макросы и шаблоны (
    LibUtils.cmake
    ,
    ConfigureExports.cmake
    ,
    library-config.cmake.in
    ).
  • include/
    — публичные заголовки (пример
    include/library/add.hpp
    ).
  • src/
    — исходные файлы (пример
    src/add.cpp
    ).
  • tests/
    ,
    examples/
    ,
    docs/
    — заготовки для тестов, примеров и документации.
  • .clang-format
    ,
    .clang-tidy
    — правила форматирования и статической проверки.

Быстрый старт

  1. Переименуйте проект (см. раздел ниже).
  2. Сконфигурируйте и соберите (пример с использованием CMake presets):

Альтернатива — классический поток:

Переименование проекта

Чтобы превратить шаблон в свою библиотеку, выполните минимум шагов:

  1. В
    CMakeLists.txt
    измените
    set(LIBRARY_PROJECT_NAME "Library" ...)
    на имя вашего проекта (например
    MyLib
    ).
  2. Переименуйте директорию публичных заголовков
    include/library
    include/<project_lower>
    .
  3. Переименуйте
    cmake/library-config.cmake.in
    в
    cmake/<project_lower>.cmake.in
    и замените внутри все вхождения
    library
    на ваше
    project_lower
    .
  4. Замените namespace и имена заголовков в исходниках (например
    namespace Library
    namespace MyLib
    ).

Рекомендация:

Замечание: экспортируемая цель имеет вид

<project_lower>::<project_lower>
(например
library::library
) — используйте это имя в
target_link_libraries
в потребляющих проектах.

Сборка и опции

Опции задаются через переменные вида

<PROJECT_UPPER>_BUILD_TESTS
,
<PROJECT_UPPER>_BUILD_EXAMPLES
,
<PROJECT_UPPER>_INSTALL
и т.д. (например
LIBRARY_BUILD_TESTS
для проекта
Library
). Их можно задавать при конфигурации:

Тесты

После включения тестов (

-DLIBRARY_BUILD_TESTS=ON
) запускайте:

(Добавьте тесты в

tests/
и зарегистрируйте их в
CMakeLists.txt
.)

Установка и использование в других проектах

Установите пакет (например локально):

После установки появятся

cmake/<project_lower>-config.cmake
и
*-targets.cmake
. В потребляющем проекте используйте:

(Имена в

find_package
— с учётом регистра проекта; импортируемая цель — в нижнем регистре и с namespace.)

Пример (потребитель)

main.cpp
:

CMakeLists.txt
для потребитела:

Добавление зависимостей

В

CMakeLists.txt
подключайте зависимости через
find_package
и
target_link_libraries
. Пример:

В

cmake/LibUtils.cmake
есть утилита
win_copy_deps_to_target_dir
для копирования DLL/PDB на Windows.

Код-стиль и статический анализ

В репозитории уже есть

.clang-format
и
.clang-tidy
. Рекомендую:

  • применять
    clang-format
    для единообразия форматирования;
  • запускать
    clang-tidy
    и/или интегрировать статический анализ в CI;
  • добавлять unit-тесты и интегрировать их в CI.

Лицензия

Проект распространяется под лицензией MIT. Полный текст лицензии находится в файле

LICENCE
в корне репозитория. Copyright (c) 2025 M. Babenko babenoff.code@outlook.com