私は、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
です。
提案をお寄せいただきありがとうございます!