cmake_minimum_required(VERSION 3.23) project(proto LANGUAGES CXX) find_package(protobuf CONFIG REQUIRED) find_package(gRPC CONFIG REQUIRED) # Add vcpkg paths to the search find_program(PROTOC_EXECUTABLE protoc PATHS ${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-linux/tools/protobuf ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/protobuf REQUIRED NO_DEFAULT_PATH ) find_program(GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin PATHS ${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-linux/tools/grpc ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/grpc REQUIRED NO_DEFAULT_PATH ) if(NOT PROTOC_EXECUTABLE) message(FATAL_ERROR "protoc not found! Install protobuf compiler") endif() if(NOT GRPC_CPP_PLUGIN_EXECUTABLE) message(FATAL_ERROR "grpc_cpp_plugin not found! Install gRPC with C++ plugin") endif() message(STATUS "Found protoc: ${PROTOC_EXECUTABLE}") message(STATUS "Found grpc_cpp_plugin: ${GRPC_CPP_PLUGIN_EXECUTABLE}") set(PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/messages.proto ${CMAKE_CURRENT_SOURCE_DIR}/services.proto ) set(PROTO_OUT ${CMAKE_CURRENT_BINARY_DIR}) set(GENERATED_FILES ${PROTO_OUT}/messages.pb.h ${PROTO_OUT}/messages.pb.cc ${PROTO_OUT}/services.pb.h ${PROTO_OUT}/services.pb.cc ${PROTO_OUT}/services.grpc.pb.h ${PROTO_OUT}/services.grpc.pb.cc ) set(PROTO_INCLUDES "-I${CMAKE_CURRENT_LIST_DIR}" ) add_custom_command( OUTPUT ${GENERATED_FILES} COMMAND ${PROTOC_EXECUTABLE} ARGS --cpp_out=${PROTO_OUT} --grpc_out=${PROTO_OUT} --plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN_EXECUTABLE} ${PROTO_INCLUDES} ${PROTO_FILES} WORKING_DIRECTORY ${PROTO_OUT} DEPENDS ${PROTO_FILES} COMMENT "Generating protobuf files" COMMAND_EXPAND_LISTS VERBATIM ) set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE) add_library(proto_static STATIC ${GENERATED_FILES}) target_include_directories(proto_static PUBLIC ${PROTO_OUT} ) target_link_libraries(proto_static PRIVATE protobuf::libprotobuf gRPC::grpc++ )