ことの成り行き
Windows PC から、C言語しか動作しない低性能ハードウェアとEthernet通信するという案件がある。
もともと、Windows PC からIoT機器に対するEthernet通信(というかMQTT)では伝文のシリアライズフォーマットにJSONの使用を考えていた。しかし、対低性能ハードウェア視線で考えると、C言語でJSONのパースはちょっときついかも・・・
そこで、C言語でも実装できるようなシリアライズフォーマットで何か良いのないかなぁと探していたら、protobuf-c
なるものを見つけた。
protobuf-cとは、google謹製Protocol BuffersのC言語版らしい。
もともと、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 bash
はGit 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
が鯖落?してるので手に入れることができない・・・
コメント