Твій охайний шаблон для C++ програми за адресою GitHub репозиторію https://github.com/yuriysydor1991/cpp-app-template
Ціль проекту-шаблону
Проект-шаблон призначений для пришвидшення процесу побудови програми на стадії започаткування проекту за допомогою готової початкової структури програми. Отож розробник може одразу перейти до реалізації конкретної програми з мінімальними затратами на базову структуру.
Полегшує вийти за рамки коду - створюй складні і готові для постачання програмний продукти швидко!
Дозволяє стрімке створення завершеного програмного продукту - на противагу звичайного куска коду чи простої програми.
Шаблонний проект не являється фреймворком у традиційних термінах, отож інфраструктурні елементи можна змінювати за бажанням або видалити за непотреби.
Створи форк і одразу реалізуй програму!
Спеціалізації шаблонного проекту
Переглянь доступні гілки у репозиторії проекту-шаблону і використай найбільш підходящу спеціалізацію або комбінуй декілька гілок щоб створити необхідну структуру шаблону:
Базова структура програми
- гілка main розміщена на [GitHub, GitLab] - один файл з функцією
mainі з усіма можливими інтеграціями для генерації одного бінарного виконуваного файлу. - гілка app розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу.
- гілка applib розміщена на [GitHub, GitLab] яка складається з класів бінарного виконуваного файлу з додатковими інфраструктурними класами для генерації підключаємої бібліотеки і заголовкових файлів (доступні для встановлення), що призначені для поширення коду бібліотеки для повторного перевикористання іншими бінарними файлами.
- гілка lib розміщена на [GitHub, GitLab] і яка призначена для предоставляння початкової інфраструктури для реалізації бібліотеки разом з заголовковими підключаємими файлами і документацією за необхідності.
- гілка appMeson розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу разом з системою побудови Meson.
- гілка applibMeson розміщена на [GitHub, GitLab] - шаблон застосунку з виконуваним файлом та додатковою окремою бібліотекою з заголовковими підключаємими файлами (доступними для встановлення) для повторного використання коду бібліотеки в кількох застосунках, побудований системою Meson, що знаходиться проектами-споживачами на Meson через
dependency()(pkg-config) з опціональною підтримкою CMakefind_package(). - гілка libMeson розміщена на [GitHub, GitLab] - шаблон бібліотеки з заголовковими підключаємими файлами і документацією, побудованою системою Meson, що знаходиться проектами-споживачами на Meson через
dependency()(pkg-config) з опціональною підтримкою CMakefind_package().
Логування
- гілка appLog4Cpp5 розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням багатофункціональної бібліотеки логування повідомлень log4cpp.
- гілка appBoostLog розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням бібліотеки логування повідомлень Boost.Log.
Віконні системи / GUI
- гілка appQt6 розміщена на [GitHub, GitLab] яка містить загальні класи для генерації бінарного виконуваного файлу разом з структурою заданою для розробки віконної програми на базі Qt6 разом з QML.
- гілка appGtkmm3 розміщена на [GitHub, GitLab] яка містить загальні класи для генерації бінарного виконуваного файлу разом з структурою заданою для розробки віконної програми на базі Gtkmm-3.0 з C++.
- гілка appGtkmm3Glade розміщена на [GitHub, GitLab] яка містить загальні класи для генерації бінарного виконуваного файлу разом з структурою заданою для розробки віконної програми на базі C++ з Gtkmm-3.0 і Glade - програми для створення візуальних інтерфейсів.
- гілка appGtkmm4 розміщена на [GitHub, GitLab] яка містить загальні класи для генерації бінарного виконуваного файлу разом з структурою заданою для розробки віконної програми на базі Gtkmm-4 з C++.
- гілка appwxWidgets розміщена на [GitHub, GitLab] яка містить загальні класи для генерації бінарного виконуваного файлу разом з структурою заданою для розробки кросплатформної віконної програми на базі wxWidgets з C++, що надається через CMake FetchContent.
3D / OpenGL / Vulkan
- гілка appSDL3 розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу разом з початковою інфраструктурою для розробки у OpenGL 3D разом з SDL3 і набагато більше!
- гілка appSDL2 розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу разом з початковою інфраструктурою для розробки у OpenGL 3D разом з SDL2 і набагато більше!
- гілка appGtkmm4GLArea розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу, що вбудовує рендеринг OpenGL безпосередньо у вікно Gtkmm-4 за допомогою нативного віджета Gtk::GLArea.
- гілка appQt6GLArea розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу, що вбудовує рендеринг OpenGL безпосередньо у вікно Qt6 QML за допомогою елемента сцен-графа QQuickFramebufferObject.
- гілка appSFML розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу разом з початковою інфраструктурою на базі мультимедійної бібліотеки SFML (2D графіка, вікна, ввід та доступ до OpenGL), яка надається системним пакетом або резервним механізмом CMake FetchContent.
- гілка appFreeGlut розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу разом з початковою інфраструктурою для розробки у OpenGL 3D разом з FreeGlut.
- гілка appQt6Vulkan розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу, що створює інстанс Vulkan через нативний Qt6 QVulkanInstance (
Qt6::Gui), перелічує доступні фізичні пристрої (відеокарти), виводить їхні властивості через журнал програми та показує порожнє чорне вікно, відмальоване засобами Vulkan (QVulkanWindow, очищене до чорного кольору) протягом роботи циклу подій Qt. - гілка appGtkmm4Vulkan розміщена на [GitHub, GitLab] яка містить загальні класи для генерації одинарного бінарного виконуваного файлу, що створює інстанс Vulkan через сирий завантажувач Vulkan, перелічує доступні фізичні пристрої (відеокарти) та виводить їхні властивості через журнал програми, після чого відмальовує чорний кадр засобами Vulkan у позаекранне зображення та показує його у вікні Gtkmm-4 через Linux dma-buf (Gdk::DmabufTexture), оскільки GTK4 не має нативного віджета для рендерингу Vulkan.
Web / HTTP / Мережа
- гілка appWt4 розміщена на [GitHub, GitLab] - шаблон з інфраструктурою для швидкого старту реалізації Web-програми на основі Wt C++ фулстек фреймворку.
- гілка appBoostBeast розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки Web-програми з використанням швидкого HTTP сервера Beast від Boost.
- гілка appCURL розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням бібліотеки-клієнта CURL для завантажень даних з мережі і яка підтримує багато протоколів (включаючи HTTP).
Системи керування базами даних (СУБД) / SQL / NoSQL
- гілка appPgSQLxx розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням СУБД PostgreSQL.
- гілка appFirebird розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням СУБД Firebird через рідну клієнтську бібліотеку (fbclient).
- гілка appMySQLCppConn розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням СУБД MySQL.
- гілка appSQLiteCpp3 розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням СУБД SQLite через бібліотеку SQLiteCpp.
- гілка appMongoDBCpp4 розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням NoSQL СУБД MongoDB.
Візуалізація даних / Графіки / Діаграми
- гілка appMatPlotxx розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням MatPlot++ - бібліотеки для малювання графіків на основі програми gnuplot і Qt6.
- гілка appPLplot розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням PLplot - потужної бібліотеки генерації графіків котра використовується у наукових програмах з багатьма інтерфейсами для різних віконних систем і мов програмування, і можливостями експорту у найпопулярніші формати зображень (PNG, SVG, JPEG, GIF, PDF і інші).
- гілка appQt6ChartView розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту візуалізації даних і малювання графіків безпосередньо у вікні Qt6 QML за допомогою вбудованого елемента ChartView з модуля QtCharts.
Карти
- гілка appGtkmm4LeafLet розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу з використанням Gtkmm-4 з WebKitGtk і картами LeafLet.
- гілка appQt6LeafLet розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу разом з Qt6/QML і WebView QML а також картами LeafLet.
- гілка appQt6QtLocation розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу що відображає мапу OpenStreetMap рідними засобами безпосередньо у вікні Qt6/QML за допомогою елемента Map з модуля Qt Location (рідний відповідник гілки appQt6LeafLet на основі WebView).
Компʼютерний зір / Обробка зображень
- гілка appOpenCV розміщена на [GitHub, GitLab] котра містить інфраструктуру для швидкого старту розробки застосунку з використанням бібліотеки компʼютерного зору OpenCV.
Системні шини / DBus
- гілка appSDBusCxxClient розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу з використанням бібліотеки sdbus-c++ від Kistler-Group для побудови клієнта сервісів розміщених на шині DBus.
- гілка appSDBusCxxServer розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу з використанням бібліотеки sdbus-c++ від Kistler-Group для побудови сервера на шині DBus.
- гілка appQt6QtDBusClient розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу що зчитує загальну системну інформацію зі служби systemd-hostnamed через шину DBus за допомогою рідного модуля Qt6 QtDBus і відображає її у вікні QML (відповідник гілки appSDBusCxxClient на основі sdbus-c++ для фреймворку Qt6).
- гілка appGtkmm4GDBusClient розміщена на [GitHub, GitLab] яка містить загальні інфраструктурні класи програми для генерації одинарного бінарного виконуваного файлу що зчитує загальну системну інформацію зі служби systemd-hostnamed через шину DBus за допомогою рідного стеку GLib GDBus через Gtkmm-4/giomm
Gio::DBusі виводить її у журнал застосунку (відповідник гілки appSDBusCxxClient на основі sdbus-c++ для фреймворку gtkmm4).
Редагуй файли README.md і CHANGELOG.md щоб документація відповідала впровадженому коду. Для перекладів файлу README.md:
- uk_UA за відносною адресою doc/README.uk_UA.md
Вбудовані можливості та інтеграції
Окрім спеціалізованих гілок, проект-шаблон містить набір вбудованих, вмикаємих за потреби (opt-in) інтеграцій та цілей CMake, які активуються відповідними змінними під час конфігурування. Детальні інструкції з вмикання кожної з них наведені у файлі README.md та у відповідних розділах документації під doc/sections/.
Системи побудови
- CMake - основна система побудови у більшості гілок.
- Meson - доступна у гілках appMeson та libMeson.
Генерація пакетів
- DEB (Debian/Ubuntu) через CPack.
- RPM (Fedora/openSUSE та інші) через CPack.
- FreeBSD pkg через CPack (працює лише на FreeBSD).
- WIX MSI для MS Windows через CPack.
- flatpak - універсальний пакет для GNU/Linux.
- snap - універсальний пакет для GNU/Linux.
Інтеграції бібліотек
- JSON: nlohmann/json.
- Мережа: libcurl.
- XML: libxml2.
- Стиснення: zlib.
- Формати зображень: libpng, libjpeg, libwebp, giflib (GIF), libtiff (TIFF), lunasvg (SVG), OpenEXR (EXR/HDR), OpenJPEG (JPEG 2000), libavif (AVIF), libheif (HEIF/HEIC).
Якість коду, аналіз та профілювання
- Юніт-тести на базі Google Test (запуск через ctest).
- Форматування коду clang-format.
- Статичний аналіз коду cppcheck та clang-tidy.
- Перевірка використання памʼяті за допомогою Valgrind.
- Профілювання за допомогою gprof та Valgrind/Callgrind.
- Перевірки під час виконання програми (sanitizers).
CI/CD, контейнери та документація
- Збірка та запуск у контейнері Docker.
- Конвеєр Jenkins всередині Docker-контейнера.
- Генерація документації за допомогою Doxygen.
Клонування C++ проекту-шаблону
Щоб негайно розпочати реалізування нової програми зклонуй поточний проект у свою локальну директорію, виконавши наступну команду в терміналі (для GNU/Linux):
git clone https://github.com/yuriysydor1991/cpp-app-template.git
або
git clone https://gitlab.com/yuriysydor1991/cpp-app-template.git
Після успішного виконання даної команди у поточній відкритій директорії повинна з'явитись нова під директорія cpp-app-template. Отож відкрий її за допомогою команди cd cpp-app-template.
Щоб одразу перейти до бажаної спеціалізації, переключись на відповідну гілку, наприклад:
git checkout appQt6
Створення форку і заміна оригінального репозиторію
Для того щоб увесь вміст проекту-шаблону скопіювати у свій чистий новостворений git-репозиторій (без жодних файлів на подобі README.md, .gitignore, LICENCE або будь-яких інших), зклонуй поточний проект-шаблон cpp-app-template у свою локальну директорію і виконай заміну посилання оригінального рипозиторію на власний всередині директорії проекту-шаблону:
# Заміни наступний URL на власний з нового репозиторію
git remote set-url origin https://github.com/yuriysydor1991/cpp-app-template.git
Заміни оригінальне посилання проекту-шаблону https://github.com/yuriysydor1991/cpp-app-template.git на власний від свого новоствореного git-репозиторію.
Для того щоб перевірити чи замінився URL для проекту-шаблону (куди будуть надсилатись усі зміни) необхідно виконати наступну команду:
git remote -v
Після виконання якої у терміналі повинно висвітлитись нове посилання на новий проект.
Тепер можна скопіювати усі зміни до нового розміщення, виконуючи наступну команду:
git push
Створення форку може бути виконаним через Web-панель інтерфейсу git.
Конфігурування і побудова шаблонного проекту
Щоб дізнатись як будувати обрану гілку проекту-шаблону необхідно звернутись до корінного файлу README.md у якому детально роз'яснені команди для конфігурування проекту і його компіляції, а також спосіб вмикання кожної з вбудованих можливостей та інтеграцій. Документація поділена на окремі розділи у директорії doc/sections/ (доступні мовами en_US та uk_UA).
Також в кожному з цих README.md файлів описані вимоги до наявних інструментів і ресурсів ОС для його побудови.
Підтримай проект!
Підтримай проект за посиланням http://kytok.org.ua/page/pozertvy