【问题标题】:CMake: conditionally generate protobuf `*pb.{h|cpp}` files when *.proto files changeCMake:当 *.proto 文件更改时,有条件地生成 protobuf `*pb.{h|cpp}` 文件
【发布时间】:2023-04-09 16:23:02
【问题描述】:

我是一个项目的一部分,该项目使用 protobufs 在基于 Python 的客户端和基于 c++ 的服务器之间进行通信。我们也在使用 CMake。

使用 CMake,我正在寻找一种方法,以便仅在 *.proto 文件更改时有条件地调用 protoc 程序。我当前的目录结构(这似乎是问题的一部分)有一个*.proto 文件的目录,以及生成的*.pb.{h|cc}*_pb2.py 文件的单独目录:

  build/
  Messages/proto/  <--- .proto files are here
  Messages/cpp/    <--- would like the auto generated c++ files here
  Messages/py/     <--- would like the auto generated Python files here
  Server/Main.cpp
  Client/Main.py
  CMakeLists.txt

(根)CMakeLists.txt 文件(下)在执行build/cmake .. 命令时运行protoc 程序:

project(AAA)

MESSAGE("Protobuf autogeneration STARTED")

file(GLOB proto_packages "${AAA_SOURCE_DIR}/Messages/proto/*.proto")
execute_process(COMMAND protoc -I=${AAA_SOURCE_DIR}/Messages/proto --cpp_out=${AAA_SOURCE_DIR}/Messages/cpp/ --python_out=${AAA_SOURCE_DIR}/Messages/py/ ${proto_packages})

MESSAGE("Protobuf autogeneration COMPLETED")

cmake_minimum_required(VERSION 2.8)
find_package(Boost)
find_package(Protobuf REQUIRED)

include_directories(${Boost_INCLUDE_DIRS})
include_directories(${PROTOBUF_INCLUDE_DIR})

add_subdirectory(Messages/proto)
add_subdirectory(Messages/cpp)
add_subdirectory(Server)

Messages/proto/CMakeLists.txt 文件(我不确定它是否有任何影响):

file(GLOB proto_packages "${AAA_SOURCE_DIR}/Messages/proto/*.proto")
execute_process(COMMAND protoc -I=${AAA_SOURCE_DIR}/Messages/proto --cpp_out=../cpp --python_out=../py ${proto_packages}
            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

理想情况下protoc 程序应作为build/make 命令的一部分运行,并且仅(重新)生成*.pb.{h|cc}*_pb2.py 文件当 *.proto 文件更改时。

Server/ 目录中的某些文件具有#include &lt;Messages/cpp/Xxxx.pb.h&gt; 指令。

对于奖励积分,我希望将*.pb.{h|cc}*_pb2.py 文件生成到它们各自的目录中(分别为Messages/cpp/Messages/py/)。但是,如果有人能够帮助解决问题的依赖部分,我很高兴 *.pb.{h|cc}*_pb2.py 文件与 *.proto 文件共存。

提前感谢您的任何建议!

【问题讨论】:

    标签: c++ python cmake protocol-buffers


    【解决方案1】:

    这是未经测试的,但您需要将自定义命令添加到自定义目标。

    您需要为输出行创建一些变量,但在不知道如何将 *.proto 转换为 *.pb.{h|cc} 和 *_pb2.py 文件的情况下,我无能为力。请参阅 proto_packages_cpp 和 proto_packages_python 变量以了解它们应该去哪里。

    file(GLOB proto_packages "${AAA_SOURCE_DIR}/Messages/proto/*.proto")
    add_custom_command(
        COMMAND protoc -I=${AAA_SOURCE_DIR}/Messages/proto --cpp_out=../cpp --python_out=../py ${proto_packages}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        DEPENDS ${proto_packages}
        OUTPUT ${proto_packages_cpp} ${proto_packages_python}
    )
    add_custom_target(protobuf_autogeneration_target ALL
        DEPENDS ${proto_packages}
    )
    

    【讨论】:

    • 感谢您的建议。如果我有任何成功,我会告诉你。
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多