FluentbitとTWSNMP FCの連携開発6日目( 最終回):FluentbitのGO言語版プラグインをクロスコンパイルする技を習得できた
昨日は本業をお休みして、かみさんのお供でマチス展を見に国立新美術館まで行きました。助手の猫さんはお留守番です。
午後はFluentbitとTWSNMP FCの連携開発に専念することができたので、今回、思いついたアイデアすべて作ることができました。
FluentbitのGO言語のプラグイン
の説明にはビルド方法を
$go build -buildmode=c-shared -o out_gstdout.so out_gstdout.go
と書いています。GO言語の場合には、GOOSとGOARCHを指定すれば、クロスコンパイルしてMac OS上でLinux版やWindows版を作ることができます。
$GOOS=widnows go build -buildmode=c-shared -o out_gstdout.so out_gstdout.go
のような感じです。しかし、Fluentbitのプラグインは、cgoを使っているので、この方法ではビルドできません。
Windows版はWindowsマシンで、Linux版はLinuxマシンでビルドすることになります。
ちょっと、これは美しくないので、何かよい方法がないか考えました。
1年半前に作った
と
でいけそうだと思って試してみたらうまくいきました。
ビルドするのはDocker上のLinux環境です。Dockerfileは
FROM golang:buster
RUN apt update && apt upgrade -yq && apt install -yq \
gcc-multilib gcc-mingw-w64 binutils-mingw-w64
RUN apt install -yq g++-aarch64-linux-gnu g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
COPY mk.sh /root/
RUN chmod +x /root/mk.sh
ENTRYPOINT [ "/root/mk.sh" ]
ビルドするスクリプトは、
#!/bin/sh
cd /go/src/in_twsnmp
go build -buildmode=c-shared -o in_twsnmp.linux.amd64.so .
CC=aarch64-linux-gnu-gcc GOOS=linux GOARCH=arm64 CGO_ENABLED=1 go build -buildmode=c-shared -o in_twsnmp.linux.arm64.so
CC=arm-linux-gnueabihf-gcc GOOS=linux GOARCH=arm CGO_ENABLED=1 go build -buildmode=c-shared -o in_twsnmp.linux.arm.so
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc go build -buildmode=c-shared -o in_twsnmp.windows.dll .
のようなコンテナイメージを作成して
docker run -it --rm -v $(CURDIR):/go/src fluentbit_builder
のように起動すれば、ビルドできました。
Dockerのイメージ作成で
FROM golang:buster
という、少し古いDebianのイメージを使っているのがポイントです。
こうしないと、Raspberry Piの古いOS(Debian 10(Buster)ベース)で
のようなGLIBCのバージョンのエラーがでて動作しないのです。
この方法でビルドしたプラグインは、Raspberry Piや Windowsでも動きました。
Windowsでハードウェアの温度を測るには、管理者権限が必要でした。
このプラグインは、TWSNMP FCの次のリリースに含めるつもりです。使う人がいるかどうかは、わかりませんが?
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。