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

hdo*_*adu 6 cmake protocol-buffers protoc

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

我基本上需要这样的东西但是对于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})
Run Code Online (Sandbox Code Playgroud)

Tsy*_*rev 5

使用字符串(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})
Run Code Online (Sandbox Code Playgroud)

  • PROTO_FILES 是一个列表,当我用 MESSAGE 打印它时,我得到一个连续的字符串,列表中的项目之间没有任何分隔,因此 REPLACE 只是替换最后一个项目扩展名。我最终对每个项目使用了 FOREACH 和 REPLACE,并将结果附加到新列表中。现在我有不同的问题,但我会为此提出一个单独的问题。 (3认同)