Целевая зависимость CMake для компиляции файлов protobuf - PullRequest
1 голос
/ 18 июня 2019

Я хочу создать статическую библиотеку c ++ из некоторых protobuf определений с cmake/make.
. Я сделал пользовательский COMMAND для компиляции protobuf в c++ и установил его какPRE_BUILD зависимость от моей статической библиотеки.

project(mylib)

set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")

file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
foreach(PROTO_FILE in ${PROTO_FILES})
    string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCE ${PROTO_FILE})
    list(APPEND OUTPUT_SOURCES ${OUTPUT_SOURCE}) 
endforeach()

add_custom_command(TARGET ${PROJECT_NAME}
                   PRE_BUILD
                   COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                   COMMENT "some comment")
add_library(${PROJECT_NAME} STATIC ${OUTPUT_SOURCES})

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})



Я получаю следующую ошибку при запуске cmake:
Ошибка CMake: невозможно определить язык ссылок для целевого "mylib"

Независимо от этой ошибки,make-файлы генерируются, но когда я делаю mylib, он не запускает прото-компиляцию

1 Ответ

2 голосов
/ 18 июня 2019

Подход, более родной для CMake, заключается в добавлении пользовательских команд с подписью OUTPUT для генерации файлов .cc, а затем в обычном порядке их использования в качестве источников для библиотеки. Таким образом, они, CMake, будут знать, что они из себя представляют и как их производить:

project(mylib)

set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")

file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
foreach(PROTO_FILE in ${PROTO_FILES})
    string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCE ${PROTO_FILE})
    list(APPEND OUTPUT_SOURCES ${OUTPUT_SOURCE}) 
endforeach()

add_custom_command(OUTPUT ${OUTPUT_SOURCES}
                   COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
                   DEPENDS ${PROTO_FILES}
                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                   COMMENT "some comment")
add_library(${PROJECT_NAME} STATIC ${OUTPUT_SOURCES})

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

Сделано таким образом, будет одна команда, которая читает все файлы .proto и производит все файлы .cc & mdash; Это означает, что если какой-либо из файлов .proto изменится, все файлы .cc будут сгенерированы заново. Я не знаком с Protobuffers, поэтому я не могу знать, нормально это или нет. Если они независимы, было бы лучше ввести один add_custom_command для каждого выходного файла.

Кроме того, учитывая аргументы, которые вы передаете protocc, вам, возможно, придется изменить пути в OUTPUT_SOURCES, чтобы правильно указывать на сгенерированные файлы.

Также обратите внимание, что CMake поставляется с модулем FindProtobuf , который определяет команду protobuf_generate_cpp(), поэтому вы можете использовать ее вместо ручного кодирования поддержки Protobuf. * ​​1020 *

...