#c #cmake #protocol-buffers #grpc
#c #cmake #протокол-буферы #grpc
Вопрос:
Локально он создает проект с помощью grpc. но на gitlab он выдает ошибку. У кого-нибудь есть какие-нибудь идеи? Локально все строится и работает хорошо. Я получаю проблему, когда использую CI в gitlab. Что может означать эта ошибка? Я не понимаю, что именно требуется? Я также пробовал работать с разными компиляторами — ошибка сохраняется.
$ cmake --build .
[ 4%] Running C gRPC compiler on include/protocol/proto/service.proto
[ 8%] Running cpp protocol buffer compiler on /builds/k-morozov/appchat/build/src/protocol
Could not map to virtual file: /builds/k-morozov/appchat/build/src/protocol: Input file is a directory.
make[2]: *** [src/protocol/CMakeFiles/protocol_lib.dir/build.make:63: src/protocol/protocol.pb.h] Error 1
make[1]: *** [CMakeFiles/Makefile2:93: src/protocol/CMakeFiles/protocol_lib.dir/all] Error 2
cmake:
cmake_minimum_required(VERSION 3.5)
set(PROTOBUF_FILES
"include/protocol/proto/messages.proto"
)
set(PROTOS_FILES
${PROTOBUF_FILES}
"include/protocol/proto/service.proto"
)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
find_package(Protobuf REQUIRED)
find_package(GRPC REQUIRED)
find_package(Threads REQUIRED)
set(PROTO_SRC_DIR ${CMAKE_CURRENT_BINARY_DIR})
file(MAKE_DIRECTORY ${PROTO_SRC_DIR})
include_directories(${PROTO_SRC_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_SRC_DIR} ${PROTOS_FILES})
grpc_generate_cpp(GRPC_SRCS GRPC_HDRS ${PROTO_SRC_DIR} ${PROTOS_FILES})
set(PROTOCOL_LIB_NAME protocol_lib)
add_library(${PROTOCOL_LIB_NAME} STATIC)
target_sources(${PROTOCOL_LIB_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include/protocol/protocol.h
PRIVATE
${PROTO_HDRS}
${PROTO_SRCS}
${GRPC_SRCS}
"include/protocol/command_table.h"
)
set_target_properties(${PROTOCOL_LIB_NAME} PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON
)
target_compile_options(${PROTOCOL_LIB_NAME} PRIVATE "-fPIC")
target_link_libraries(${PROTOCOL_LIB_NAME}
PUBLIC
gpr
gRPC::grpc
protobuf::libprotobuf
gRPC::grpc _reflection
PRIVATE
pthread
project_sanitizers
)
include_directories(${Protobuf_INCLUDE_DIRS})
target_include_directories(${PROTOCOL_LIB_NAME}
PUBLIC
"./include"
${CMAKE_BINARY_DIR}/src/protocol/
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
)
Комментарии:
1. Он пишет, что для файла запущен компилятор
/builds/k-morozov/appchat/build/src/protocol
. У вас есть этот файл? Это файл или каталог?2. это каталог, в котором хранятся файлы * .pb.h
3. На самом деле строка
Running cpp protocol buffer compiler ...
взята из модуля Protobuf , а не из grpc. Вы используетеprotobuf_generate_cpp
функцию, сигнатура которойprotobuf_generate_cpp (<SRCS> <HDRS> [<ARGN>...])
. То есть каждый параметр после второго обрабатывается как прото-файл. И среди тех параметров, которые вы передаете${PROTO_SRC_DIR}
, это каталог , а не файл . Похоже, что сообщение об ошибке относится именно к этому параметру.