CMake:* .proto文件改变时有条件地生成protobuf` * pb。{h | cpp}`文件

时间:2013-09-18 00:02:38

标签: c++ python cmake protocol-buffers

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

使用CMake,我正在寻找一种仅在protoc文件更改时有条件地调用*.proto程序的方法。我当前的目录结构(这似乎是问题的一部分)有一个*.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命令时,(root)protoc文件(下面)运行build/cmake ..程序:

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 <Messages/cpp/Xxxx.pb.h>指令。

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

提前感谢任何建议!

1 个答案:

答案 0 :(得分:5)

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

你需要为输出行创建一些变量,但不知道如何将* .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}
)