LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

У меня падает сборка proto-gen-c:

ADD_CUSTOM_COMMAND(OUTPUT protobuf-c/protobuf-c.pb.cc protobuf-c/protobuf-c.pb.h
                   COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
                   ARGS --cpp_out ${CMAKE_BINARY_DIR} -I${MAIN_DIR} ${MAIN_DIR}/protobuf-c/protobuf-c.proto)
FILE(GLOB PROTOC_GEN_C_SRC ${MAIN_DIR}/protoc-c/*.h ${MAIN_DIR}/protoc-c/*.cc )
ADD_EXECUTABLE(protoc-gen-c ${PROTOC_GEN_C_SRC} protobuf-c/protobuf-c.pb.cc protobuf-c/protobuf-c.pb.h)

(фрагмент из build-cmake/CMakeLists.txt от protobuf-c)

Как можно заметить, ожидается, что protoc сгенерирует файлы protobuf-c/protobuf-c.pb.cc и protobuf-c/protobuf-c.pb.h. Однако, в качестве аргумента --cpp_out ему передаётся просто ${CMAKE_BINARY_DIR}, а не ${CMAKE_BINARY_DIR}/protobuf-c. В результате файлы гененируется в корне каталога сборки, а не в подкаталоге protobuf-c и, соответственно, компилятор не может их найти, когда собирает proto-gen-c.

Я не могу понять, это баг в скрипте сборки protobuf-c или это я виноват сам - я собираю protoc через add_subdirectory (чтобы не требовать его установки в сборочную систему, потому что я хочу поддерживать не только линуксы, а на офтопике установка каждой библиотеки/утилиты это боль и мой проект требует только CMake и компилятора, а всё остальное собирает через add_subdirectory или качает бинарники с официальных сайтов средствами CMake, кросскомпиляция тоже не проблема - нижеприведённый скрипт запускается через add_custom_command и дочерний CMake, чтобы гарантированно собрать нативным тулчайном, в то время как сам проект может быть собран с помощью CMAKE_TOOLCHAIN_FILE):

set(BUILD_SHARED_LIBS OFF)
set(protobuf_BUILD_TESTS OFF)
add_subdirectory(lib/protobuf/cmake "${CMAKE_CURRENT_BINARY_DIR}/protobuf")

set(Protobuf_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/lib/protobuf/src")
set(Protobuf_LIBRARIES libprotobuf)
set(Protobuf_PROTOC_LIBRARY libprotoc)
set(
		Protobuf_PROTOC_EXECUTABLE
		"${CMAKE_CURRENT_BINARY_DIR}/protobuf/${CMAKE_BUILD_TYPE}/protoc${CMAKE_EXECUTABLE_SUFFIX}"
		-I${Protobuf_INCLUDE_DIR}
)
add_subdirectory(../lib/protobuf-c/build-cmake "${CMAKE_CURRENT_BINARY_DIR}/protobuf-c")
add_dependencies(protoc-gen-c protoc)

Исходная версия KivApple, :

У меня падает сборка proto-gen-c:

ADD_CUSTOM_COMMAND(OUTPUT protobuf-c/protobuf-c.pb.cc protobuf-c/protobuf-c.pb.h
                   COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
                   ARGS --cpp_out ${CMAKE_BINARY_DIR} -I${MAIN_DIR} ${MAIN_DIR}/protobuf-c/protobuf-c.proto)
FILE(GLOB PROTOC_GEN_C_SRC ${MAIN_DIR}/protoc-c/*.h ${MAIN_DIR}/protoc-c/*.cc )
ADD_EXECUTABLE(protoc-gen-c ${PROTOC_GEN_C_SRC} protobuf-c/protobuf-c.pb.cc protobuf-c/protobuf-c.pb.h)

(фрагмент из build-cmake/CMakeLists.txt от protobuf-c)

Как можно заметить, ожидается, что protoc сгенерирует файлы protobuf-c/protobuf-c.pb.cc и protobuf-c/protobuf-c.pb.h. Однако, в качестве аргумента --cpp_out ему передаётся просто ${CMAKE_BINARY_DIR}, а не ${CMAKE_BINARY_DIR}/protobuf-c. В результате файлы гененируется в корне каталога сборки, а не в подкаталоге protobuf-c и, соответственно, компилятор не может их найти, когда собирает proto-gen-c.

Я не могу понять, это баг в скрипте сборки protobuf-c или это я виноват сам - я собираю protoc через add_subdirectory (чтобы не требовать его установки в сборочную систему, потому что я хочу поддерживать не только линуксы, а на офтопике установка каждой библиотеки/утилиты это боль и мой проект требует только CMake и компилятора, а всё остальное собирает через add_subdirectory или качает бинарники с официальных сайтов средствами CMake):

set(BUILD_SHARED_LIBS OFF)
set(protobuf_BUILD_TESTS OFF)
add_subdirectory(lib/protobuf/cmake "${CMAKE_CURRENT_BINARY_DIR}/protobuf")

set(Protobuf_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/lib/protobuf/src")
set(Protobuf_LIBRARIES libprotobuf)
set(Protobuf_PROTOC_LIBRARY libprotoc)
set(
		Protobuf_PROTOC_EXECUTABLE
		"${CMAKE_CURRENT_BINARY_DIR}/protobuf/${CMAKE_BUILD_TYPE}/protoc${CMAKE_EXECUTABLE_SUFFIX}"
		-I${Protobuf_INCLUDE_DIR}
)
add_subdirectory(../lib/protobuf-c/build-cmake "${CMAKE_CURRENT_BINARY_DIR}/protobuf-c")
add_dependencies(protoc-gen-c protoc)