Cmake 3.1 + "Protobuf_IMPORT_DIRS" при импорте очередной ошибки .proto - PullRequest
0 голосов
/ 06 мая 2020

Я все еще новичок в CMAKE, но я использую find_package(Protobuf Requried) для компиляции моих файлов .proto как части сборки, и у меня проблемы с запуском импорта, и я в порядке

У меня есть 2 файла .proto в одном каталоге, «protobuf» с именем «A.proto» и «B.proto»

Без импорта они компилируются нормально.

Если я изменю A.proto для импорта в B:

syntax = "proto3";
import "B.proto";


message MyMessage
{}

С файлом CMakeLists.txt, который правильно устанавливает переменную Protobuf_IMPORT_DIRS (я думаю):

find_package(Protobuf REQUIRED)
set(Protobuf_IMPORT_DIRS ${Protobuf_IMPORT_DIRS} ${CMAKE_SOURCE_DIR}/protobuf) 

...

protobuf_generate(TARGET ${MY_PROJECT_NAME})

Я получаю это при сборке:

  Running cpp protocol buffer compiler on protobuf/A.proto
  B.proto: File not found.
  protobuf/A.proto:3:1: Import "B.proto" was not found or had errors.

Любая помощь будет очень признательна, так как я чувствую, что принимаю сумасшедшие таблетки! :)

1 Ответ

0 голосов
/ 08 мая 2020

Итак, я нашел ответ, хотя это потребовало некоторого взлома. В основном я просто читал все файлы CMAKE, связанные с Protobuf, пока не разобрался. Возможно, там есть документы получше, но я не смог найти.

Краткая история:

если вы вызываете PROTOBUF_GENERATE_CPP, он учитывает установку переменной Protobuf_IMPORT_DIRS.

Однако, если вы напрямую вызываете protobuf_generate для цели, как я, переменная игнорируется.

Ответ - вызвать protobuf_generate с аргументом IMPORT_DIRS, например:

protobuf_generate(TARGET ${MY_PROJECT_NAME} IMPORT_DIRS protobuf)

IMPORT_DIRS - это несколько аргументов, вы можете указать несколько.

Вот соответствующий код:

function(protobuf_generate)
  include(CMakeParseArguments)

  set(_options APPEND_PATH)
  set(_singleargs LANGUAGE OUT_VAR EXPORT_MACRO PROTOC_OUT_DIR PLUGIN)
  if(COMMAND target_sources)
    list(APPEND _singleargs TARGET)
  endif()
  set(_multiargs PROTOS IMPORT_DIRS GENERATE_EXTENSIONS)

  cmake_parse_arguments(protobuf_generate "${_options}" "${_singleargs}" "${_multiargs}" "${ARGN}")

Надеюсь, это избавит кого-то от головной боли в будущем !

...