コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか

Protocol Buffers のC言語版で遊んでみる

ことの成り行き

Windows PC から、C言語しか動作しない低性能ハードウェアとEthernet通信するという案件がある。
もともと、Windows PC からIoT機器に対するEthernet通信(というかMQTT)では伝文のシリアライズフォーマットにJSONの使用を考えていた。しかし、対低性能ハードウェア視線で考えると、C言語JSONのパースはちょっときついかも・・・
そこで、C言語でも実装できるようなシリアライズフォーマットで何か良いのないかなぁと探していたら、protobuf-cなるものを見つけた。

protobuf-cとは、google謹製Protocol BuffersC言語版らしい。

もともと、MQTTに適したシリアライズフォーマットを調査してたときにProtocol Buffersは候補に挙がっていたので、「こんなのもあるのかー」と一応存在自体は把握していた。が、対象がC++Pythonであると思っていたので、「それならお手軽JSONでいいやー」とスルーしていた。

ここにきて、C言語対応のシリアライズフォーマットとして筆頭候補に挙がってきたので、ちょっとどんなものなのか遊んでみる。

実行環境

とりあえず本番環境がWindows10 IoTなので、それに近い環境で手元にあるWindows10 64bitでいろいろやってみる。

環境の構築

Readme.mdに書かれているが、
protobuf-c requires a C compiler, a C++ compiler, protobuf, and pkg-config to be installed.
と書いてあるので、それらを入手する必要がある。
the autotools (autoconf, automake, libtool) must also be installedと言われているのでそららもいるかもしれないが、とりあえず今は様子見しとく。なお、Qiitaの記事autoconfの説明で参考になるものがあった。)

タチが悪いことに、環境がWindowsなので、色々遠回りに環境構築する必要がある。
備忘録を兼ねて、それらを残しておく。

protobuf-cのクローン

とりあえず環境作成のためには、protobuf-cを自前ビルドすることが前提のようなので、このソースコードgithubからクローンする。

CコンパイラおよびC++コンパイラの入手

手持ちにgit bashがあったのでそれで代用するという手抜きをする。
git bashにはもともとgccコンパイラが入っているっぽい)

ちなみに、git bashGit for Windowsをインストールする過程で入手できる。

注意

普通にgit bashを使って、後述するmakeすると、

/usr/bin/sh: line 1: C:/Program: No such file or directory

とかいって怒られる。

これに結構ハマったんだけど、どうやらgit bashのデフォルトインストール先がC:\Program Files\GitなのでC:\Program Files\Git\usr\bin\sh.exeにアクセスしようとする過程で、半角スペースが含まれるのでアクセス不可になってたっぽい。
いろいろ対処法探したんだけど、これといって良いのが見つからなかったので、最終解決手段として私はC:\Program Files\GitフォルダをC:\Git(C直下)にコピーして、そのフォルダ内のgit bashを使用することでmakeを解決できた。

protobufの入手(windows

githubのreleasesページから~win32.zipをダウンロードする。
binフォルダ内にprotoc.exeがあるので、それを取得。

pkg-configの入手(windows

Readme.md#buildingに書いてある通り、./configを使用できるようにする必要がある。そのため、pkg-configが必要。

こちらからtar.gzをダウンロードし、そいつを、クローンしたprotobuf-cフォルダの中に展開する

注意

そのまま./configureやると

configure: error: Either a previously installed pkg-config or "glib-2.0 >= 2.16" could 
not be found. Please set GLIB_CFLAGS and GLIB_LIBS to the correct values or pass 
--with-internal-glib to configure to use the bundled copy.

とか言われてエラーになったので、こちらを拝見して、./configure --with-internal-glibと実行する。うまくいった。

makeの入手(windows

素のWindows環境では、makeコマンドが効かないので、それを用意する必要がある。
とりあえずgnuwin32からインストーラをダウンロードする。(Complete package, except sources の SetUp )

git bashを使用する場合、前述したmake実行できないトラップがあるので注意。

protoc-cの生成

./pkg-config/configure --with-internal-glib && make && make installで行けるやろ!
って思って実行したけど、

/usr/bin/sh: -c: line 0: syntax error near unexpected token `('
/usr/bin/sh: -c: line 0: `test -f config.h || C:/Program Files (x86)/GnuWin32/bin/make  stamp-h1'
make: *** [config.h] エラー 1

って怒られる。こりゃWindowsは無理かなーってことで今諦めモードです。

こうなったら意地でもどうなるかやってみたいので、Linux環境でやるしかないね。
てことで、秘蔵っ子のDocker for Windowsに手を出してみるか・・・!

備考

なお、autoconfを使用したautogen.shを試してみたいのだが、Windows用autoconfのGnuWin32鯖落ち?してるので手に入れることができない・・・