xgo/README.md

85 lines
3.9 KiB
Markdown
Raw Normal View History

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