Подход, более родной для 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 *