【问题标题】:How to substitute the extension for a cmake list of filenames如何用扩展名替换 cmake 文件名列表
【发布时间】:2019-06-14 19:53:52
【问题描述】:

我正在尝试使用 cmake 从一些 protobuf 定义构建一个 c++ 库。 我添加了一个自定义命令来将proto 编译为 c++,但我在输出部分有一些问题。 在protoc 完成工作后,我需要指定哪些是预期的输出文件。为此,我想在我的PROTO_SOURCEfile glob 中将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})

【问题讨论】:

    标签: cmake protocol-buffers protoc


    【解决方案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})
    

    【讨论】:

    • 是的,这是备份计划,我在想必须有一个更短的语法类似于 make for this
    • PROTO_FILES 是一个列表,当我使用 MESSAGE 打印它时,我得到一个连续的字符串,列表中的项目之间没有任何分隔,因此 REPLACE 只是替换了最后一个项目扩展名。我最终为每个项目使用了带有 REPLACE 的 FOREACH,并将结果附加到新列表中。现在我有不同的问题,但我会问一个单独的问题。
    • “PROTO_FILES 是一个列表,当我使用 MESSAGE 打印它时,我得到一个连续的字符串,列表中的项目之间没有任何分隔” - 这是正确的行为。要查看message() 调用中的分隔符,请将列表包含在双引号中。但在其他情况下不要这样做:双引号使列表成为单值。函数string(REGEX REPLACE) 正确地与列表一起使用,当它们被正确传递时(没有双引号)。
    【解决方案2】:

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

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

    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}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多