161 lines
5.9 KiB
CMake
161 lines
5.9 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(serial_sample CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
set(OpenGL_GL_PREFERENCE GLVND)
|
|
|
|
# ==============================================================================
|
|
# ЗАГРУЗКА ЗАВИСИМОСТЕЙ ЧЕРЕЗ FETCHCONTENT (ImGui и ImPlot)
|
|
# ==============================================================================
|
|
include(FetchContent)
|
|
|
|
# 1. Загрузка Dear ImGui
|
|
FetchContent_Declare(
|
|
imgui
|
|
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
|
GIT_TAG master
|
|
)
|
|
FetchContent_MakeAvailable(imgui)
|
|
|
|
# 2. Загрузка ImPlot
|
|
FetchContent_Declare(
|
|
implot
|
|
GIT_REPOSITORY https://github.com/epezent/implot.git
|
|
GIT_TAG master
|
|
)
|
|
FetchContent_MakeAvailable(implot)
|
|
|
|
# ==============================================================================
|
|
# НАСТРОЙКА ИСХОДНЫХ КОДОВ БИБЛИОТЕК
|
|
# ==============================================================================
|
|
# Исходники ImGui
|
|
set(IMGUI_SOURCES
|
|
${imgui_SOURCE_DIR}/imgui.cpp
|
|
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
|
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
|
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
|
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
|
|
)
|
|
|
|
# Исходники ImPlot
|
|
set(IMPLOT_SOURCES
|
|
${implot_SOURCE_DIR}/implot.cpp
|
|
${implot_SOURCE_DIR}/implot_items.cpp
|
|
${implot_SOURCE_DIR}/implot_demo.cpp
|
|
)
|
|
|
|
# ==============================================================================
|
|
# ПОИСК СИСТЕМНЫХ ПАКЕТОВ
|
|
# ==============================================================================
|
|
find_package(PkgConfig REQUIRED)
|
|
find_package(OpenGL REQUIRED)
|
|
pkg_check_modules(GLFW REQUIRED glfw3)
|
|
pkg_check_modules(LIBSERIALPORT REQUIRED IMPORTED_TARGET libserialport)
|
|
find_package(Protobuf REQUIRED)
|
|
find_package(gRPC REQUIRED)
|
|
|
|
# ==============================================================================
|
|
# ГЕНЕРАЦИЯ PROTOBUF & GRPC
|
|
# ==============================================================================
|
|
set(proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/service.pb.cc")
|
|
set(proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/service.pb.h")
|
|
set(grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/service.grpc.pb.cc")
|
|
set(grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/service.grpc.pb.h")
|
|
|
|
add_custom_command(
|
|
OUTPUT "${proto_srcs}" "${proto_hdrs}" "${grpc_srcs}" "${grpc_hdrs}"
|
|
COMMAND ${Protobuf_PROTOC_EXECUTABLE}
|
|
ARGS --grpc_out="${CMAKE_CURRENT_BINARY_DIR}"
|
|
--cpp_out="${CMAKE_CURRENT_BINARY_DIR}"
|
|
-I "${CMAKE_CURRENT_SOURCE_DIR}/proto"
|
|
--plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/proto/service.proto"
|
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/proto/service.proto"
|
|
)
|
|
|
|
set_source_files_properties(
|
|
"${proto_srcs}" "${proto_hdrs}" "${grpc_srcs}" "${grpc_hdrs}"
|
|
PROPERTIES GENERATED TRUE
|
|
)
|
|
|
|
add_library(proto_lib STATIC ${proto_srcs} ${grpc_srcs} proto/service.proto)
|
|
target_link_libraries(proto_lib PUBLIC gRPC::grpc++ ${Protobuf_LIBRARIES})
|
|
target_include_directories(proto_lib PUBLIC
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
${Protobuf_INCLUDE_DIRS}
|
|
)
|
|
|
|
# ==============================================================================
|
|
# СБОРКА ОСНОВНОГО ПРИЛОЖЕНИЯ
|
|
# ==============================================================================
|
|
add_executable(${PROJECT_NAME} main.cpp
|
|
${IMGUI_SOURCES}
|
|
${IMPLOT_SOURCES}
|
|
sources/SerialApp.cpp
|
|
include/SerialApp.h
|
|
sources/ConnectionWindow.cpp
|
|
include/ConnectionWindow.h
|
|
sources/PayloadWindow.cpp
|
|
include/PayloadWindow.h
|
|
sources/LogWindow.cpp
|
|
include/LogWindow.h
|
|
)
|
|
|
|
target_include_directories(${PROJECT_NAME} PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
${Protobuf_INCLUDE_DIRS}
|
|
${imgui_SOURCE_DIR}
|
|
${imgui_SOURCE_DIR}/backends
|
|
${implot_SOURCE_DIR}
|
|
${GLFW_INCLUDE_DIRS}
|
|
${OPENGL_INCLUDE_DIR}
|
|
)
|
|
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE
|
|
${GLFW_LIBRARIES}
|
|
OpenGL::GL
|
|
X11
|
|
pthread
|
|
dl
|
|
PkgConfig::LIBSERIALPORT
|
|
proto_lib
|
|
)
|
|
|
|
configure_file(style/dracula.theme ${CMAKE_CURRENT_BINARY_DIR}/dracula.theme COPYONLY)
|
|
|
|
|
|
#Является частой практикой в больших проектах для поддержки
|
|
#единой схемы данныхмежду сервером и клиентом.
|
|
#Если .proto лежит в отдельном Git-репозитории на сервере
|
|
#лучше использовать FetchContent. Он корректно кэширует файлы
|
|
#и обновляет их только при смене тега или хэша коммита.
|
|
#```
|
|
#FetchContent_Declare(
|
|
#remote_proto
|
|
#GIT_REPOSITORY git@your-server.com:shared/protocols.git # URL вашего репозитория
|
|
#GIT_TAG main # Ветка, тег или хэш коммита
|
|
#)
|
|
#FetchContent_MakeAvailable(remote_proto)
|
|
#```
|
|
#Теперь файл доступен по пути: ${remote_proto_SOURCE_DIR}/service.proto
|
|
#
|
|
#не забыть обновить команду компиляции Protobuf,
|
|
#заменив локальные пути на пути из FetchContent:
|
|
#```
|
|
#add_custom_command(
|
|
#OUTPUT "${proto_srcs}" "${proto_hdrs}" "${grpc_srcs}" "${grpc_hdrs}"
|
|
#COMMAND ${Protobuf_PROTOC_EXECUTABLE}
|
|
#ARGS --grpc_out="${CMAKE_CURRENT_BINARY_DIR}"
|
|
#--cpp_out="${CMAKE_CURRENT_BINARY_DIR}"
|
|
#-I "${remote_proto_SOURCE_DIR}" # Корневая папка для импортов
|
|
#--plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin
|
|
#"${REMOTE_PROTO_PATH}" # Сам файл
|
|
#DEPENDS "${REMOTE_PROTO_PATH}"
|
|
#)
|
|
#```
|