🌐

Goでのクロスコンパイル応用:複数プラットフォーム向けにビルドする方法

2025/02/23に公開

はじめに

Go言語は、クロスコンパイルの機能が充実しており、1つのコードベースから複数のプラットフォーム向けにバイナリを生成することができます。
Windows, macOS, Linux, ARMなど、様々なOSやアーキテクチャ向けのアプリケーションを開発・配布する際に非常に便利です。


クロスコンパイルとは?

クロスコンパイルとは、現在使用しているOSとは異なるプラットフォーム向けの実行ファイルを生成することを指します。

例:

  • macOSでWindows用の実行ファイルをビルド
  • LinuxでmacOS用のバイナリを作成
  • x86マシンでARM用のバイナリを生成

GoはGOOS(ターゲットの OS)とGOARCH(ターゲットのアーキテクチャ)を指定するだけで、クロスコンパイルが可能です。


クロスコンパイルの基本

1. GOOSとGOARCHの組み合わせ

Goで使用できるGOOSとGOARCHの組み合わせは以下の通りです。

GOOS GOARCH 説明
linux amd64 64-bit Linux
linux arm64 64-bit ARM Linux
darwin amd64 macOS x86_64
darwin arm64 macOS M1 (Apple Silicon)
windows amd64 64-bit Windows
windows 386 32-bit Windows

2. クロスコンパイルの基本コマンド

例えば、Linux用の64-bit実行ファイルをmacOSでビルドする場合は以下のように実行します。

GOOS=linux GOARCH=amd64 go build -o app-linux main.go

Windows用のバイナリを生成する場合:

GOOS=windows GOARCH=amd64 go build -o app.exe main.go
  • GOOS:ターゲットの OS を指定
  • GOARCH:ターゲットのアーキテクチャを指定
  • -o:出力ファイルの名前を指定

応用:すべてのプラットフォーム向けにビルドする

1. シェルスクリプトを使用した一括ビルド

複数のプラットフォーム向けにバイナリを一括で生成するには、シェルスクリプトを使うと便利です。

build.sh

#!/bin/bash

platforms=(
  "windows/amd64"
  "linux/amd64"
  "linux/arm64"
  "darwin/amd64"
  "darwin/arm64"
)

for platform in "${platforms[@]}"
do
  GOOS=${platform%/*}
  GOARCH=${platform#*/}
  output_name='app-'$GOOS'-'$GOARCH
  if [ $GOOS = "windows" ]; then
    output_name+='.exe'
  fi
  
  echo "Building for $GOOS/$GOARCH..."
  env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name main.go
  if [ $? -ne 0 ]; then
    echo "An error has occurred! Aborting the script execution..."
    exit 1
  fi
done

実行方法

chmod +x build.sh
./build.sh
  • GOOSとGOARCHをループで回し、複数のバイナリを生成
  • output_nameをOSやアーキテクチャに応じて動的に設定
  • エラーチェックを追加して、ビルド失敗時にスクリプトを中断

応用:CGO を使ったクロスコンパイル

GoはCGOを使用してC言語のライブラリを呼び出すことができますが、クロスコンパイルを行う場合には設定が必要です。

1. CGOを無効化する

まず、CGO_ENABLEDを0に設定して無効化することで、依存関係を排除します。

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app-linux main.go

2. CGOを有効化してクロスコンパイル

CGOを使用する場合、ターゲット環境のクロスコンパイラが必要です。

例:macOS から Linux 用にビルドする

brew install FiloSottile/musl-cross/musl-cross  # macOSの場合
CGO_ENABLED=1 CC=x86_64-linux-musl-gcc GOOS=linux GOARCH=amd64 go build -o app-linux main.go
  • CGO_ENABLED=1:CGO を有効化
  • CC:ターゲット環境に合わせたクロスコンパイラを指定

CI/CD への組み込み

1. GitHub Actions を使ったクロスコンパイル

GitHub Actionsを使うことで、プッシュ時に自動でクロスコンパイルを実行できます。

.github/workflows/build.yml

name: Build Cross-Platform Binaries

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        goos: [linux, windows, darwin]
        goarch: [amd64, arm64]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: '1.19'

      - name: Build
        run: |
          GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -o app-${{ matrix.goos }}-${{ matrix.goarch }} main.go

      - name: Upload artifacts
        uses: actions/upload-artifact@v2
        with:
          name: binaries
          path: app-*
  • matrix を使用して、複数のプラットフォームに対して並列にビルド
  • バイナリをGitHub Actionsのartifactsとしてアップロード

まとめ

項目 説明
GOOS と GOARCH ターゲットの OS とアーキテクチャを指定してクロスコンパイル
CGO C 言語のライブラリを利用する場合、クロスコンパイラが必要
GitHub Actions CI/CD に組み込み、複数プラットフォームへのビルドを自動化

Goのクロスコンパイルを活用することで、マルチプラットフォームに対応したアプリケーションを効率よく開発・配布できます。

Discussion