見出し画像

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の運営にも貢献できるのでよろしくお願います。