waylandのプロトコルの生成方法のメモ
概要
wayland
では wayland-scanner
というツールを使用して、XML からプロトコルを生成します。
例として、 wayland
のデフォルトのプロトコル定義ファイルである wayland.xml
では以下のように実行できます。
wayland/wayland.xml at master · wayland-project/wayland
$ wayland-scanner code < wayland.xml > wayland-protocol.c
$ wayland-scanner server-header < wayland.xml > wayland-server-protocol.h
$ wayland-scanner client-header < wayland.xml > wayland-client-protocol.h
<
, >
に関しては、 wayland-scanner
独自の実装というわけではなく
shellコマンドの文法での <
(XMLを標準入力), >
(標準出力のリダイレクトでファイルを作成)を行っているだけです。
3種類のオプションと出力されるファイルについて
上記のように、現在のwaylandでは1つのプロトコル定義ファイル(XML)から三種類のファイルを生成します。
指定できるオプションは以下の3つになります。
- code
- server-header
- client-header
code
code
は *.c
を出力し、server
, client
双方で利用されます。
使用方法としては、クライアントもしくはサーバーのビルド時に一緒にビルドするか、ライブラリ化してリンクするかのどちらかになります。
server-header
server-header
は weston
などのサーバー側が使用する定義がされたヘッダを出力します。
クライアントアプリを作成する場合は基本的には関係ありません。
client-header
client-header
は、waylandを使用するクライアントアプリを実装する際の定義がされているヘッダを出力します。
出力ファイルの命名規則について
上記の3つのオプションで出力するファイルについて、ファイル名については明確な規定はない認識ですが、wayland
コミュニティの慣習として以下のように定義されることが多いようです。
$ wayland-scanner code < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-protocol.c
$ wayland-scanner server-header < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-server-protocol.h
$ wayland-scanner client-header < ${PROTOCOLNAME}.xml > ${PROTOCOLNAME}-client-protocol.h
特にほかに規定がなければ、上記のように命名するのが無難かと思われます。
出力用シェルスクリプトサンプル
いちいち手で打つのはめんどうなため、スクリプトを作りました。
wayland-scanner genarate script
#!/bin/bash -eu
# The MIT License (MIT)
# Copyright (c) 2016 Kohei Arao
# https://opensource.org/licenses/MIT
FILEPATH=$1
# validate
FILENAME=$(basename ${FILEPATH})
EXTENSION=${FILENAME##*.}
PROTOCOLNAME=${FILENAME%.*}
echo "FILENAME=${FILENAME}"
echo "EXTENSION=${EXTENSION}"
echo "PROTOCOLNAME=${PROTOCOLNAME}"
if [[ EXTENSION == "xml" ]] || [[ 0 == $(cat ${FILEPATH} | grep "<protocol name=\"${PROTOCOLNAME//-/_}\">" | wc -l) ]];
then
echo "validate error!"
exit 1
fi
wayland-scanner code < ${FILEPATH} > ${PROTOCOLNAME}-protocol.c
wayland-scanner server-header < ${FILEPATH} > ${PROTOCOLNAME}-server-protocol.h
wayland-scanner client-header < ${FILEPATH} > ${PROTOCOLNAME}-client-protocol.h
$ ./wayland-scanner-output.sh wayland.xml
参考
公式
Github(Mirror)
Wayland
wayland-project/wayland: Core Wayland protocol and libraries
wayland-project/weston: Reference compositor for Wayland (mirror)