Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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)

koara-local
言語は最近は C#, Javaあたりがメイン。端末VimからIDEに移行。IntelliJすごい。Qiitaでの記事やその中の主張は、所属している企業/団体の意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away