cmake_minimum_required(VERSION 3.16) project(grx_client CXX) set(CMAKE_CXX_STANDARD 17) # Find gRPC and Protobuf find_package(Protobuf REQUIRED) find_package(gRPC CONFIG REQUIRED) # Find the protoc and grpc_cpp_plugin executables find_program(PROTOC protoc) find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin) # Proto files to compile set(PROTO_DIR "${CMAKE_SOURCE_DIR}/proto") set(PROTO_FILES Common.proto Receiverd.proto Monitord.proto Spectrumd.proto Samplestreamingd.proto TunableChanneld.proto ) # Output directory for generated files set(GENERATED_DIR "${CMAKE_BINARY_DIR}/generated") file(MAKE_DIRECTORY ${GENERATED_DIR}) # Generate C++ sources from .proto files set(PROTO_SRCS "") set(PROTO_HDRS "") foreach(PROTO_FILE ${PROTO_FILES}) get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE) set(PB_SRC "${GENERATED_DIR}/${PROTO_NAME}.pb.cc") set(PB_HDR "${GENERATED_DIR}/${PROTO_NAME}.pb.h") set(GRPC_SRC "${GENERATED_DIR}/${PROTO_NAME}.grpc.pb.cc") set(GRPC_HDR "${GENERATED_DIR}/${PROTO_NAME}.grpc.pb.h") add_custom_command( OUTPUT ${PB_SRC} ${PB_HDR} ${GRPC_SRC} ${GRPC_HDR} COMMAND ${PROTOC} --proto_path=${PROTO_DIR} --cpp_out=${GENERATED_DIR} --grpc_out=${GENERATED_DIR} --plugin=protoc-gen-grpc=${GRPC_CPP_PLUGIN} ${PROTO_DIR}/${PROTO_FILE} DEPENDS ${PROTO_DIR}/${PROTO_FILE} COMMENT "Generating C++ sources for ${PROTO_FILE}" ) list(APPEND PROTO_SRCS ${PB_SRC} ${GRPC_SRC}) list(APPEND PROTO_HDRS ${PB_HDR} ${GRPC_HDR}) endforeach() # Build the example executables add_executable(tracked_aircraft tracked_aircraft.cpp ${PROTO_SRCS} ) target_include_directories(tracked_aircraft PRIVATE ${GENERATED_DIR}) target_link_libraries(tracked_aircraft PRIVATE gRPC::grpc++ protobuf::libprotobuf ) add_executable(modes_downlink modes_downlink.cpp ${PROTO_SRCS} ) target_include_directories(modes_downlink PRIVATE ${GENERATED_DIR}) target_link_libraries(modes_downlink PRIVATE gRPC::grpc++ protobuf::libprotobuf )