![zhangyi1357](/assets/img/avatar_default.png)
Configure the build system to include the source directory in the proto path for all relevant targets, ensuring improved resolution of proto files during code generation.
123 lines
5.5 KiB
CMake
123 lines
5.5 KiB
CMake
# Copyright (c) 2023, AgiBot Inc.
|
|
# All rights reserved.
|
|
|
|
# add target for protobuf gen code target for proto path
|
|
function(add_protobuf_gencode_target_for_proto_path)
|
|
cmake_parse_arguments(ARG "" "TARGET_NAME" "PROTO_PATH;GENCODE_PATH;DEP_PROTO_TARGETS;OPTIONS" ${ARGN})
|
|
|
|
if(NOT EXISTS ${ARG_GENCODE_PATH})
|
|
file(MAKE_DIRECTORY ${ARG_GENCODE_PATH})
|
|
endif()
|
|
|
|
set(ALL_DEP_PROTO_TARGETS ${ARG_DEP_PROTO_TARGETS})
|
|
foreach(CUR_DEP_PROTO_TARGET ${ARG_DEP_PROTO_TARGETS})
|
|
get_target_property(SECONDARY_DEP_PROTO_TARGET ${CUR_DEP_PROTO_TARGET} DEP_PROTO_TARGETS)
|
|
list(APPEND ALL_DEP_PROTO_TARGETS ${SECONDARY_DEP_PROTO_TARGET})
|
|
endforeach()
|
|
list(REMOVE_DUPLICATES ALL_DEP_PROTO_TARGETS)
|
|
|
|
set(PROTOC_EXTERNAL_PROTO_PATH_ARGS)
|
|
foreach(CUR_DEP_PROTO_TARGET ${ALL_DEP_PROTO_TARGETS})
|
|
get_target_property(DEP_PROTO_TARGET_PROTO_PATH ${CUR_DEP_PROTO_TARGET} PROTO_PATH)
|
|
list(APPEND PROTOC_EXTERNAL_PROTO_PATH_ARGS "--proto_path=${DEP_PROTO_TARGET_PROTO_PATH}")
|
|
endforeach()
|
|
list(APPEND PROTOC_EXTERNAL_PROTO_PATH_ARGS "--proto_path=${protobuf_SOURCE_DIR}/src")
|
|
list(REMOVE_DUPLICATES PROTOC_EXTERNAL_PROTO_PATH_ARGS)
|
|
|
|
get_property(PROTOC_NAMESPACE GLOBAL PROPERTY PROTOC_NAMESPACE_PROPERTY)
|
|
|
|
if(NOT PROTOC_NAMESPACE)
|
|
set(CUR_PROTOC_NAMESPACE "protobuf")
|
|
else()
|
|
set(CUR_PROTOC_NAMESPACE ${PROTOC_NAMESPACE})
|
|
endif()
|
|
|
|
set(GEN_SRCS)
|
|
set(GEN_HDRS)
|
|
|
|
file(GLOB_RECURSE PROTO_FILES ${ARG_PROTO_PATH}/*.proto)
|
|
foreach(PROTO_FILE ${PROTO_FILES})
|
|
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" PROTO_FILE_NAME ${PROTO_FILE})
|
|
set(GEN_SRC "${ARG_GENCODE_PATH}/${PROTO_FILE_NAME}.pb.cc")
|
|
set(GEN_HDR "${ARG_GENCODE_PATH}/${PROTO_FILE_NAME}.pb.h")
|
|
|
|
list(APPEND GEN_SRCS ${GEN_SRC})
|
|
list(APPEND GEN_HDRS ${GEN_HDR})
|
|
|
|
add_custom_command(
|
|
OUTPUT ${GEN_SRC} ${GEN_HDR}
|
|
COMMAND ${CUR_PROTOC_NAMESPACE}::protoc ARGS ${ARG_OPTIONS} --proto_path=${ARG_PROTO_PATH} ${PROTOC_EXTERNAL_PROTO_PATH_ARGS} --cpp_out=${ARG_GENCODE_PATH} ${PROTO_FILE}
|
|
DEPENDS ${PROTO_FILE} ${CUR_PROTOC_NAMESPACE}::protoc
|
|
COMMENT "Running protoc, args: ${ARG_OPTIONS} --proto_path=${ARG_PROTO_PATH} ${PROTOC_EXTERNAL_PROTO_PATH_ARGS} --cpp_out=${ARG_GENCODE_PATH} ${PROTO_FILE}"
|
|
VERBATIM)
|
|
endforeach()
|
|
|
|
add_library(${ARG_TARGET_NAME} STATIC)
|
|
|
|
target_sources(${ARG_TARGET_NAME} PRIVATE ${GEN_SRCS})
|
|
target_sources(${ARG_TARGET_NAME} PUBLIC FILE_SET HEADERS BASE_DIRS ${ARG_GENCODE_PATH} FILES ${GEN_HDRS})
|
|
target_include_directories(${ARG_TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${ARG_GENCODE_PATH}> $<INSTALL_INTERFACE:include/${ARG_TARGET_NAME}>)
|
|
|
|
target_link_libraries(${ARG_TARGET_NAME} PUBLIC protobuf::libprotobuf ${ALL_DEP_PROTO_TARGETS})
|
|
|
|
set_target_properties(${ARG_TARGET_NAME} PROPERTIES PROTO_PATH ${ARG_PROTO_PATH})
|
|
set_target_properties(${ARG_TARGET_NAME} PROPERTIES DEP_PROTO_TARGETS "${ALL_DEP_PROTO_TARGETS}")
|
|
|
|
endfunction()
|
|
|
|
# add target for protobuf gen code target for one file
|
|
function(add_protobuf_gencode_target_for_one_proto_file)
|
|
cmake_parse_arguments(ARG "" "TARGET_NAME" "PROTO_FILE;GENCODE_PATH;DEP_PROTO_TARGETS;OPTIONS" ${ARGN})
|
|
|
|
if(NOT EXISTS ${ARG_GENCODE_PATH})
|
|
file(MAKE_DIRECTORY ${ARG_GENCODE_PATH})
|
|
endif()
|
|
|
|
set(ALL_DEP_PROTO_TARGETS ${ARG_DEP_PROTO_TARGETS})
|
|
foreach(CUR_DEP_PROTO_TARGET ${ARG_DEP_PROTO_TARGETS})
|
|
get_target_property(SECONDARY_DEP_PROTO_TARGET ${CUR_DEP_PROTO_TARGET} DEP_PROTO_TARGETS)
|
|
list(APPEND ALL_DEP_PROTO_TARGETS ${SECONDARY_DEP_PROTO_TARGET})
|
|
endforeach()
|
|
list(REMOVE_DUPLICATES ALL_DEP_PROTO_TARGETS)
|
|
|
|
set(PROTOC_EXTERNAL_PROTO_PATH_ARGS)
|
|
foreach(CUR_DEP_PROTO_TARGET ${ALL_DEP_PROTO_TARGETS})
|
|
get_target_property(DEP_PROTO_TARGET_PROTO_PATH ${CUR_DEP_PROTO_TARGET} PROTO_PATH)
|
|
list(APPEND PROTOC_EXTERNAL_PROTO_PATH_ARGS "--proto_path=${DEP_PROTO_TARGET_PROTO_PATH}")
|
|
endforeach()
|
|
list(APPEND PROTOC_EXTERNAL_PROTO_PATH_ARGS "--proto_path=${protobuf_SOURCE_DIR}/src")
|
|
list(REMOVE_DUPLICATES PROTOC_EXTERNAL_PROTO_PATH_ARGS)
|
|
|
|
get_property(PROTOC_NAMESPACE GLOBAL PROPERTY PROTOC_NAMESPACE_PROPERTY)
|
|
|
|
if(NOT PROTOC_NAMESPACE)
|
|
set(CUR_PROTOC_NAMESPACE "protobuf")
|
|
else()
|
|
set(CUR_PROTOC_NAMESPACE ${PROTOC_NAMESPACE})
|
|
endif()
|
|
|
|
string(REGEX REPLACE ".+/(.+)\\..*" "\\1" PROTO_FILE_NAME ${ARG_PROTO_FILE})
|
|
string(REGEX REPLACE "(.+)/(.+)\\..*" "\\1" PROTO_PATH ${ARG_PROTO_FILE})
|
|
set(GEN_SRC "${ARG_GENCODE_PATH}/${PROTO_FILE_NAME}.pb.cc")
|
|
set(GEN_HDR "${ARG_GENCODE_PATH}/${PROTO_FILE_NAME}.pb.h")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${GEN_SRC} ${GEN_HDR}
|
|
COMMAND ${CUR_PROTOC_NAMESPACE}::protoc ARGS ${ARG_OPTIONS} --proto_path=${PROTO_PATH} ${PROTOC_EXTERNAL_PROTO_PATH_ARGS} --cpp_out=${ARG_GENCODE_PATH} ${ARG_PROTO_FILE}
|
|
DEPENDS ${ARG_PROTO_FILE} ${CUR_PROTOC_NAMESPACE}::protoc
|
|
COMMENT "Running protoc, args: ${ARG_OPTIONS} --proto_path=${PROTO_PATH} ${PROTOC_EXTERNAL_PROTO_PATH_ARGS} --cpp_out=${ARG_GENCODE_PATH} ${ARG_PROTO_FILE}"
|
|
VERBATIM)
|
|
|
|
add_library(${ARG_TARGET_NAME} STATIC)
|
|
|
|
target_sources(${ARG_TARGET_NAME} PRIVATE ${GEN_SRC})
|
|
target_sources(${ARG_TARGET_NAME} PUBLIC FILE_SET HEADERS BASE_DIRS ${ARG_GENCODE_PATH} FILES ${GEN_HDR})
|
|
target_include_directories(${ARG_TARGET_NAME} PUBLIC $<BUILD_INTERFACE:${ARG_GENCODE_PATH}> $<INSTALL_INTERFACE:include/${ARG_TARGET_NAME}>)
|
|
|
|
target_link_libraries(${ARG_TARGET_NAME} PUBLIC protobuf::libprotobuf ${ALL_DEP_PROTO_TARGETS})
|
|
|
|
set_target_properties(${ARG_TARGET_NAME} PROPERTIES PROTO_PATH ${PROTO_PATH})
|
|
set_target_properties(${ARG_TARGET_NAME} PROPERTIES DEP_PROTO_TARGETS "${ALL_DEP_PROTO_TARGETS}")
|
|
|
|
endfunction()
|