我参与的项目使用 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
文件(下方)运行 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
共存文件。
提前感谢您的任何建议!
最佳答案
这是未经测试的,但您需要将自定义命令添加到自定义目标。
您需要为输出行创建一些变量,但不知道如何将 *.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}
)
关于c++ - CMake:当 *.proto 文件更改时有条件地生成 protobuf `*pb.{h|cpp}` 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861818/