blob: 4ed9487504c897f4bb5ae00b404ce2b013efe585 [file] [log] [blame]
Andrew Gerrande07f0892012-02-14 17:02:28 +11001<!--{
2 "Title": "Installing Go from source",
Andrew Gerrandf78d50c2012-03-05 14:31:27 +11003 "Path": "/doc/install/source"
Andrew Gerrande07f0892012-02-14 17:02:28 +11004}-->
5
6<h2 id="introduction">Introduction</h2>
7
Rob Pike95d7d3d2012-03-03 09:36:09 +11008<p>
9Go is an open source project, distributed under a
Andrew Gerrande07f0892012-02-14 17:02:28 +110010<a href="/LICENSE">BSD-style license</a>.
11This document explains how to check out the sources,
12build them on your own machine, and run them.
13</p>
14
Rob Pike95d7d3d2012-03-03 09:36:09 +110015<p>
16Most users don't need to do this, and will instead install
17from precompiled binary packages as described in
Andrew Gerrandf78d50c2012-03-05 14:31:27 +110018<a href="/doc/install">Getting Started</a>,
Rob Pike95d7d3d2012-03-03 09:36:09 +110019a much simpler process.
20If you want to help develop what goes into those precompiled
21packages, though, read on.
22</p>
23
Andrew Gerrande07f0892012-02-14 17:02:28 +110024<div class="detail">
25
26<p>
Russ Coxb6c871a2018-01-09 15:26:21 -050027There are two official Go compiler toolchains.
Andrew Gerrande07f0892012-02-14 17:02:28 +110028This document focuses on the <code>gc</code> Go
Aaron Jacobs86286882015-06-24 09:50:12 +100029compiler and tools.
Rob Pike95d7d3d2012-03-03 09:36:09 +110030For information on how to work on <code>gccgo</code>, a more traditional
Andrew Gerrande07f0892012-02-14 17:02:28 +110031compiler using the GCC back end, see
Andrew Gerrandf78d50c2012-03-05 14:31:27 +110032<a href="/doc/install/gccgo">Setting up and using gccgo</a>.
Andrew Gerrande07f0892012-02-14 17:02:28 +110033</p>
34
35<p>
Shenghou Ma8adff322016-12-01 23:12:18 -050036The Go compilers support eight instruction sets.
Andrew Gerrande07f0892012-02-14 17:02:28 +110037There are important differences in the quality of the compilers for the different
38architectures.
39</p>
40
41<dl>
42<dt>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +120043 <code>amd64</code> (also known as <code>x86-64</code>)
Andrew Gerrande07f0892012-02-14 17:02:28 +110044</dt>
45<dd>
Quentin Smithf35b8652016-10-18 15:54:04 -040046 A mature implementation.
Andrew Gerrande07f0892012-02-14 17:02:28 +110047</dd>
48<dt>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +120049 <code>386</code> (<code>x86</code> or <code>x86-32</code>)
Andrew Gerrande07f0892012-02-14 17:02:28 +110050</dt>
51<dd>
Quentin Smithf35b8652016-10-18 15:54:04 -040052 Comparable to the <code>amd64</code> port.
Andrew Gerrande07f0892012-02-14 17:02:28 +110053</dd>
54<dt>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +120055 <code>arm</code> (<code>ARM</code>)
Andrew Gerrande07f0892012-02-14 17:02:28 +110056</dt>
57<dd>
Shenghou Ma8adff322016-12-01 23:12:18 -050058 Supports Linux, FreeBSD, NetBSD, OpenBSD and Darwin binaries. Less widely used than the other ports.
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +120059</dd>
60<dt>
61 <code>arm64</code> (<code>AArch64</code>)
62</dt>
63<dd>
Robert Griesemer93e8e702016-05-24 14:12:35 -070064 Supports Linux and Darwin binaries. New in 1.5 and not as well exercised as other ports.
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +120065</dd>
66<dt>
67 <code>ppc64, ppc64le</code> (64-bit PowerPC big- and little-endian)
68</dt>
69<dd>
Robert Griesemer93e8e702016-05-24 14:12:35 -070070 Supports Linux binaries. New in 1.5 and not as well exercised as other ports.
Andrew Gerrande07f0892012-02-14 17:02:28 +110071</dd>
Shenghou Mad75391a2015-11-13 03:12:26 -050072<dt>
Shenghou Ma8adff322016-12-01 23:12:18 -050073 <code>mips, mipsle</code> (32-bit MIPS big- and little-endian)
74</dt>
75<dd>
76 Supports Linux binaries. New in 1.8 and not as well exercised as other ports.
77</dd>
78<dt>
Shenghou Mad75391a2015-11-13 03:12:26 -050079 <code>mips64, mips64le</code> (64-bit MIPS big- and little-endian)
80</dt>
81<dd>
Robert Griesemer93e8e702016-05-24 14:12:35 -070082 Supports Linux binaries. New in 1.6 and not as well exercised as other ports.
Shenghou Mad75391a2015-11-13 03:12:26 -050083</dd>
Andrew Gerrand349f0fb2016-06-20 15:33:52 +100084<dt>
85 <code>s390x</code> (IBM System z)
86</dt>
87<dd>
88 Supports Linux binaries. New in 1.7 and not as well exercised as other ports.
89</dd>
Andrew Gerrande07f0892012-02-14 17:02:28 +110090</dl>
91
92<p>
93Except for things like low-level operating system interface code, the run-time
94support is the same in all ports and includes a mark-and-sweep garbage
95collector, efficient array and string slicing, and support for efficient
96goroutines, such as stacks that grow and shrink on demand.
97</p>
98
99<p>
Mikio Hara34767042014-03-26 14:06:18 +0900100The compilers can target the DragonFly BSD, FreeBSD, Linux, NetBSD, OpenBSD,
101OS X (Darwin), Plan 9, Solaris and Windows operating systems.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100102The full set of supported combinations is listed in the discussion of
103<a href="#environment">environment variables</a> below.
104</p>
105
Russ Coxd02193c2016-01-06 15:51:01 -0500106<p>
107See the main installation page for the <a href="/doc/install#requirements">overall system requirements</a>.
108The following additional constraints apply to systems that can be built only from source:
109</p>
110
111<ul>
112<li>For Linux on PowerPC 64-bit, the minimum supported kernel version is 2.6.37, meaning that
113Go does not support CentOS 6 on these systems.
114</li>
115</ul>
116
Andrew Gerrande07f0892012-02-14 17:02:28 +1100117</div>
118
Andrew Gerrand3b67e9c2015-02-11 12:44:50 +1100119<h2 id="go14">Install Go compiler binaries</h2>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100120
121<p>
Russ Coxb6c871a2018-01-09 15:26:21 -0500122The Go toolchain is written in Go. To build it, you need a Go compiler installed.
Andrew Gerrand3b67e9c2015-02-11 12:44:50 +1100123The scripts that do the initial build of the tools look for an existing Go tool
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000124chain in <code>$GOROOT_BOOTSTRAP</code>.
125If unset, the default value of <code>GOROOT_BOOTSTRAP</code>
126is <code>$HOME/go1.4</code>.
Andrew Gerrand3b67e9c2015-02-11 12:44:50 +1100127</p>
128
129<p>
Russ Coxb6c871a2018-01-09 15:26:21 -0500130There are many options for the bootstrap toolchain.
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000131After obtaining one, set <code>GOROOT_BOOTSTRAP</code> to the
132directory containing the unpacked tree.
133For example, <code>$GOROOT_BOOTSTRAP/bin/go</code> should be
Russ Coxb6c871a2018-01-09 15:26:21 -0500134the <code>go</code> command binary for the bootstrap toolchain.
Andrew Gerrand3b67e9c2015-02-11 12:44:50 +1100135</p>
136
137<p>
Russ Coxb6c871a2018-01-09 15:26:21 -0500138To use a binary release as a bootstrap toolchain, see
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000139<a href="/dl/">the downloads page</a> or use any other
140packaged Go distribution.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100141</p>
142
Michael Hudson-Doyledeb6c5b2015-06-10 22:13:39 +1200143<p>
Russ Coxb6c871a2018-01-09 15:26:21 -0500144To build a bootstrap toolchain from source, use
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000145either the git branch <code>release-branch.go1.4</code> or
Andrew Bonventre4aac23c2017-11-26 11:30:39 -0500146<a href="https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz">go1.4-bootstrap-20171003.tar.gz</a>,
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000147which contains the Go 1.4 source code plus accumulated fixes
148to keep the tools running on newer operating systems.
Russ Coxb6c871a2018-01-09 15:26:21 -0500149(Go 1.4 was the last distribution in which the toolchain was written in C.)
Ian Lance Taylor1db16712017-01-24 09:56:57 -0800150After unpacking the Go 1.4 source, <code>cd</code> to
Ian Lance Taylor67388e92017-09-08 14:38:10 -0700151the <code>src</code> subdirectory, set <code>CGO_ENABLED=0</code> in
152the environment, and run <code>make.bash</code> (or,
Ian Lance Taylor1db16712017-01-24 09:56:57 -0800153on Windows, <code>make.bat</code>).
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000154</p>
155
156<p>
Russ Coxb6c871a2018-01-09 15:26:21 -0500157To cross-compile a bootstrap toolchain from source, which is
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000158necessary on systems Go 1.4 did not target (for
159example, <code>linux/ppc64le</code>), install Go on a different system
160and run <a href="/src/bootstrap.bash">bootstrap.bash</a>.
Michael Hudson-Doyledeb6c5b2015-06-10 22:13:39 +1200161</p>
162
163<p>
164When run as (for example)
165</p>
166
167<pre>
168$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash
169</pre>
170
171<p>
172<code>bootstrap.bash</code> cross-compiles a toolchain for that <code>GOOS/GOARCH</code>
173combination, leaving the resulting tree in <code>../../go-${GOOS}-${GOARCH}-bootstrap</code>.
174That tree can be copied to a machine of the given target type
175and used as <code>GOROOT_BOOTSTRAP</code> to bootstrap a local build.
176</p>
177
178<p>
Brad Fitzpatrickb9905582016-10-28 18:03:21 +0000179To use gccgo as the bootstrap toolchain, you need to arrange
180for <code>$GOROOT_BOOTSTRAP/bin/go</code> to be the go tool that comes
181as part of gccgo 5. For example on Ubuntu Vivid:
Michael Hudson-Doyledeb6c5b2015-06-10 22:13:39 +1200182</p>
183
184<pre>
185$ sudo apt-get install gccgo-5
186$ sudo update-alternatives --set go /usr/bin/go-5
187$ GOROOT_BOOTSTRAP=/usr ./make.bash
188</pre>
189
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100190<h2 id="git">Install Git, if needed</h2>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100191
192<p>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100193To perform the next step you must have Git installed. (Check that you
194have a <code>git</code> command before proceeding.)
Andrew Gerrande07f0892012-02-14 17:02:28 +1100195</p>
196
Andrew Gerrande07f0892012-02-14 17:02:28 +1100197<p>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100198If you do not have a working Git installation,
Andrew Gerrand0e596022012-04-14 13:27:11 +1000199follow the instructions on the
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100200<a href="http://git-scm.com/downloads">Git downloads</a> page.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100201</p>
202
Brad Fitzpatrickd3e61742016-01-26 22:56:08 +0000203<h2 id="ccompiler">(Optional) Install a C compiler</h2>
204
205<p>
206To build a Go installation
207with <code><a href="/cmd/cgo">cgo</a></code> support, which permits Go
208programs to import C libraries, a C compiler such as <code>gcc</code>
209or <code>clang</code> must be installed first. Do this using whatever
210installation method is standard on the system.
211</p>
212
213<p>
214To build without <code>cgo</code>, set the environment variable
215<code>CGO_ENABLED=0</code> before running <code>all.bash</code> or
216<code>make.bash</code>.
217</p>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100218
219<h2 id="fetch">Fetch the repository</h2>
220
Andrew Gerrande07f0892012-02-14 17:02:28 +1100221<p>Go will install to a directory named <code>go</code>.
222Change to the directory that will be its parent
223and make sure the <code>go</code> directory does not exist.
Andrew Gerrandd093a622016-04-14 12:12:11 +1000224Then clone the repository and check out the latest release tag
Chris Broadfootd77dfba2017-08-24 11:52:35 -0700225(<code class="versionTag">go1.9</code>, for example):</p>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100226
227<pre>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100228$ git clone https://go.googlesource.com/go
229$ cd go
Andrew Gerrandd093a622016-04-14 12:12:11 +1000230$ git checkout <span class="versionTag"><i>&lt;tag&gt;</i></span>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100231</pre>
232
Andrew Gerrandd093a622016-04-14 12:12:11 +1000233<p class="whereTag">
234Where <code>&lt;tag&gt;</code> is the version string of the release.
235</p>
236
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100237<h2 id="head">(Optional) Switch to the master branch</h2>
Jonathan Feinberg452f40f2012-09-26 14:39:31 -0400238
239<p>If you intend to modify the go source code, and
240<a href="/doc/contribute.html">contribute your changes</a>
241to the project, then move your repository
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100242off the release branch, and onto the master (development) branch.
Jonathan Feinberg452f40f2012-09-26 14:39:31 -0400243Otherwise, skip this step.</p>
244
245<pre>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100246$ git checkout master
Jonathan Feinberg452f40f2012-09-26 14:39:31 -0400247</pre>
248
Andrew Gerrande07f0892012-02-14 17:02:28 +1100249<h2 id="install">Install Go</h2>
250
251<p>
252To build the Go distribution, run
253</p>
254
255<pre>
Lloyd Dewolf972f3642015-02-25 10:57:45 -0800256$ cd src
Andrew Gerrande07f0892012-02-14 17:02:28 +1100257$ ./all.bash
258</pre>
259
260<p>
261(To build under Windows use <code>all.bat</code>.)
262</p>
263
264<p>
265If all goes well, it will finish by printing output like:
266</p>
267
268<pre>
269ALL TESTS PASSED
270
271---
272Installed Go for linux/amd64 in /home/you/go.
273Installed commands in /home/you/go/bin.
274*** You need to add /home/you/go/bin to your $PATH. ***
Andrew Gerrande07f0892012-02-14 17:02:28 +1100275</pre>
276
277<p>
278where the details on the last few lines reflect the operating system,
279architecture, and root directory used during the install.
280</p>
281
282<div class="detail">
283<p>
284For more information about ways to control the build, see the discussion of
285<a href="#environment">environment variables</a> below.
Shenghou Mac184940d2013-12-15 21:03:12 -0500286<code>all.bash</code> (or <code>all.bat</code>) runs important tests for Go,
287which can take more time than simply building Go. If you do not want to run
288the test suite use <code>make.bash</code> (or <code>make.bat</code>)
289instead.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100290</p>
291</div>
292
293
294<h2 id="testing">Testing your installation</h2>
295
296<p>
297Check that Go is installed correctly by building a simple program.
298</p>
299
300<p>
301Create a file named <code>hello.go</code> and put the following program in it:
302</p>
303
304<pre>
305package main
306
307import "fmt"
308
309func main() {
310 fmt.Printf("hello, world\n")
311}
312</pre>
313
314<p>
315Then run it with the <code>go</code> tool:
316</p>
317
318<pre>
319$ go run hello.go
320hello, world
321</pre>
322
323<p>
324If you see the "hello, world" message then Go is installed correctly.
325</p>
326
Andrew Gerrand9115a8b2012-06-13 10:33:02 +1000327<h2 id="gopath">Set up your work environment</h2>
328
329<p>
Andrew Gerrandc497c9e2013-11-21 07:55:29 +1100330You're almost done.
331You just need to do a little more setup.
Andrew Gerrand9115a8b2012-06-13 10:33:02 +1000332</p>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100333
Andrew Gerrandc497c9e2013-11-21 07:55:29 +1100334<p>
335<a href="/doc/code.html" class="download" id="start">
336<span class="big">How to Write Go Code</span>
337<span class="desc">Learn how to set up and use the Go tools</span>
338</a>
339</p>
340
341<p>
Kevin Burke64969c82016-12-01 17:45:26 -0800342The <a href="/doc/code.html">How to Write Go Code</a> document
Andrew Gerrandc497c9e2013-11-21 07:55:29 +1100343provides <b>essential setup instructions</b> for using the Go tools.
344</p>
345
346
Andrew Gerrandb3caa862013-09-25 14:10:49 +1000347<h2 id="tools">Install additional tools</h2>
348
349<p>
Andrew Gerrandbc5e77f2013-09-25 14:27:23 +1000350The source code for several Go tools (including <a href="/cmd/godoc/">godoc</a>)
Andrew Gerrand7f0be1f2014-11-10 09:15:57 +1100351is kept in <a href="https://golang.org/x/tools">the go.tools repository</a>.
Andrew Gerrandb3caa862013-09-25 14:10:49 +1000352To install all of them, run the <code>go</code> <code>get</code> command:
353</p>
354
355<pre>
Andrew Gerrand7f0be1f2014-11-10 09:15:57 +1100356$ go get golang.org/x/tools/cmd/...
Andrew Gerrandb3caa862013-09-25 14:10:49 +1000357</pre>
358
359<p>
360Or if you just want to install a specific command (<code>godoc</code> in this case):
361</p>
362
363<pre>
Andrew Gerrand7f0be1f2014-11-10 09:15:57 +1100364$ go get golang.org/x/tools/cmd/godoc
Andrew Gerrandb3caa862013-09-25 14:10:49 +1000365</pre>
366
367<p>
Kevin Burke64969c82016-12-01 17:45:26 -0800368To install these tools, the <code>go</code> <code>get</code> command requires
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100369that <a href="#git">Git</a> be installed locally.
Andrew Gerrandb3caa862013-09-25 14:10:49 +1000370</p>
371
372<p>
373You must also have a workspace (<code>GOPATH</code>) set up;
374see <a href="/doc/code.html">How to Write Go Code</a> for the details.
375</p>
376
Andrew Gerrandbc0e5152013-09-25 18:15:29 +1000377<p>
378<b>Note</b>: The <code>go</code> command will install the <code>godoc</code>
379binary to <code>$GOROOT/bin</code> (or <code>$GOBIN</code>) and the
380<code>cover</code> and <code>vet</code> binaries to
381<code>$GOROOT/pkg/tool/$GOOS_$GOARCH</code>.
382You can access the latter commands with
383"<code>go</code> <code>tool</code> <code>cover</code>" and
384"<code>go</code> <code>tool</code> <code>vet</code>".
385</p>
386
Andrew Gerrande07f0892012-02-14 17:02:28 +1100387<h2 id="community">Community resources</h2>
388
389<p>
Rob Pike95d7d3d2012-03-03 09:36:09 +1100390The usual community resources such as
391<code>#go-nuts</code> on the <a href="http://freenode.net/">Freenode</a> IRC server
392and the
Andrew Gerrand43ad89d2014-07-25 10:28:39 +1000393<a href="//groups.google.com/group/golang-nuts">Go Nuts</a>
Rob Pike95d7d3d2012-03-03 09:36:09 +1100394mailing list have active developers that can help you with problems
395with your installation or your development work.
396For those who wish to keep up to date,
Andrew Gerrand43ad89d2014-07-25 10:28:39 +1000397there is another mailing list, <a href="//groups.google.com/group/golang-checkins">golang-checkins</a>,
Rob Pike95d7d3d2012-03-03 09:36:09 +1100398that receives a message summarizing each checkin to the Go repository.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100399</p>
400
401<p>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100402Bugs can be reported using the <a href="//golang.org/issue/new">Go issue tracker</a>.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100403</p>
404
Andrew Gerrande07f0892012-02-14 17:02:28 +1100405
406<h2 id="releases">Keeping up with releases</h2>
407
408<p>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100409New releases are announced on the
Andrew Gerrand43ad89d2014-07-25 10:28:39 +1000410<a href="//groups.google.com/group/golang-announce">golang-announce</a>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100411mailing list.
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100412Each announcement mentions the latest release tag, for instance,
Chris Broadfootd77dfba2017-08-24 11:52:35 -0700413<code class="versionTag">go1.9</code>.
Andrew Gerrande07f0892012-02-14 17:02:28 +1100414</p>
415
416<p>
417To update an existing tree to the latest release, you can run:
418</p>
419
420<pre>
421$ cd go/src
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100422$ git fetch
Andrew Gerrandd093a622016-04-14 12:12:11 +1000423$ git checkout <span class="versionTag"><i>&lt;tag&gt;</i></psan>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100424$ ./all.bash
425</pre>
426
Andrew Gerrandd093a622016-04-14 12:12:11 +1000427<p class="whereTag">
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100428Where <code>&lt;tag&gt;</code> is the version string of the release.
Andrew Gerrandd093a622016-04-14 12:12:11 +1000429</p>
Andrew Gerrand968f0df2014-12-12 13:53:29 +1100430
Andrew Gerrande07f0892012-02-14 17:02:28 +1100431
432<h2 id="environment">Optional environment variables</h2>
433
434<p>
435The Go compilation environment can be customized by environment variables.
Rob Pike95d7d3d2012-03-03 09:36:09 +1100436<i>None is required by the build</i>, but you may wish to set some
Andrew Gerrande07f0892012-02-14 17:02:28 +1100437to override the defaults.
438</p>
439
Shenghou Ma17719122013-06-09 23:15:39 +0800440<ul>
441<li><code>$GOROOT</code>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100442<p>
Russ Cox74628a82016-11-30 14:56:58 -0500443The root of the Go tree, often <code>$HOME/go1.X</code>.
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100444Its value is built into the tree when it is compiled, and
445defaults to the parent of the directory where <code>all.bash</code> was run.
446There is no need to set this unless you want to switch between multiple
447local copies of the repository.
448</p>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000449</li>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100450
Shenghou Ma17719122013-06-09 23:15:39 +0800451<li><code>$GOROOT_FINAL</code>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100452<p>
453The value assumed by installed binaries and scripts when
454<code>$GOROOT</code> is not set explicitly.
455It defaults to the value of <code>$GOROOT</code>.
456If you want to build the Go tree in one location
Kevin Burke64969c82016-12-01 17:45:26 -0800457but move it elsewhere after the build, set
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100458<code>$GOROOT_FINAL</code> to the eventual location.
459</p>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000460</li>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100461
Shenghou Ma17719122013-06-09 23:15:39 +0800462<li><code>$GOOS</code> and <code>$GOARCH</code>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100463<p>
464The name of the target operating system and compilation architecture.
465These default to the values of <code>$GOHOSTOS</code> and
466<code>$GOHOSTARCH</code> respectively (described below).
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000467</li>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100468
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100469<p>
470Choices for <code>$GOOS</code> are
Brad Fitzpatrickcfea2602016-09-09 05:26:20 +0000471<code>darwin</code> (Mac OS X 10.8 and above and iOS), <code>dragonfly</code>, <code>freebsd</code>,
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +1200472<code>linux</code>, <code>netbsd</code>, <code>openbsd</code>,
Shenghou Ma708a53f92014-03-25 23:21:28 -0400473<code>plan9</code>, <code>solaris</code> and <code>windows</code>.
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100474Choices for <code>$GOARCH</code> are
475<code>amd64</code> (64-bit x86, the most mature port),
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +1200476<code>386</code> (32-bit x86), <code>arm</code> (32-bit ARM), <code>arm64</code> (64-bit ARM),
Shenghou Mad75391a2015-11-13 03:12:26 -0500477<code>ppc64le</code> (PowerPC 64-bit, little-endian), <code>ppc64</code> (PowerPC 64-bit, big-endian),
Michael Mundayc2f8ed22017-08-23 12:45:27 +0100478<code>mips64le</code> (MIPS 64-bit, little-endian), <code>mips64</code> (MIPS 64-bit, big-endian),
479<code>mipsle</code> (MIPS 32-bit, little-endian), <code>mips</code> (MIPS 32-bit, big-endian), and
480<code>s390x</code> (IBM System z 64-bit, big-endian).
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100481The valid combinations of <code>$GOOS</code> and <code>$GOARCH</code> are:
482<table cellpadding="0">
483<tr>
Shenghou Ma17719122013-06-09 23:15:39 +0800484<th width="50"></th><th align="left" width="100"><code>$GOOS</code></th> <th align="left" width="100"><code>$GOARCH</code></th>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100485</tr>
486<tr>
Burcu Dogan9e173f92016-02-24 15:06:03 -0800487<td></td><td><code>android</code></td> <td><code>arm</code></td>
488</tr>
489<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100490<td></td><td><code>darwin</code></td> <td><code>386</code></td>
491</tr>
492<tr>
493<td></td><td><code>darwin</code></td> <td><code>amd64</code></td>
494</tr>
495<tr>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +1200496<td></td><td><code>darwin</code></td> <td><code>arm</code></td>
497</tr>
498<tr>
499<td></td><td><code>darwin</code></td> <td><code>arm64</code></td>
Mikio Hara34767042014-03-26 14:06:18 +0900500</tr>
501<tr>
502<td></td><td><code>dragonfly</code></td> <td><code>amd64</code></td>
503</tr>
504<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100505<td></td><td><code>freebsd</code></td> <td><code>386</code></td>
506</tr>
507<tr>
508<td></td><td><code>freebsd</code></td> <td><code>amd64</code></td>
509</tr>
510<tr>
Shenghou Ma17719122013-06-09 23:15:39 +0800511<td></td><td><code>freebsd</code></td> <td><code>arm</code></td>
512</tr>
513<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100514<td></td><td><code>linux</code></td> <td><code>386</code></td>
515</tr>
516<tr>
517<td></td><td><code>linux</code></td> <td><code>amd64</code></td>
518</tr>
519<tr>
520<td></td><td><code>linux</code></td> <td><code>arm</code></td>
521</tr>
522<tr>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +1200523<td></td><td><code>linux</code></td> <td><code>arm64</code></td>
524</tr>
525<tr>
526<td></td><td><code>linux</code></td> <td><code>ppc64</code></td>
527</tr>
528<tr>
529<td></td><td><code>linux</code></td> <td><code>ppc64le</code></td>
530</tr>
531<tr>
Shenghou Ma8adff322016-12-01 23:12:18 -0500532<td></td><td><code>linux</code></td> <td><code>mips</code></td>
533</tr>
534<tr>
535<td></td><td><code>linux</code></td> <td><code>mipsle</code></td>
536</tr>
537<tr>
Shenghou Mad75391a2015-11-13 03:12:26 -0500538<td></td><td><code>linux</code></td> <td><code>mips64</code></td>
539</tr>
540<tr>
541<td></td><td><code>linux</code></td> <td><code>mips64le</code></td>
542</tr>
543<tr>
Michael Mundayc2f8ed22017-08-23 12:45:27 +0100544<td></td><td><code>linux</code></td> <td><code>s390x</code></td>
545</tr>
546<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100547<td></td><td><code>netbsd</code></td> <td><code>386</code></td>
548</tr>
549<tr>
550<td></td><td><code>netbsd</code></td> <td><code>amd64</code></td>
551</tr>
552<tr>
Shenghou Ma17719122013-06-09 23:15:39 +0800553<td></td><td><code>netbsd</code></td> <td><code>arm</code></td>
554</tr>
555<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100556<td></td><td><code>openbsd</code></td> <td><code>386</code></td>
557</tr>
558<tr>
559<td></td><td><code>openbsd</code></td> <td><code>amd64</code></td>
560</tr>
561<tr>
Michael Hudson-Doylef74ea6c2015-06-10 21:56:01 +1200562<td></td><td><code>openbsd</code></td> <td><code>arm</code></td>
563</tr>
564<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100565<td></td><td><code>plan9</code></td> <td><code>386</code></td>
566</tr>
567<tr>
Shenghou Ma17719122013-06-09 23:15:39 +0800568<td></td><td><code>plan9</code></td> <td><code>amd64</code></td>
569</tr>
570<tr>
Shenghou Ma708a53f92014-03-25 23:21:28 -0400571<td></td><td><code>solaris</code></td> <td><code>amd64</code></td>
572</tr>
573<tr>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100574<td></td><td><code>windows</code></td> <td><code>386</code></td>
575</tr>
576<tr>
577<td></td><td><code>windows</code></td> <td><code>amd64</code></td>
578</tr>
579</table>
Hari haran4230c732015-07-22 16:30:32 +0530580<br>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100581
Shenghou Ma17719122013-06-09 23:15:39 +0800582<li><code>$GOHOSTOS</code> and <code>$GOHOSTARCH</code>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100583<p>
584The name of the host operating system and compilation architecture.
585These default to the local system's operating system and
586architecture.
587</p>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000588</li>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100589
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100590<p>
591Valid choices are the same as for <code>$GOOS</code> and
592<code>$GOARCH</code>, listed above.
593The specified values must be compatible with the local system.
Kevin Burke64969c82016-12-01 17:45:26 -0800594For example, you should not set <code>$GOHOSTARCH</code> to
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100595<code>arm</code> on an x86 system.
596</p>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100597
Shenghou Ma17719122013-06-09 23:15:39 +0800598<li><code>$GOBIN</code>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100599<p>
Russ Cox9d7076b2012-03-27 11:57:39 -0400600The location where Go binaries will be installed.
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100601The default is <code>$GOROOT/bin</code>.
602After installing, you will want to arrange to add this
603directory to your <code>$PATH</code>, so you can use the tools.
Russ Cox9d7076b2012-03-27 11:57:39 -0400604If <code>$GOBIN</code> is set, the <a href="/cmd/go">go command</a>
605installs all commands there.
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100606</p>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000607</li>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100608
Shenghou Ma17719122013-06-09 23:15:39 +0800609<li><code>$GO386</code> (for <code>386</code> only, default is auto-detected
Shenghou Maae1b5c72014-06-04 19:53:37 -0400610if built on either <code>386</code> or <code>amd64</code>, <code>387</code> otherwise)
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100611<p>
Aaron Jacobs86286882015-06-24 09:50:12 +1000612This controls the code generated by gc to use either the 387 floating-point unit
Shenghou Ma17719122013-06-09 23:15:39 +0800613(set to <code>387</code>) or SSE2 instructions (set to <code>sse2</code>) for
614floating point computations.
615</p>
616<ul>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000617 <li><code>GO386=387</code>: use x87 for floating point operations; should support all x86 chips (Pentium MMX or later).</li>
618 <li><code>GO386=sse2</code>: use SSE2 for floating point operations; has better performance than 387, but only available on Pentium 4/Opteron/Athlon 64 or later.</li>
Shenghou Ma17719122013-06-09 23:15:39 +0800619</ul>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000620</li>
Shenghou Ma17719122013-06-09 23:15:39 +0800621
622<li><code>$GOARM</code> (for <code>arm</code> only; default is auto-detected if building
623on the target processor, 6 if not)
624<p>
625This sets the ARM floating point co-processor architecture version the run-time
626should target. If you are compiling on the target system, its value will be auto-detected.
627</p>
628<ul>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000629 <li><code>GOARM=5</code>: use software floating point; when CPU doesn't have VFP co-processor</li>
630 <li><code>GOARM=6</code>: use VFPv1 only; default if cross compiling; usually ARM11 or better cores (VFPv2 or better is also supported)</li>
631 <li><code>GOARM=7</code>: use VFPv3; usually Cortex-A cores</li>
Shenghou Ma17719122013-06-09 23:15:39 +0800632</ul>
633<p>
634If in doubt, leave this variable unset, and adjust it if required
635when you first run the Go executable.
Andrew Gerrand43ad89d2014-07-25 10:28:39 +1000636The <a href="//golang.org/wiki/GoArm">GoARM</a> page
637on the <a href="//golang.org/wiki">Go community wiki</a>
Shenghou Ma17719122013-06-09 23:15:39 +0800638contains further details regarding Go's ARM support.
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100639</p>
Brad Fitzpatrickbcc86d52018-01-30 16:55:27 +0000640</li>
641
642<li><code>$GOMIPS</code> (for <code>mips</code> and <code>mipsle</code> only)
643<p>
644This sets whether to use floating point instructions.
645</p>
646<ul>
647 <li><code>GOMIPS=hardfloat</code>: use floating point instructions (the default)</li>
648 <li><code>GOMIPS=softfloat</code>: use soft floating point</li>
649</ul>
650</li>
Andrew Gerrandd70627e2012-03-06 15:16:02 +1100651
Shenghou Ma17719122013-06-09 23:15:39 +0800652</ul>
Andrew Gerrande07f0892012-02-14 17:02:28 +1100653
654<p>
655Note that <code>$GOARCH</code> and <code>$GOOS</code> identify the
656<em>target</em> environment, not the environment you are running on.
657In effect, you are always cross-compiling.
658By architecture, we mean the kind of binaries
659that the target environment can run:
660an x86-64 system running a 32-bit-only operating system
661must set <code>GOARCH</code> to <code>386</code>,
662not <code>amd64</code>.
663</p>
664
665<p>
666If you choose to override the defaults,
667set these variables in your shell profile (<code>$HOME/.bashrc</code>,
Kevin Burke64969c82016-12-01 17:45:26 -0800668<code>$HOME/.profile</code>, or equivalent). The settings might look
Andrew Gerrande07f0892012-02-14 17:02:28 +1100669something like this:
670</p>
671
672<pre>
Russ Cox74628a82016-11-30 14:56:58 -0500673export GOROOT=$HOME/go1.X
Andrew Gerrande07f0892012-02-14 17:02:28 +1100674export GOARCH=amd64
675export GOOS=linux
676</pre>
Rob Pike95d7d3d2012-03-03 09:36:09 +1100677
678<p>
679although, to reiterate, none of these variables needs to be set to build,
680install, and develop the Go tree.
681</p>