ソースからのGoのインストール
このトピックでは、ソースコードからGoをビルドして実行する方法について説明します。インストーラーでインストールするには、ダウンロードとインストールを参照してください。
はじめに
Goは、BSDスタイルのライセンスで配布されるオープンソースプロジェクトです。このドキュメントでは、ソースをチェックアウトし、自分のマシンでビルドして実行する方法について説明します。
ほとんどのユーザーはこれを行う必要はなく、ダウンロードとインストールで説明されているように、事前にコンパイルされたバイナリパッケージからインストールする方がはるかに簡単なプロセスです。ただし、これらの事前にコンパイルされたパッケージに含まれるものを開発するのを手伝いたい場合は、読み進めてください。
公式のGoコンパイラツールチェーンは2つあります。このドキュメントでは、gc
Goコンパイラとツールに焦点を当てています。GCCバックエンドを使用するより伝統的なコンパイラであるgccgo
の操作方法については、gccgoの設定と使用を参照してください。
Goコンパイラは、次の命令セットをサポートしています
-
amd64
、386
x86
命令セット、64ビットおよび32ビット。-
arm64
、arm
ARM
命令セット、64ビット(AArch64
)および32ビット。-
loong64
- 64ビットLoongArch命令セット。
-
mips64
、mips64le
、mips
、mipsle
MIPS
命令セット、ビッグエンディアンおよびリトルエンディアン、64ビットおよび32ビット。-
ppc64
、ppc64le
- 64ビットPowerPC命令セット、ビッグエンディアンおよびリトルエンディアン。
-
riscv64
- 64ビットRISC-V命令セット。
-
s390x
- IBM z/Architecture。
-
wasm
- WebAssembly.
コンパイラは、AIX、Android、DragonFly BSD、FreeBSD、Illumos、Linux、macOS/iOS(Darwin)、NetBSD、OpenBSD、Plan 9、Solaris、およびWindowsオペレーティングシステムをターゲットにすることができます(ただし、すべてのオペレーティングシステムがすべてのアーキテクチャをサポートしているわけではありません)。
「ファーストクラス」と見なされるポートのリストは、ファーストクラスポートのwikiページで入手できます。
サポートされている組み合わせの完全なセットは、以下の環境変数の説明に記載されています。
全体的なシステム要件については、Go WikiのMinimumRequirementsページを参照してください。
ブートストラップ用のGoコンパイラバイナリをインストールする
GoツールチェーンはGoで記述されています。これをビルドするには、Goコンパイラがインストールされている必要があります。ツールの初期ビルドを行うスクリプトは、$PATH
で「go」コマンドを検索するため、システムにGoがインストールされ、$PATH
で構成されている限り、ソースからGoをビルドする準備ができています。または、$GOROOT_BOOTSTRAP
を新しいGoツールチェーンのビルドに使用するGoインストールのルートに設定することもできます。$GOROOT_BOOTSTRAP/bin/go
が使用するgoコマンドである必要があります。
必要なGoの最小バージョンは、Goのターゲットバージョンによって異なります
- Go <= 1.4:Cツールチェーン。
- 1.5 <= Go <= 1.19:Go 1.4コンパイラ。
- 1.20 <= Go <= 1.21:Go 1.17コンパイラ。
- 1.22 <= Go <= 1.23:Go 1.20コンパイラ。
- 今後、Goバージョン1.NではGo 1.Mコンパイラが必要になります。ここで、MはN-2を偶数に切り下げたものです。例:Go 1.24および1.25にはGo 1.22が必要です。
ブートストラップツールチェーンを取得するには、4つの方法があります
- Goの最新のバイナリリリースをダウンロードします。
- 動作するGoインストールがあるシステムを使用してツールチェーンをクロスコンパイルします。
- gccgoを使用します。
- Cで記述されたコンパイラを備えた最後のGoリリースであるGo 1.4からツールチェーンをコンパイルします。
これらのアプローチについては、以下で詳しく説明します。
バイナリリリースからのブートストラップツールチェーン
バイナリリリースをブートストラップツールチェーンとして使用するには、ダウンロードページを参照するか、最小バージョン要件を満たす他のパッケージ化されたGoディストリビューションを使用してください。
クロスコンパイルされたソースからのブートストラップツールチェーン
ソースからブートストラップツールチェーンをクロスコンパイルするには、Go 1.4がターゲットにしなかったシステム(たとえば、linux/ppc64le
)で必要なため、別のシステムにGoをインストールして、bootstrap.bashを実行します。
たとえば、次のように実行すると
$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash
bootstrap.bash
は、そのGOOS/GOARCH
の組み合わせのツールチェーンをクロスコンパイルし、結果のツリーを../../go-${GOOS}-${GOARCH}-bootstrap
に残します。そのツリーは、指定されたターゲットタイプのマシンにコピーし、GOROOT_BOOTSTRAP
としてローカルビルドをブートストラップするために使用できます。
gccgoを使用したブートストラップツールチェーン
gccgoをブートストラップツールチェーンとして使用するには、$GOROOT_BOOTSTRAP/bin/go
がgccgo 5の一部として付属するgoツールであるように設定する必要があります。たとえば、Ubuntu Vividでは
$ sudo apt-get install gccgo-5 $ sudo update-alternatives --set go /usr/bin/go-5 $ GOROOT_BOOTSTRAP=/usr ./make.bash
Cソースコードからのブートストラップツールチェーン
Cソースコードからブートストラップツールチェーンをビルドするには、gitブランチrelease-branch.go1.4
、またはgo1.4-bootstrap-20171003.tar.gzを使用します。これには、Go 1.4ソースコードに加えて、新しいオペレーティングシステムでツールを実行し続けるための累積的な修正が含まれています。(Go 1.4は、ツールチェーンがCで記述された最後のディストリビューションでした。)Go 1.4ソースを展開した後、src
サブディレクトリにcd
し、環境でCGO_ENABLED=0
を設定して、make.bash
(またはWindowsの場合はmake.bat
)を実行します。
Go 1.4ソースがGOROOT_BOOTSTRAPディレクトリに展開されたら、このgitクローンインスタンスをブランチrelease-branch.go1.4
にチェックアウトしたままにする必要があります。具体的には、後の「リポジトリをフェッチする」というステップでこのgitクローンを再利用しようとしないでください。go1.4ブートストラップツールチェーンは、このリポジトリルートの下に存在すると想定されているgo1.4ソースを適切にトラバースできる必要があります。
Go 1.4は、後のバージョンのGoが行うすべてのシステムで実行されるわけではないことに注意してください。特に、Go 1.4は現在のmacOSバージョンをサポートしていません。このようなシステムでは、ブートストラップツールチェーンは他のいずれかの方法を使用して取得する必要があります。
必要に応じてGitをインストールする
次のステップを実行するには、Gitがインストールされている必要があります。(続行する前にgit
コマンドがあることを確認してください。)
動作するGitインストールがない場合は、Gitダウンロードページの指示に従ってください。
(オプション)Cコンパイラをインストールする
GoプログラムがCライブラリをインポートできるようにするcgo
サポートを使用してGoインストールをビルドするには、最初にgcc
やclang
などのCコンパイラをインストールする必要があります。システムの標準的なインストール方法を使用してこれを行います。
cgo
なしでビルドするには、all.bash
またはmake.bash
を実行する前に、環境変数CGO_ENABLED=0
を設定します。
リポジトリをフェッチする
Goをインストールするディレクトリに移動し、goroot
ディレクトリが存在しないことを確認してください。次に、リポジトリをクローンし、最新のリリースタグまたはリリースブランチ(たとえば、go1.22.0
、またはrelease-branch.go1.22
)をチェックアウトします。
$ git clone https://go.googlesource.com/go goroot
$ cd goroot
$ git checkout <tag>
ここで、<tag>
はリリースのバージョン文字列です。
Goはチェックアウトされたディレクトリにインストールされます。たとえば、Goが$HOME/goroot
にチェックアウトされている場合、実行可能ファイルは$HOME/goroot/bin
にインストールされます。ディレクトリには任意の名前を付けることができますが、Goが$HOME/go
にチェックアウトされている場合、$GOPATH
のデフォルトの場所と競合することに注意してください。以下のGOPATH
を参照してください。
注意:ブートストラップバイナリもソースからコンパイルすることを選択した場合(前のセクション)、go1.4リポジトリを区別しておく必要があるため、この時点で再度git clone
する必要があります(最新の<tag>
をチェックアウトするため)。
(オプション)masterブランチに切り替える
goソースコードを変更し、変更をプロジェクトにコントリビューションする場合は、リポジトリをリリースタグからmaster(開発)ブランチに移動します。それ以外の場合は、このステップをスキップしてください。
$ git checkout master
Goをインストールする
Goディストリビューションをビルドするには、次を実行します。
$ cd src $ ./all.bash
(Windowsでビルドするには、all.bat
を使用します。)
すべてがうまくいけば、次のような出力が表示されて終了します。
ALL TESTS PASSED --- Installed Go for linux/amd64 in /home/you/go. Installed commands in /home/you/go/bin. *** You need to add /home/you/go/bin to your $PATH. ***
最後の数行の詳細は、インストール中に使用されたオペレーティングシステム、アーキテクチャ、ルートディレクトリを反映しています。
ビルドを制御する方法の詳細については、以下の環境変数の説明を参照してください。all.bash
(またはall.bat
)はGoの重要なテストを実行します。これには、Goをビルドするだけの場合よりも時間がかかる可能性があります。テストスイートを実行したくない場合は、代わりにmake.bash
(またはmake.bat
)を使用してください。
インストールのテスト
簡単なプログラムをビルドして、Goが正しくインストールされていることを確認します。
hello.go
という名前のファイルを作成し、次のプログラムを記述します
package main import "fmt" func main() { fmt.Printf("hello, world\n") }
次に、go
ツールで実行します
$ go run hello.go hello, world
「hello, world」メッセージが表示されたら、Goは正しくインストールされています。
作業環境を設定する
もう少しで完了です。あと少しセットアップが必要です。
Goコードの書き方 Goツールのセットアップ方法と使い方を学びましょう
Goコードの書き方ドキュメントには、Goツールを使用するための必須のセットアップ手順が記載されています。
追加ツールのインストール
いくつかのGoツール(goplsを含む)のソースコードは、golang.org/x/toolsリポジトリで管理されています。ツールの1つ(この場合はgopls
)をインストールするには、次のようにします。
$ go install golang.org/x/tools/gopls@latest
コミュニティリソース
ヘルプページに掲載されている通常のコミュニティリソースには、インストールや開発作業に関する問題に対応できるアクティブな開発者がいます。最新情報を把握したい方のために、Goリポジトリへの各チェックインをまとめたメッセージを受信する別のメーリングリスト、golang-checkinsもあります。
バグはGo issue trackerを使用して報告できます。
リリース情報の把握
新しいリリースは、golang-announceメーリングリストで発表されます。各発表では、最新のリリースタグ(例:go1.9
)が言及されます。
既存のツリーを最新リリースに更新するには、次のコマンドを実行できます。
$ cd go/src
$ git fetch
$ git checkout <tag>
$ ./all.bash
ここで、<tag>
はリリースのバージョン文字列です。
オプションの環境変数
Goコンパイル環境は環境変数でカスタマイズできます。ビルドで必須となるものはありませんが、デフォルトを上書きするために設定したいものがあるかもしれません。
$GOROOT
Goツリーのルートで、多くの場合
$HOME/go1.X
です。この値はコンパイル時にツリーに組み込まれ、デフォルトではall.bash
が実行されたディレクトリの親ディレクトリになります。リポジトリの複数のローカルコピーを切り替えたい場合を除き、これを設定する必要はありません。$GOROOT_FINAL
$GOROOT
が明示的に設定されていない場合に、インストールされたバイナリおよびスクリプトが想定する値。デフォルトは$GOROOT
の値です。Goツリーをある場所にビルドし、ビルド後に別の場所に移動する場合は、$GOROOT_FINAL
を最終的な場所に設定します。$GOPATH
通常、Go配布物以外のGoプロジェクトがチェックアウトされるディレクトリ。たとえば、
golang.org/x/tools
は$GOPATH/src/golang.org/x/tools
にチェックアウトされる場合があります。Go配布物以外の実行可能ファイルは$GOPATH/bin
(または$GOBIN
が設定されている場合は$GOBIN
)にインストールされます。モジュールは$GOPATH/pkg/mod
にダウンロードおよびキャッシュされます。$GOPATH
のデフォルトの場所は$HOME/go
であり、通常はGOPATH
を明示的に設定する必要はありません。ただし、Go配布物を$HOME/go
にチェックアウトしている場合は、競合を避けるためにGOPATH
を別の場所に設定する必要があります。$GOBIN
goコマンドを使用して、Go配布物以外の実行可能ファイルがインストールされるディレクトリ。たとえば、
go install golang.org/x/tools/gopls@latest
は、$GOBIN/gopls
をダウンロード、ビルド、インストールします。デフォルトでは、$GOBIN
は$GOPATH/bin
(またはGOPATH
が設定されていない場合は$HOME/go/bin
)です。インストール後、インストールされたツールを使用できるように、このディレクトリを$PATH
に追加する必要があります。Go配布物の実行可能ファイルは、
$GOBIN
ではなく、$GOROOT/bin
(ユーザーが呼び出す実行可能ファイルの場合)または$GOTOOLDIR
(goコマンドによって呼び出される実行可能ファイルの場合。デフォルトは$GOROOT/pkg/$GOOS_$GOARCH
)にインストールされることに注意してください。$GOOS
および$GOARCH
ターゲットオペレーティングシステムとコンパイルアーキテクチャの名前。これらは、それぞれ
$GOHOSTOS
および$GOHOSTARCH
の値(後述)にデフォルト設定されます。$GOOS
の選択肢は、android
、darwin
、dragonfly
、freebsd
、illumos
、ios
、js
、linux
、netbsd
、openbsd
、plan9
、solaris
、wasip1
、およびwindows
です。$GOARCH
の選択肢は、amd64
(64ビットx86、最も成熟したポート)、386
(32ビットx86)、arm
(32ビットARM)、arm64
(64ビットARM)、ppc64le
(PowerPC 64ビット、リトルエンディアン)、ppc64
(PowerPC 64ビット、ビッグエンディアン)、mips64le
(MIPS 64ビット、リトルエンディアン)、mips64
(MIPS 64ビット、ビッグエンディアン)、mipsle
(MIPS 32ビット、リトルエンディアン)、mips
(MIPS 32ビット、ビッグエンディアン)、s390x
(IBM System z 64ビット、ビッグエンディアン)、およびwasm
(WebAssembly 32ビット)です。$GOOS
と$GOARCH
の有効な組み合わせは次のとおりです。$GOOS
$GOARCH
aix
ppc64
android
386
android
amd64
android
arm
android
arm64
darwin
amd64
darwin
arm64
dragonfly
amd64
freebsd
386
freebsd
amd64
freebsd
arm
illumos
amd64
ios
arm64
js
wasm
linux
386
linux
amd64
linux
arm
linux
arm64
linux
loong64
linux
mips
linux
mipsle
linux
mips64
linux
mips64le
linux
ppc64
linux
ppc64le
linux
riscv64
linux
s390x
netbsd
386
netbsd
amd64
netbsd
arm
openbsd
386
openbsd
amd64
openbsd
arm
openbsd
arm64
plan9
386
plan9
amd64
plan9
arm
solaris
amd64
wasip1
wasm
windows
386
windows
amd64
windows
arm
windows
arm64
$GOHOSTOS
および$GOHOSTARCH
ホストオペレーティングシステムとコンパイルアーキテクチャの名前。これらは、ローカルシステムのオペレーティングシステムとアーキテクチャにデフォルト設定されます。
有効な選択肢は、上記の
$GOOS
および$GOARCH
と同じです。指定された値は、ローカルシステムと互換性がある必要があります。たとえば、x86システムで$GOHOSTARCH
をarm
に設定しないでください。$GO386
(386
の場合のみ、デフォルトはsse2
)この変数は、gcが浮動小数点計算をどのように実装するかを制御します。
GO386=softfloat
:ソフトウェア浮動小数点演算を使用します。すべてのx86チップ(Pentium MMX以降)をサポートする必要があります。GO386=sse2
:浮動小数点演算にSSE2を使用します。パフォーマンスは向上しますが、Pentium 4/Opteron/Athlon 64以降でのみ利用可能です。
$GOARM
(arm
の場合のみ、ターゲットプロセッサでビルドしている場合は自動検出され、それ以外の場合は7がデフォルト)これは、ランタイムがターゲットとするARM浮動小数点コプロセッサアーキテクチャのバージョンを設定します。ターゲットシステムでコンパイルしている場合、その値は自動的に検出されます。
GOARM=5
:ソフトウェア浮動小数点を使用します。CPUにVFPコプロセッサがない場合GOARM=6
:VFPv1のみを使用します。クロスコンパイルの場合のデフォルト。通常はARM11またはそれ以上のコア(VFPv2以上もサポートされています)GOARM=7
:VFPv3を使用します。通常はCortex-Aコア
不明な場合は、この変数を設定せずにそのままにして、Go実行可能ファイルを最初に実行するときに必要に応じて調整してください。GoコミュニティwikiのGoARMページには、GoのARMサポートに関する詳細が記載されています。
$GOAMD64
(amd64
の場合のみ、デフォルトはv1
)これは、コンパイルするマイクロアーキテクチャレベルを設定します。有効な値は、
v1
(デフォルト)、v2
、v3
、v4
です。詳細については、Go wikiのMinimumRequirementsページを参照してください。$GOMIPS
(mips
およびmipsle
の場合のみ)
$GOMIPS64
(mips64
およびmips64le
の場合のみ)これらの変数は、浮動小数点命令を使用するかどうかを設定します。浮動小数点命令を使用するには「
hardfloat
」に設定します。これがデフォルトです。ソフトウェア浮動小数点を使用するには「softfloat
」に設定します。$GOPPC64
(ppc64
およびppc64le
の場合のみ)この変数は、コンパイラがターゲットとするプロセッサレベル(つまり、命令セットアーキテクチャバージョン)を設定します。デフォルトは
power8
です。GOPPC64=power8
:ISA v2.07命令を生成しますGOPPC64=power9
:ISA v3.00命令を生成します
$GOWASM
(wasm
の場合のみ)この変数は、コンパイルされたWebAssemblyバイナリで使用できる実験的なWebAssembly機能のカンマ区切りリストです。デフォルトでは、実験的な機能は使用されません。
GOWASM=satconv
:飽和(非トラップ)浮動小数点から整数への変換を生成しますGOWASM=signext
:符号拡張演算子を生成します
$GOARCH
および$GOOS
は、実行している環境ではなく、ターゲット環境を識別することに注意してください。実際には、常にクロスコンパイルしています。アーキテクチャとは、ターゲット環境が実行できるバイナリの種類を意味します。32ビットのみのオペレーティングシステムを実行しているx86-64システムは、GOARCH
をamd64
ではなく386
に設定する必要があります。
デフォルトを上書きする場合は、これらの変数をシェルプロファイル($HOME/.bashrc
、$HOME/.profile
、または同等のもの)に設定します。設定は次のようになる可能性があります。
export GOARCH=amd64 export GOOS=linux
ただし、繰り返しますが、Goツリーをビルド、インストール、および開発するためにこれらの変数のいずれも設定する必要はありません。