2014-08-13 12:09:53 +00:00
|
|
|
# xgo - Go CGO cross compiler
|
2014-08-06 20:55:14 +00:00
|
|
|
|
2014-08-07 07:05:33 +00:00
|
|
|
Although Go strives to be a cross platform language, cross compilation from one
|
|
|
|
platform to another is not as simple as it could be, as you need the Go sources
|
|
|
|
bootstrapped to each platform and architecture.
|
|
|
|
|
|
|
|
The first step towards cross compiling was Dave Cheney's [golang-crosscompile](https://github.com/davecheney/golang-crosscompile)
|
|
|
|
package, which automatically bootstrapped the necessary sources based on your
|
|
|
|
existing Go installation. Although this was enough for a lot of cases, certain
|
|
|
|
drawbacks became apparent where the official libraries used CGO internally: any
|
|
|
|
dependency to third party platform code is unavailable, hence those parts don't
|
|
|
|
cross compile nicely (native DNS resolution, system certificate access, etc).
|
|
|
|
|
|
|
|
A step forward in enabling cross compilation was Alan Shreve's [gonative](https://github.com/inconshreveable/gonative)
|
|
|
|
package, which instead of bootstrapping the different platforms based on the
|
|
|
|
existing Go installation, downloaded the official pre-compiled binaries from the
|
|
|
|
golang website and injected those into the local toolchain. Since the pre-built
|
|
|
|
binaries already contained the necessary platform specific code, the few missing
|
|
|
|
dependencies were resolved, and true cross compilation could commence... of pure
|
|
|
|
Go code.
|
|
|
|
|
|
|
|
However, there was still one feature missing: cross compiling Go code that used
|
|
|
|
CGO itself, which isn't trivial since you need access to OS specific headers and
|
|
|
|
libraries. This becomes very annoying when you need access only to some trivial
|
|
|
|
OS specific functionality (e.g. query the CPU load), but need to configure and
|
|
|
|
maintain separate build environments to do it.
|
|
|
|
|
2014-08-13 12:09:53 +00:00
|
|
|
## Enter xgo
|
2014-08-07 07:05:33 +00:00
|
|
|
|
|
|
|
My solution to the challenge of cross compiling Go code with embedded C snippets
|
2014-08-07 07:09:32 +00:00
|
|
|
(i.e. CGO_ENABLED=1) is based on the concept of [lightweight Linux containers](http://en.wikipedia.org/wiki/LXC).
|
2014-08-07 07:05:33 +00:00
|
|
|
All the necessary Go tool-chains, C cross compilers and platform headers/libraries
|
|
|
|
have been assembled into a single Docker container, which can then be called as if
|
2014-08-08 10:33:03 +00:00
|
|
|
a single command to compile a Go package to various platforms and architectures.
|
2014-08-07 07:05:33 +00:00
|
|
|
|
2014-08-13 12:09:53 +00:00
|
|
|
## Installation
|
2014-08-07 07:05:33 +00:00
|
|
|
|
|
|
|
Although you could build the container manually, it is available as an automatic
|
2014-08-13 12:09:53 +00:00
|
|
|
trusted build from Docker's container registry (~530MB):
|
2014-08-07 07:05:33 +00:00
|
|
|
|
2014-08-13 12:09:53 +00:00
|
|
|
docker pull karalabe/xgo-latest
|
2014-08-07 07:05:33 +00:00
|
|
|
|
|
|
|
To prevent having to remember a potentially complex Docker command every time,
|
|
|
|
a lightweight Go wrapper was written on top of it.
|
|
|
|
|
2014-08-07 07:08:06 +00:00
|
|
|
go get github.com/karalabe/xgo
|
2014-08-07 07:05:33 +00:00
|
|
|
|
2014-08-13 12:09:53 +00:00
|
|
|
## Usage
|
2014-08-07 07:05:33 +00:00
|
|
|
|
|
|
|
Simply specify the import path you want to build, and xgo will do the rest:
|
|
|
|
|
2014-08-07 07:08:06 +00:00
|
|
|
$ xgo github.com/project-iris/iris
|
2014-08-07 07:08:52 +00:00
|
|
|
...
|
2014-08-07 07:08:06 +00:00
|
|
|
|
|
|
|
$ ls -al
|
|
|
|
-rwxr-xr-x 1 root root 3086860 Aug 7 10:01 iris-darwin-386
|
|
|
|
-rwxr-xr-x 1 root root 3941068 Aug 7 10:01 iris-darwin-amd64
|
|
|
|
-rwxr-xr-x 1 root root 4185144 Aug 7 10:01 iris-linux-386
|
|
|
|
-rwxr-xr-x 1 root root 5196784 Aug 7 10:01 iris-linux-amd64
|
|
|
|
-rwxr-xr-x 1 root root 4151688 Aug 7 10:01 iris-linux-arm
|
|
|
|
-rwxr-xr-x 1 root root 4228608 Aug 7 10:01 iris-windows-386.exe
|
|
|
|
-rwxr-xr-x 1 root root 5243904 Aug 7 10:01 iris-windows-amd64.exe
|
2014-08-13 12:09:53 +00:00
|
|
|
|
|
|
|
### Go releases
|
|
|
|
|
|
|
|
As newer versions of the language runtime, libraries and tools get released,
|
|
|
|
these will get incorporated into xgo too as extensions layers to the base cross
|
|
|
|
compilation image (only Go 1.3 and above will be supported).
|
|
|
|
|
|
|
|
You can select which Go release to work with through the `-go` command line flag
|
|
|
|
to xgo and if the specific release was already integrated, it will automatically
|
|
|
|
be retrieved and installed.
|
|
|
|
|
|
|
|
$ xgo -go 1.3.0 github.com/project-iris/iris
|
|
|
|
...
|
|
|
|
|
|
|
|
Since xgo depends on not only the official releases, but also on Dave Cheney's
|
|
|
|
ARM packages, there will be a slight delay between official Go updates and the
|
|
|
|
xgo updates.
|
|
|
|
|
|
|
|
Additionally, a few wildcard release strings are also supported:
|
|
|
|
|
|
|
|
- `-go latest` will use the latest Go release
|
|
|
|
- `-go 1.3.x` will use the latest point release of a specific Go version
|