以下の内容はhttps://kmuto.hatenablog.com/entry/2025/04/20/120200より取得しました。


Windows版mackerel-agent.exeをビルドしていた

覚え書き。

Hyper-Vで外部スイッチ(実体はブリッジ)を使うとメトリックが0返答になるのが以前から困っていたのだけど、原因がわかったので、Windows版mackerel-agentをいじって試していた。公式提出の前にセルフPR。

github.com

GoコードだからLinux上でもビルドできるだろう、とはいかず、実装の都合でWindowsネイティブ環境でビルドしないといけないことになっている。さらに言えばWindowsネイティブといってもさらにそこからMSYS2 MINGW64環境の中でビルドする必要がある。

最初にGo環境をネイティブにインストールする。msiをダウンロード、インストールするだけ。C:\Program Files\Goに入るが特段問題ない。

Gitのインストール、作業用のVisual Studio Codeインストールも普通にやる。

MSYS2からインストーラ(msys2-x86_64-〜)をダウンロードし、インストールする。

開いたシェルターミナルでpacman -S mingw-w64-x86_64-toolchainを実行し、コンパイラ類をインストール。32ビット版を作りたければここで32ビット版ツールチェインもインストールできる。

シェルのパス設定を反映し直すために一度シェルターミナルからexitで抜け、再度MSYS2 MINGW64を実行。

goコマンドは/c/Program\ Files/Go/bin/goで呼び出せる。Windowsネイティブ側で/Users/kmuto/mackerel-agentに展開していたとするとこんな感じ。

$ cd /c/Users/kmuto/mackerel-agent/
$ /c/Program\ Files/Go/bin/go build
go: downloading github.com/Songmu/retry v0.1.0
go: downloading github.com/Songmu/prompter v0.5.1
go: downloading github.com/motemen/go-cli v0.0.0-20180105012931-9961a876eb5f
go: downloading github.com/mackerelio/golib v1.2.1
go: downloading github.com/fatih/color v1.18.0
go: downloading github.com/BurntSushi/toml v1.3.2
go: downloading github.com/agext/levenshtein v1.2.3
go: downloading github.com/pkg/errors v0.9.1
go: downloading github.com/mackerelio/mackerel-client-go v0.36.0
go: downloading github.com/Songmu/timeout v0.4.0
go: downloading golang.org/x/text v0.23.0
go: downloading github.com/yusufpapurcu/wmi v1.2.4
go: downloading github.com/go-ole/go-ole v1.2.6
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading github.com/mattn/go-colorable v0.1.13
go: downloading golang.org/x/sys v0.25.0
go: downloading golang.org/x/term v0.0.0-20220526004731-065cf7ba2467
go: downloading github.com/Songmu/wrapcommander v0.1.0
$ ls -l mackerel-agent.exe
-rwxr-xr-x 1 kmuto kmuto 18802118 Apr 20 11:34 mackerel-agent.exe

ダウンロードしたモジュールはMSYS2内の/homeではなくWindows側ユーザーフォルダにgoフォルダができてそこに置かれていた。

なお、もしMSYS2経由でなく直接Windowsネイティブでビルドするとどうなるかというと…

PS C:\Users\kmuto\mackerel-agent> go build
# github.com/mackerelio/mackerel-agent/util/windows
util\windows\filesystem.go:35:15: undefined: GetLogicalDriveStrings
util\windows\filesystem.go:50:14: undefined: GetDriveType
util\windows\filesystem.go:51:12: undefined: DRIVE_FIXED
util\windows\filesystem.go:64:16: undefined: QueryDosDevice
util\windows\filesystem.go:79:15: undefined: GetVolumeInformationW
util\windows\filesystem.go:98:15: undefined: GetDiskFreeSpaceEx

なるほどね。実体としてはkernel32.dllGetLogicalDriveStringsWを自前で呼び出す、みたいなことになっていた。

やっていることは変わらなそうだけどx/sys/windowsに同じものがあるっぽいので、こちらに切り替えられるとagent側のコードはもう少し読みやすくなるのかな。クロスビルドできるようになるかなど何もわからないが。




以上の内容はhttps://kmuto.hatenablog.com/entry/2025/04/20/120200より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14