LoginSignup
6
4

More than 5 years have passed since last update.

[wayland] wayland-scannerを使用してwaylandのプロトコルをXMLから生成する

Last updated at Posted at 2016-10-17

waylandのプロトコルの生成方法のメモ

概要

wayland では wayland-scanner というツールを使用して、XML からプロトコルを生成します。
例として、 wayland のデフォルトのプロトコル定義ファイルである wayland.xml では以下のように実行できます。
wayland/wayland.xml at master · wayland-project/wayland

wayland.xmlでの例
$ 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-headerweston などのサーバー側が使用する定義がされたヘッダを出力します。
クライアントアプリを作成する場合は基本的には関係ありません。

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

wayland-scanner-output.sh
#!/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

参考

公式

Wayland

Github(Mirror)

Wayland
wayland-project/wayland: Core Wayland protocol and libraries
wayland-project/weston: Reference compositor for Wayland (mirror)

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4