| <!-- Installing Go --> |
| |
| <h2>Introduction</h2> |
| |
| <p>Go is an open source project, distributed under a |
| <a href="/LICENSE">BSD-style license</a>. |
| This document explains how to check out the sources, |
| build them on your own machine, and run them. |
| </p> |
| |
| <p> |
| There are two distinct ways to experiment with Go. |
| This document focuses on the <code>gc</code> Go |
| compiler and tools (<code>6g</code>, <code>8g</code> etc.). |
| For information on how to use <code>gccgo</code>, a more traditional |
| compiler using the GCC back end, see |
| <a href="gccgo_install.html">Setting up and using gccgo</a>. |
| </p> |
| |
| <h2>Environment variables</h2> |
| |
| <p> |
| The Go compilation environment depends on three environment variables plus one optional variable: |
| </p> |
| |
| <dl> |
| <dt> |
| <code>$GOROOT</code> |
| </dt> |
| <dd>The root of the Go tree. Typically this is <code>$HOME/go</code> |
| but it can be any directory. |
| </dd> |
| |
| <dt> |
| <code>$GOOS</code> and <code>$GOARCH</code> |
| </dt> |
| <dd> |
| The name of the target operating system and compilation architecture. |
| Choices for <code>$GOOS</code> are <code>linux</code>, |
| <code>freebsd</code>, |
| <code>darwin</code> (Mac OS X 10.5 or 10.6), |
| and <code>nacl</code> (Native Client, an incomplete port). |
| Choices for <code>$GOARCH</code> are <code>amd64</code> (64-bit x86, the most mature port), |
| <code>386</code> (32-bit x86), and |
| <code>arm</code> (32-bit ARM, an incomplete port). |
| The valid combinations of <code>$GOOS</code> and <code>$GOARCH</code> are: |
| <p> |
| <table cellpadding="0"> |
| <tr> |
| <th width="50"><th align="left" width="100"><code>$GOOS</code></th> <th align="left" width="100"><code>$GOARCH</code></th> |
| </tr> |
| <tr> |
| <td></td><td><code>darwin</code></td> <td><code>386</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>darwin</code></td> <td><code>amd64</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>freebsd</code></td> <td><code>386</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>freebsd</code></td> <td><code>amd64</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>linux</code></td> <td><code>386</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>linux</code></td> <td><code>amd64</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>linux</code></td> <td><code>arm</code></td> |
| </tr> |
| <tr> |
| <td></td><td><code>nacl</code></td> <td><code>386</code></td> |
| </tr> |
| </table> |
| <p> |
| </dd> |
| |
| <dt> |
| <code>$GOBIN</code> (optional) |
| </dt> |
| <dd> |
| The location where binaries will be installed. |
| The default is <code>$HOME/bin</code>. |
| After installing, you will want to arrange to add this |
| directory to your <code>$PATH</code>, so you can use the tools. |
| </dd> |
| |
| <dt> |
| <code>$GOARM</code> (optional, arm, default=6) |
| </dt> |
| <dd> |
| The ARM architecture version the runtime libraries should target. |
| ARMv6 cores have more efficient synchronization primitives. Setting |
| <code>$GOARM</code> to 5 will compile the runtime libraries using |
| just SWP instructions that work on older architectures as well. |
| Running v6 code on an older core will cause an illegal instruction trap. |
| </dd> |
| </dl> |
| |
| <p> |
| Note that <code>$GOARCH</code> and <code>$GOOS</code> identify the |
| <em>target</em> environment, not the environment you are running on. |
| In effect, you are always cross-compiling. |
| </p> |
| |
| <p> |
| Set these variables in your shell profile (<code>$HOME/.bashrc</code>, |
| <code>$HOME/.profile</code>, or equivalent). The settings might look |
| something like this: |
| </p> |
| |
| <pre> |
| export GOROOT=$HOME/go |
| export GOARCH=amd64 |
| export GOOS=linux |
| </pre> |
| |
| <p> |
| Double-check them by listing your environment. (You will need to launch |
| a new shell or terminal window for the changes to take effect.) |
| </p> |
| |
| <pre> |
| $ env | grep '^GO' |
| </pre> |
| |
| <h2>Ports</h2> |
| |
| <p> |
| The Go compilers support three instruction sets. |
| There are important differences in the quality of the compilers for the different |
| architectures. |
| </p> |
| |
| <dl> |
| <dt> |
| <code>amd64</code> (a.k.a. <code>x86-64</code>); <code>6g,6l,6c,6a</code> |
| </dt> |
| <dd> |
| The most mature implementation. The compiler has an effective optimizer |
| (registerizer) and generates good code (although <code>gccgo</code> |
| can do noticeably better sometimes). |
| </dd> |
| <dt> |
| <code>386</code> (a.k.a. <code>x86</code> or <code>x86-32</code>); <code>8g,8l,8c,8a</code> |
| </dt> |
| <dd> |
| Comparable to the <code>amd64</code> port. Not as well soaked but |
| should be nearly as solid. |
| |
| </dd> |
| <dt> |
| <code>arm</code> (a.k.a. <code>ARM</code>); <code>5g,5l,5c,5a</code> |
| </dt> |
| <dd> |
| It's got a couple of outstanding bugs but is improving. |
| Tested against QEMU and an android phone. |
| Only supports Linux binaries. |
| </dd> |
| </dl> |
| |
| <p> |
| Except for things like low-level operating system interface code, the runtime |
| support is the same in all ports and includes a mark-and-sweep garbage collector |
| (a fancier one is in the works), efficient array and string slicing, |
| support for segmented stacks, and a strong goroutine implementation. |
| </p> |
| |
| <p> |
| See the separate <a href="gccgo_install.html"><code>gccgo</code> document</a> |
| for details about that compiler and environment. |
| </p> |
| |
| <h2>Install C tools, if needed</h2> |
| |
| <p>The Go tool chain is written in C. To build it, you need |
| to have GCC, the standard C libraries, the parser generator Bison, |
| <tt>make</tt>, <tt>awk</tt>, and the text editor <tt>ed</tt> installed. On OS X, they can be |
| installed as part of |
| <a href="http://developer.apple.com/TOOLS/Xcode/">Xcode</a>. On Linux, use |
| </p> |
| |
| <pre> |
| $ sudo apt-get install bison gcc libc6-dev ed gawk make |
| </pre> |
| |
| <p> |
| (or the equivalent on your Linux distribution). |
| </p> |
| |
| <h2>Fetch the repository</h2> |
| |
| <p> |
| If you do not have Mercurial installed (you do not have an <code>hg</code> command), |
| this command: |
| </p> |
| |
| <pre> |
| $ sudo easy_install mercurial |
| </pre> |
| |
| <p>works on most systems. |
| (On Ubuntu/Debian, you might try <code>apt-get install python-setuptools python-dev build-essential gcc</code> first.) |
| If that fails, visit the <a href="http://mercurial.selenic.com/wiki/Download">Mercurial Download</a> page.</p> |
| |
| <p>Make sure the <code>$GOROOT</code> directory does not exist or is empty. |
| Then check out the repository:</p> |
| |
| <pre> |
| $ hg clone -r release https://go.googlecode.com/hg/ $GOROOT |
| </pre> |
| |
| <h2>Install Go</h2> |
| |
| <p> |
| To build the Go distribution, run |
| </p> |
| |
| <pre> |
| $ cd $GOROOT/src |
| $ ./all.bash |
| </pre> |
| |
| <p> |
| If all goes well, it will finish by printing |
| </p> |
| |
| <pre> |
| --- cd ../test |
| N known bugs; 0 unexpected bugs |
| </pre> |
| |
| <p> |
| where <var>N</var> is a number that varies from release to release. |
| </p> |
| |
| <h2>Writing programs</h2> |
| |
| <p> |
| Given a file <code>file.go</code>, compile it using |
| </p> |
| |
| <pre> |
| $ 6g file.go |
| </pre> |
| |
| <p> |
| <code>6g</code> is the Go compiler for <code>amd64</code>; it will write the output |
| in <code>file.6</code>. The ‘<code>6</code>’ identifies |
| files for the <code>amd64</code> architecture. |
| The identifier letters for <code>386</code> and <code>arm</code> |
| are ‘<code>8</code>’ and ‘<code>5</code>’. |
| That is, if you were compiling for <code>386</code>, you would use |
| <code>8g</code> and the output would be named <code>file.8</code>. |
| </p> |
| |
| <p> |
| To link the file, use |
| </p> |
| |
| <pre> |
| $ 6l file.6 |
| </pre> |
| |
| <p> |
| and to run it |
| </p> |
| |
| <pre> |
| $ ./6.out |
| </pre> |
| |
| <p>A complete example: |
| </p> |
| |
| <pre> |
| $ cat >hello.go <<EOF |
| package main |
| |
| import "fmt" |
| |
| func main() { |
| fmt.Printf("hello, world\n") |
| } |
| EOF |
| $ 6g hello.go |
| $ 6l hello.6 |
| $ ./6.out |
| hello, world |
| $ |
| </pre> |
| |
| <p> |
| There is no need to list <code>hello.6</code>'s package dependencies |
| (in this case, package <code>fmt</code>) on the <code>6l</code> |
| command line. |
| The linker learns about them by reading <code>hello.6</code>. |
| </p> |
| |
| <p> |
| To build more complicated programs, you will probably |
| want to use a |
| <code>Makefile</code>. |
| There are examples in places like |
| <code>$GOROOT/src/cmd/godoc/Makefile</code> |
| and <code>$GOROOT/src/pkg/*/Makefile</code>. |
| The |
| <a href="contribute.html">document</a> |
| about contributing to the Go project |
| gives more detail about |
| the process of building and testing Go programs. |
| </p> |
| |
| <h2>Keeping up with releases</h2> |
| |
| <p>New releases are announced on the <a href="http://groups.google.com/group/golang-nuts">Go Nuts</a> mailing list. |
| To update an existing tree to the latest release, you can run: |
| </p> |
| |
| <pre> |
| $ cd $GOROOT/src |
| $ hg pull |
| $ hg update release |
| $ ./all.bash |
| </pre> |
| |
| <h2>Community resources</h2> |
| |
| <p> |
| For real-time help, there may be users or developers on |
| <code>#go-nuts</code> on the <a href="http://freenode.net/">Freenode</a> IRC server. |
| </p> |
| |
| <p> |
| The official mailing list for discussion of the Go language is |
| <a href="http://groups.google.com/group/golang-nuts">Go Nuts</a>. |
| </p> |
| |
| <p> |
| Bugs can be reported using the <a href="http://code.google.com/p/go/issues/list">Go issue tracker</a>. |
| </p> |
| |
| <p> |
| For those who wish to keep up with development, |
| there is another mailing list, <a href="http://groups.google.com/group/golang-checkins">golang-checkins</a>, |
| that receives a message summarizing each checkin to the Go repository. |
| </p> |
| |
| |