QCustomPlot + FetchContent

Согласно оффициальному сайту «QCustomPlot — это виджет Qt для построения графиков и визуализации данных». Репозиторий gitlab.

эпюра крутящих моментов скорее всего

эпюра крутящих моментов скорее всего

Библиотека существует с 2013 и хорошо документирована. Радует наличие примеров. Не имеет зависимостей, кроме самого Qt, что облегчает жизньперенос на другие платформы/кросс-компиляцию. Текущая ревизия 2.1.1поддерживает qt 6.4.

В институтcкие времена активно использовал для написания всевозможных сопромат-демок, что были у нас в качестве домашек и, так же активно, подсаживал на сабж сокурсников. После штатного, для того вуза delphi с его windows forms, qcp казался маной небесной.

игры с тервером

игры с тервером

Либа хороша. Единственное НО — нет интеграции в систему сборки cmake, ну или мне не удалось найти готовых. В архивах с официального сайта лежат qmake скрипты, а github наполнен демками.
Посидев с вечер, хочу поделится своими мыслями, как можно быстро подключить сие к своему cmake проекту стандартными средствами, не скачивая ручками исходников и используя пару строчек в скрипте cmake.

Cmake позволяет делать некоторые вещи во время конфигурации: ходить по url, в remote repo, распаковывать, собирать. Этим занимается FetchContent. Хрестоматийный пример предлагает воспользоваться конструкцией, где мы декларируем ресурс:

FetchContent_Declare(qcustomplot
  URL https://www.qcustomplot.com/release/2.1.1/QCustomPlot-source.tar.gz
)

Затем делаем его доступным:

FetchContent_MakeAvailable(qcustomplot)

Эта пара команд позволит скачать и распаковать исходники. Далее FetchContent попытается найти корневой CMakeLists.txt и, если он есть, выполняет add_submodule(some_extra_dir).

В каком случае не нужно вызывать FetchContent_MakeAvailable явно?

На той же странице документации описан механизм Integrating With find_package.
Он делает задекларированный ресурс видимым для find_package. Иначе говоря, если find_package(target) не обнаружил target в CMAKE_PREFIX_PATH и прочих, он обратится к FetchContent_MakeAvailable.

QCustomPlot не имеет коренового cmake list. Соответсвенно, импортировать цель библиотеки не получится. Напишем тривиальный add_library:

add_library(qcustomplot
  "${qcustomplot_SOURCE_DIR}/qcustomplot.h"
  "${qcustomplot_SOURCE_DIR}/qcustomplot.cpp"
)

qcustomplot_SOURCE_DIR определит для нас MakeAvailable.
Порядок команд видится мне согласным появления в статье. Подкрепляет догадку пример из документации о Complex Dependency Hierarchies где происходит копирование некоего someFile.c перед явным вызовом add_subdirectory.

Готовый для использования вами репо лежит по ссылке.
Пример использование через стандартный target_link_libraries:

target_link_libraries(
  ...
  qcustomplot
)

© Habrahabr.ru