如何用扩展名代替文件名的cmake列表

时间:2019-06-14 19:53:52

标签: cmake protocol-buffers protoc

我正在尝试使用cmake从某些protobuf定义中构建一个c ++库。 我添加了一个自定义命令来将proto编译为c ++,但是输出部分存在一些问题。 我需要指定protoc完成其工作后,哪些是预期的输出文件。为此,我想在我的PROTO_SOURCE文件全局中将proto扩展名替换为.pb.cc.pb.h

我基本上需要类似this的东西,但要使用cmake。

由于我没有protobuf cmake支持,因此我正在手动构建此命令。

project(messages)

set(PROTO_PATH "${CMAKE_CURRENT_SOURCE_DIR}/proto_definitions")
file(GLOB PROTO_FILES "${PROTO_PATH}/*.proto")
#set(PROTO_SOURCES ???) # This needs to contain '*.pb.cc' and '*.pb.h'

add_custom_command(COMMAND protoc --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/compiled_proto ${PROTO_FILES}
               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
               DEPENDS ${PROTO_FILES}
               OUTPUT ${PROTO_SOURCES})

add_library(${PROJECT_NAME} STATIC ${PROTO_SOURCES})

2 个答案:

答案 0 :(得分:1)

使用string(REGEX REPLACE)函数:

# Replace .proto -> .pb.cc
string(REGEX REPLACE "[.]proto$" ".pb.cc" OUTPUT_SOURCES ${PROTO_FILES})
# Replace .proto -> .pb.h
string(REGEX REPLACE "[.]proto$" ".pb.h" OUTPUT_HEADERS ${PROTO_FILES})

add_custom_command(COMMAND protoc <...>
   OUTPUT ${OUTPUT_SOURCES} ${OUTPUT_HEADERS})

答案 1 :(得分:0)

接受的答案对我不起作用,因为列表中的前几个元素没有被正确替换。

所以我遍历列表,将它们一一替换,并将每个附加到列表中:

foreach (CXX_SRC ${LIST_OF_CXX})
    string(REGEX REPLACE "[.]cpp$" ".o" OBJ ${CXX_SRC})
    set(OBJ_FILES ${OBJ_FILES} ${OBJ})
endforeach ()
message(STATUS "Object files compiled from *.cpp: ${OBJ_FILES}")