qt_add_protobuf
Protobuf スキーマを使用して Qt ベースの C++ ソースコードを生成します。
注: このコマンドはテクノロジープレビューであり、将来のリリースで変更される可能性があります。
このコマンドは Qt 6.5 で導入されました。
qt_add_protobuf を使用して、CMake スクリプトでqtprotobufgen
を起動し、プロジェクトの .proto スキーマからコードを生成します。qtprotobufgen
は、qt_add_protobuf
コマンドを使用して CMake から起動します。
qt_add_protobuf(<target> PROTO_FILES <file> ... [PROTO_INCLUDES <path> ...] [QML [QML_URI <uri>]] [OUTPUT_DIRECTORY <dir>] [GENERATE_PACKAGE_SUBFOLDERS] [COPY_COMMENTS] [EXPORT_MACRO <infix>] [OUTPUT_HEADERS <var>] [OUTPUT_TARGETS <var>] )
qtprotobufgen
によって生成されたソース・ファイルは、ターゲットに追加されます。ターゲットがすでに存在する場合、生成されたファイルはターゲットのソースリストに追加されます。ターゲットが存在しない場合は、リンク先のライブラリとして作成されます。
引数
PROTO_FILES
は、コード生成手順で使用される.protoファイルのリストを指定します。PROTO_INCLUDES
は、protobuf の依存関係を検索するディレクトリーのリストを指定します。注意:
PROTO_FILES
の場所は、暗黙的に protobuf のインクルードパスの一部と見なされます。QML
はprotobuf定義からQML互換のメッセージタイプを生成し、QMLモジュールとして登録します。存在しないターゲットやQMLモジュールでないターゲットに対して を呼び出すと、暗黙のうちに新しいQMLモジュールが生成されます。qt_add_protobuf
qt_add_executable(target ... ) // creates a new QML module qt_add_protobuf(target QML ... )
ターゲットが既存のQMLモジュールである場合、
qt_add_protobuf
は生成されたprotobuf型をそのモジュールにアタッチします。qt_add_qml_module(target ... ) // adds to existing QML module qt_add_protobuf(target QML ... )
QML_URI
はQMLモジュールで使われる 。URI
全てのQMLモジュールは
URI
を定義しなければなりません。 はimport文の中で、そのモジュールのprotobuf型をQMLに公開するために使われます。qt_add_protobuf(target QML QML_URI proto.uri.example )
QML_URI
が省略された場合、protobuf のパッケージ名がモジュールのURI
として使用されます。URI
注:QML_URI
が省略された場合、PROTO_FILES
で指定されたすべての.protoファイルは同じ protobuf パッケージ名でなければなりません。注意 :QMLコンテキストのインポートエラーにつながるため、
QML_URI
や proto パッケージ名が同じ protobuf QML モジュールを複数作成することは避けるべきです。注意 :
qt_add_protobuf
関数にQML_URI
が渡され、ターゲットが既に存在する場合、QML_URI
の引数は無視されます。URI
の詳細については、Identified Modules を参照してください。OUTPUT_DIRECTORY
は、生成されたファイルが置かれるディレクトリを定義します。デフォルトでは、現在のビルド・ディレクトリが使用されます。GENERATE_PACKAGE_SUBFOLDERS
は、 ファイルのパッケージ名指定子を使用して、生成されるファイルのフォルダー構造を作成します。たとえば、パッケージがと定義されている場合、生成されたファイルは.proto
package io.qt.test
OUTPUT_DIRECTORY/io/qt/test/ に置かれます。COPY_COMMENTS
.proto
ファイルのコメントを生成コードにコピーします。EXPORT_MACRO
<target> から新しい共有ライブラリを作成する場合にのみ適用されます。このオプションは、生成されるコードで使用されるエクスポート・マクロのベース名を指定します。最終的なマクロ名は のように構成されます。このオプションが設定されていない場合、ターゲット名は として使用されます。QPB_<EXPORT_MACRO>_EXPORT
EXPORT_MACRO
さらに詳しい情報については、共有ライブラリの作成をお読みください。
OUTPUT_HEADERS
は、生成されたヘッダーのリストを格納する変数を指定します。このリストは、カスタム・プロジェクトのインストール・ルールを定義するのに便利です。OUTPUT_TARGETS
は、生成されたターゲットのリストを格納する変数を指定します。このリストはカスタムプロジェクトのインストールルールを定義するのに便利です。
protobuf ターゲット間の依存関係の解決
qt_add_protobuf
コマンドは、異なるターゲット用のコードを生成するために使用される.proto
ファイル間の依存関係を考慮しません。
プロジェクトには、依存関係を持つ2つ以上の.proto
ファイルがあるかもしれません:
// test_messages.proto syntax = "proto3"; package test.messages; message MyMessage { int32 myField = 1; }
// test_extensions.proto syntax = "proto3"; import "test_messages.proto"; package test.extensions; message MyExtension { test.messages.MyMessage baseMessage = 1; int32 extension = 2; }
上記の.proto
ファイルは、スタンドアロン・ライブラリの生成に使用できます:
qt_add_protobuf(test_messages PROTO_FILES test_messages.proto ) ... qt_add_protobuf(test_extensions PROTO_FILES test_extensions.proto ) ...
test_extensions
ターゲットはtest_messages
ターゲットからのメッセージに依存するため、CMake
スクリプトでそのようなターゲットに手動でリンクする必要があります:
target_link_libraries(test_extensions PUBLIC test_messages)
注: test_messages
ターゲットのメッセージは、test_extensions
ターゲットに属するヘッダーファイルで使用されるため、test_extensions
にリンクするターゲットは、test_messages
ターゲットを他動依存として持つ必要があります。プロトブッファ・ライブラリー・ターゲットに適切なINTERFACE_INCLUDE_DIRECTORIES
、INTERFACE_LINK_LIBRARIES
プロパティを持たせるには、PUBLIC
リンク・スコープを使用することを推奨します。
例
qt_add_protobuf の使用法
cmake_minimum_required(VERSION 3.16...3.22) project(MyThings) find_package(Qt6 REQUIRED COMPONENTS Protobuf) qt_standard_project_setup() qt_add_protobuf(MyMessages GENERATE_PACKAGE_SUBFOLDERS PROTO_FILES path/to/message.proto path/to/other_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE MyMessages)
上の例では、PROTO_FILES
オプションに渡されたパスで定義されたメッセージタイプを含むMyMessages
というライブラリを生成しています。GENERATE_PACKAGE_SUBFOLDERS
オプションで、生成されたファイルのフォルダ構造を生成します。また、PROTO_INCLUDES
オプションは、指定されたディレクトリで依存関係やインポートを探すように protoc に指示します。MyApp
という実行ファイルのターゲットを作成し、MyMessages
ライブラリにリンクします。
QML拡張protobufの例
cmake_minimum_required(VERSION 3.16...3.22) project(MyThings) find_package(Qt6 REQUIRED COMPONENTS Protobuf Quick) qt_standard_project_setup() qt_add_protobuf(MyMessagesPlugin QML QML_URI my.messages.module.uri PROTO_FILES path/to/message.proto path/to/other_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_protobuf(MyApp QML PROTO_FILES path/to/internal_message.proto PROTO_INCLUDES /path/to/proto/include ) qt_add_qml_module(MyApp URI example.uri VERSION 1.0 QML_FILES qml/main.qml ) qt_add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE Quick)
上記のQML拡張例では、最初のqt_add_protobuf
の呼び出しによって、PROTO_FILES
オプションに渡されたパスで定義されたメッセージタイプを含むMyMessagesPlugin
というQMLモジュールを生成しています。QML
オプションを使い、QML
コンテキストにプロトメッセージ タイプを登録できるようにします。登録された型は、QML_URI
で設定されたパスをインポートすることで、QML
で利用できるようになります。2回目のqt_add_protobuf
呼び出しによって、既存のMyApp
QML モジュールに自動生成コードを追加します。このような場合、QML_URI
は必要ありません。最後に、MyApp
という実行可能ファイルのターゲットを作成します。このターゲットは、グラフィカル部分の QML モジュールを持ち、my.messages.module.uri
のインポートにより、MyMessagesPlugin
を main.qml ファイルにロードします。
スタンドアロンQt Protobufライブラリのインストール
qt_add_protobufコマンドは、さらにインストールするための成果物のリストも生成します。これらのアーティファクトは、OUTPUT_HEADERS
、OUTPUT_TARGETS
引数を次のように指定することで読み込むことができます:
qt_add_protobuf(MyProtoLib PROTO_FILES mylib.proto OUTPUT_HEADERS public_headers OUTPUT_TARGETS generated_targets )
このコマンドは、qt_add_protobuf
コマンドによって生成されたヘッダーファイルとターゲットのリストをpublic_headers
とgenerated_targets
変数に格納します。
標準の CMakeinstall
コマンドを使用してアーティファクトをインストールし、ライブラリのconfig
ファイルを生成します:
include(GNUInstallDirs) set_target_properties(MyProtoLib PROPERTIES PUBLIC_HEADER "${public_headers}" INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}>" ) install(TARGETS ${generated_targets} EXPORT MyProtoLibTargets PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install(EXPORT MyProtoLibTargets NAMESPACE MyProtoLib:: DESTINATION lib/cmake/MyProtoLib)
次に、生成されたMyProtoLibTargets
config をパッケージ config ファイルで使用します。パッケージの作成プロセスについては、公式のCMakeドキュメントを参照してください。
インストール後、ライブラリはスタンドアロンの CMake パッケージとして利用できます:
find_package(Qt6 COMPONENTS Protobuf) find_package(MyProtoLib CONFIG) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE MyProtoLib::MyProtoLib Qt6::Protobuf)
注意: qt_add_protobuf は、MyProtoLib
ターゲットにも、MyProtoLib
CMake パッケージにも、暗黙的にQt Protobuf
モジュールを推移的依存関係として追加しません。そのため、Qt Protobuf
モジュールの検索と、MyApp
からQt6::Protobuf
への明示的なリンクは必須です。
qtprotobufgen Toolも参照してください 。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。