2
0
mirror of synced 2025-02-23 06:48:15 +00:00

cmd/gomobile: simplify init

The Go toolchain used to require that we rebuild the compiler and
friends (the cgo command) when building a cgo-enabled cross compiler.
This meant that gomobile init used to invoke make.bash in a temporary
copy of the GOROOT. This works, but brings with it several
complications, including needing to use -toolexec when invoking the
go tool, finding a boostrap copy of Go 1.4, long initialization
times, and a variety of unusual failure modes.

Fortunately we don't need our own compiler any more. All that's
necessary is building the standard library for the cross-compilation
targets and making sure the right C compiler is used when calling
go build (as it always was). This means most of the initialization
process can be replaced with a carefully invoked 'go install std'.

While here, remove the source install instructions (most of it is
documented already, and the final step, choosing the right git
revision should be within the skills of anyone using pre-release
software.) Some other documentation is changing because it's been a
while since go generate was run.

Change-Id: I88c10fef87867536e83c7df063ae7241b2e9eea4
Reviewed-on: https://go-review.googlesource.com/11711
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
This commit is contained in:
David Crawshaw 2015-06-29 14:37:57 -04:00
parent d1e52bb351
commit 743b9bfd9a
6 changed files with 130 additions and 355 deletions

View File

@ -383,7 +383,7 @@ func goAndroidBuild(src, libPath string) error {
`go`,
`build`,
`-tags=`+strconv.Quote(strings.Join(ctx.BuildTags, ",")),
`-toolexec=`+filepath.Join(ndkccbin, "toolexec"))
)
if buildV {
gocmd.Args = append(gocmd.Args, "-v")
}
@ -415,7 +415,6 @@ func goAndroidBuild(src, libPath string) error {
`GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0"`,
`GOROOT=` + goEnv("GOROOT"),
`GOPATH=` + gopath,
`GOMOBILEPATH=` + ndkccbin, // for toolexec
}
if buildX {
printcmd("%s", strings.Join(gocmd.Env, " ")+" "+strings.Join(gocmd.Args, " "))

View File

@ -48,6 +48,6 @@ func TestBuild(t *testing.T) {
var buildTmpl = template.Must(template.New("output").Parse(`WORK=$WORK
GOMOBILE={{.GOPATH}}/pkg/gomobile
GOOS=android GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0" GOROOT=$GOROOT GOPATH=$GOPATH GOMOBILEPATH=$GOMOBILE/android-{{.NDK}}/arm/bin go build -tags="" -toolexec=$GOMOBILE/android-{{.NDK}}/arm/bin/toolexec -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
GOOS=android GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} GOGCCFLAGS="-fPIC -marm -pthread -fmessage-length=0" GOROOT=$GOROOT GOPATH=$GOPATH go build -tags="" -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
rm -r -f "$WORK"
`))

View File

@ -7,47 +7,16 @@
/*
Gomobile is a tool for building and running mobile apps written in Go.
Installation:
To install:
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init
Note that until Go 1.5 is released, you must compile Go from tip.
At least Go 1.5 is required. Until it is released, build tip from
source: http://golang.org/doc/install/source
Clone the source from the tip under $HOME/go directory. On Windows,
you may like to clone the repo to your user folder, %USERPROFILE%\go.
$ git clone https://go.googlesource.com/go $HOME/go
Go 1.5 requires Go 1.4. Read more about this requirement at
http://golang.org/s/go15bootstrap.
Set GOROOT_BOOTSTRAP to the GOROOT of your existing 1.4 installation or
follow the steps below to checkout go1.4 from the source and build.
$ git clone https://go.googlesource.com/go $HOME/go1.4
$ cd $HOME/go1.4
$ git checkout go1.4.1
$ cd src && ./make.bash
If you clone Go 1.4 to a different destination, set GOROOT_BOOTSTRAP
environmental variable accordingly.
Build Go 1.5 and add Go 1.5 bin to your path.
$ cd $HOME/go/src && ./make.bash
$ export PATH=$PATH:$HOME/go/bin
Set a GOPATH if no GOPATH is set, add $GOPATH/bin to your path.
$ export GOPATH=$HOME
$ export PATH=$PATH:$GOPATH/bin
Now you can get the gomobile tool and initialize.
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init
It may take a while to initialize gomobile, please wait.
Initialization rebuilds the standard library and may download
the Android NDK compiler.
Usage:
@ -69,67 +38,67 @@ Build a shared library for android APK and iOS app
Usage:
gomobile bind [package]
gomobile bind [-target android|ios] [-o output] [build flags] [package]
Bind generates language bindings like gobind (golang.org/x/mobile/cmd/gobind)
for a package and builds a shared library for each platform from the go binding
code.
Bind generates language bindings for the package named by the import
path, and compiles a library for the named target system.
For Android, the bind command produces an AAR (Android ARchive) file that
archives the precompiled Java API stub classes, the compiled shared libraries,
and all asset files in the /assets subdirectory under the package directory.
The output AAR file name is '<package_name>.aar'.
The -target flag takes a target system name, either android (the
default) or ios.
The AAR file is commonly used for binary distribution of an Android library
project and most Android IDEs support AAR import. For example, in Android
Studio (1.2+), an AAR file can be imported using the module import wizard
(File > New > New Module > Import .JAR or .AAR package), and setting it as
a new dependency (File > Project Structure > Dependencies).
For -target android, the bind command produces an AAR (Android ARchive)
file that archives the precompiled Java API stub classes, the compiled
shared libraries, and all asset files in the /assets subdirectory under
the package directory. The output is named '<package_name>.aar' by
default. This AAR file is commonly used for binary distribution of an
Android library project and most Android IDEs support AAR import. For
example, in Android Studio (1.2+), an AAR file can be imported using
the module import wizard (File > New > New Module > Import .JAR or
.AAR package), and setting it as a new dependency
(File > Project Structure > Dependencies). This requires 'javac'
(version 1.7+) and Android SDK (API level 9 or newer) to build the
library for Android. The environment variable ANDROID_HOME must be set
to the path to Android SDK.
This command requires 'javac' (version 1.7+) and Android SDK (API level 9
or newer) to build the library for Android. The environment variable
ANDROID_HOME must be set to the path to Android SDK.
For -target ios, gomobile must be run on an OS X machine with Xcode
installed. Support is not complete.
The -v flag provides verbose output, including the list of packages built.
These build flags are shared by the build command.
For documentation, see 'go help build':
-a
-i
-n
-x
-tags 'tag list'
The build flags -a, -i, -n, -x, and -tags are shared with the build command.
For documentation, see 'go help build'.
Compile android APK and iOS app
Usage:
gomobile build [-o output] [-i] [build flags] [package]
gomobile build [-target android|ios] [-o output] [build flags] [package]
Build compiles and encodes the app named by the import path.
The named package must define a main function.
If an AndroidManifest.xml is defined in the package directory, it is
added to the APK file. Otherwise, a default manifest is generated.
The -target flag takes a target system name, either android (the
default) or ios.
For -target android, if an AndroidManifest.xml is defined in the
package directory, it is added to the APK output. Otherwise, a default
manifest is generated.
For -target ios, gomobile must be run on an OS X machine with Xcode
installed. Support is not complete.
If the package directory contains an assets subdirectory, its contents
are copied into the APK file.
are copied into the output.
The -o flag specifies the output file name. If not specified, the
output file name depends on the package built. The output file must end
in '.apk'.
output file name depends on the package built.
The -v flag provides verbose output, including the list of packages built.
These build flags are shared by the build, install, and test commands.
For documentation, see 'go help build':
-a
-i
-n
-x
-tags 'tag list'
The build flags -a, -i, -n, -x, and -tags are shared with the build command.
For documentation, see 'go help build'.
Install android compiler toolchain
@ -152,13 +121,14 @@ Compile android APK and iOS app and install on device
Usage:
gomobile install [package]
gomobile install [-target android] [build flags] [package]
Install compiles and installs the app named by the import path on the
attached mobile device.
This command requires the 'adb' tool on the PATH.
Only -target android is supported. The 'adb' tool must be on the PATH.
See the build command help for common flags and common behavior.
The build flags -a, -i, -n, -x, and -tags are shared with the build command.
For documentation, see 'go help build'.
*/
package main

View File

@ -109,12 +109,6 @@ func runInit(cmd *command) error {
}
defer removeAll(tmpdir)
goroot := goEnv("GOROOT")
tmpGoroot := filepath.Join(tmpdir, "go")
if err := copyGoroot(tmpGoroot, goroot); err != nil {
return err
}
if err := fetchNDK(); err != nil {
return err
}
@ -122,98 +116,15 @@ func runInit(cmd *command) error {
return err
}
dst := filepath.Join(ndkccpath, "arm")
ndkccbin := filepath.Join(dst, "bin")
envpath := os.Getenv("PATH")
if buildN {
envpath = "$PATH"
}
makeScript := filepath.Join(tmpGoroot, "src/make")
if goos == "windows" {
makeScript += ".bat"
} else {
makeScript += ".bash"
}
bin := func(name string) string {
if goos == "windows" {
return name + ".exe"
}
return name
}
make := exec.Command(makeScript, "--no-clean")
make.Dir = filepath.Join(tmpGoroot, "src")
make.Env = []string{
`PATH=` + envpath,
`GOOS=android`,
`GOROOT=` + tmpGoroot, // set to override any bad os.Environ
`GOARCH=arm`,
`GOARM=7`,
`CGO_ENABLED=1`,
`CC_FOR_TARGET=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-gcc")),
`CXX_FOR_TARGET=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-g++")),
}
make.Env = appendCommonEnv(make.Env)
if v := goEnv("GOROOT_BOOTSTRAP"); v != "" {
make.Env = append(make.Env, `GOROOT_BOOTSTRAP=`+v)
}
if buildV {
fmt.Fprintf(os.Stderr, "building android/arm cross compiler\n")
make.Stdout = os.Stdout
make.Stderr = os.Stderr
}
if buildX {
printcmd("%s", strings.Join(make.Env, " ")+" "+strings.Join(make.Args, " "))
}
if !buildN {
if err := make.Run(); err != nil {
// Install standard libraries for cross compilers.
if err := installAndroidArm(); err != nil {
return err
}
}
if err := checkVersionMatch(tmpGoroot, version); err != nil {
if goos == "darwin" {
if err := installDarwin("arm"); err != nil {
return err
}
// Move the Go cross compiler toolchain into GOPATH.
gotoolsrc := filepath.Join(tmpGoroot, "pkg/tool", goos+"_"+goarch)
tools := []string{"compile", "asm", "cgo", "nm", "old5a", "pack", "link"}
for i, name := range tools {
tools[i] = bin(name)
}
if err := move(ndkccbin, gotoolsrc, tools...); err != nil {
return err
}
// Build toolexec command.
toolexecSrc := filepath.Join(tmpdir, "toolexec.go")
if !buildN {
if err := ioutil.WriteFile(toolexecSrc, []byte(toolexec), 0644); err != nil {
return err
}
}
make = exec.Command("go", "build", "-o", filepath.Join(ndkccbin, bin("toolexec")), toolexecSrc)
if buildV {
fmt.Fprintf(os.Stderr, "building gomobile toolexec\n")
make.Stdout = os.Stdout
make.Stderr = os.Stderr
}
if buildX {
printcmd("%s", strings.Join(make.Args, " "))
}
if !buildN {
if err := make.Run(); err != nil {
return err
}
}
if err := installCC("android", "arm"); err != nil {
return err
}
if runtime.GOOS == "darwin" {
if err := buildDarwinARMCC(); err != nil {
if err := installDarwin("arm64"); err != nil {
return err
}
}
@ -229,70 +140,81 @@ func runInit(cmd *command) error {
return nil
}
func buildDarwinARMCC() error {
func installAndroidArm() error {
removeAll(filepath.Join(goEnv("GOROOT"), "pkg", "android_arm"))
ndkccbin := filepath.Join(ndkccpath, "arm", "bin")
envpath := os.Getenv("PATH")
if buildN {
envpath = "$PATH"
}
tmpGoroot := filepath.Join(tmpdir, "go")
makeCC := func(arch string) error {
m := exec.Command(filepath.Join(tmpGoroot, "src/make.bash"), "--no-clean")
m.Dir = filepath.Join(tmpGoroot, "src")
m.Env = []string{
bin := func(name string) string {
if goos == "windows" {
return name + ".exe"
}
return name
}
cmd := exec.Command("go", "install", "std")
cmd.Env = []string{
`PATH=` + envpath,
`GOOS=darwin`,
`GOROOT=` + tmpGoroot, // set to override any bad os.Environ
`GOARCH=` + arch,
`GOOS=android`,
`GOARCH=arm`,
`GOARM=7`,
`CGO_ENABLED=1`,
`CC_FOR_TARGET=` + filepath.Join(tmpGoroot, "misc/ios/clangwrap.sh"),
`CXX_FOR_TARGET=` + filepath.Join(tmpGoroot, "misc/ios/clangwrap.sh"),
}
if arch == "arm" {
m.Env = append(m.Env, "GOARM=7")
}
m.Env = appendCommonEnv(m.Env)
if v := goEnv("GOROOT_BOOTSTRAP"); v != "" {
m.Env = append(m.Env, `GOROOT_BOOTSTRAP=`+v)
`CC=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-gcc")),
`CXX=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-g++")),
}
cmd.Env = appendCommonEnv(cmd.Env)
if buildV {
fmt.Fprintf(os.Stderr, "building darwin/arm cross compiler\n")
m.Stdout = os.Stdout
m.Stderr = os.Stderr
fmt.Fprintf(os.Stderr, "Building android/arm standard library.\n")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
}
if buildX {
printcmd("%s", strings.Join(m.Env, " ")+" "+strings.Join(m.Args, " "))
printcmd("%s", strings.Join(cmd.Env, " ")+" "+strings.Join(cmd.Args, " "))
}
if !buildN {
if err := m.Run(); err != nil {
if err := cmd.Run(); err != nil {
return err
}
}
return nil
}
if err := makeCC("arm"); err != nil {
return nil
}
if err := makeCC("arm64"); err != nil {
return nil
}
if err := installCC("darwin", "arm"); err != nil {
return err
}
return installCC("darwin", "arm64")
}
func installCC(goos, goarch string) error {
goroot := goEnv("GOROOT")
tmpGoroot := filepath.Join(tmpdir, "go")
// Move pre-compiled stdlib for GOROOT. This is
// the only time we modify the user's GOROOT.
name := goos + "_" + goarch
if err := removeAll(filepath.Join(goroot, "pkg", name)); err != nil {
return fmt.Errorf("GOROOT is not writable: %v", err)
func installDarwin(arch string) error {
removeAll(filepath.Join(goEnv("GOROOT"), "pkg", "darwin_"+arch))
envpath := os.Getenv("PATH")
if buildN {
envpath = "$PATH"
}
goroot := goEnv("GOROOT")
cmd := exec.Command("go", "install", "std")
cmd.Env = []string{
`PATH=` + envpath,
`GOOS=darwin`,
`GOARCH=` + arch,
`CGO_ENABLED=1`,
`CC=` + filepath.Join(goroot, "misc/ios/clangwrap.sh"),
`CXX=` + filepath.Join(goroot, "misc/ios/clangwrap.sh"),
}
if arch == "arm" {
cmd.Env = append(cmd.Env, "GOARM=7")
}
cmd.Env = appendCommonEnv(cmd.Env)
if buildV {
fmt.Fprintf(os.Stderr, "Building darwin/%s standard library.\n", arch)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
}
if buildX {
printcmd("%s", strings.Join(cmd.Env, " ")+" "+strings.Join(cmd.Args, " "))
}
if !buildN {
if err := cmd.Run(); err != nil {
return err
}
if err := move(filepath.Join(goroot, "pkg"), filepath.Join(tmpGoroot, "pkg"), name); err != nil {
return fmt.Errorf("GOROOT is not writable: %v", err)
}
return nil
}
@ -311,30 +233,6 @@ func appendCommonEnv(env []string) []string {
return env
}
// toolexec is the source of a small program designed to be passed to
// the -toolexec flag of go build.
const toolexec = `package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
)
func main() {
args := append([]string{}, os.Args[1:]...)
args[0] = filepath.Join(os.Getenv("GOMOBILEPATH"), filepath.Base(args[0]))
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
}
`
func removeGomobilepkg() {
dir, err := os.Open(gomobilepath)
if err != nil {
@ -415,6 +313,8 @@ func goVersion() ([]byte, error) {
if err != nil {
return nil, fmt.Errorf("bad Go tool: %v (%s)", err, buildHelp)
}
// TODO(crawshaw): this is a crude test for Go 1.5. After release,
// remove this and check it is not an old release version.
if !bytes.Contains(buildHelp, []byte("-toolexec")) {
return nil, fmt.Errorf("installed Go tool does not support -toolexec")
}
@ -641,7 +541,7 @@ func fetch(url string) (dst string, err error) {
return "", err
}
if buildV {
fmt.Fprintf(os.Stderr, "fetching %s\n", url)
fmt.Fprintf(os.Stderr, "Downloading %s.\n", url)
}
name := path.Base(url)
dst = filepath.Join(gomobilepath, "dl", name)

View File

@ -8,7 +8,6 @@ import (
"bytes"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"text/template"
@ -43,9 +42,6 @@ func TestInit(t *testing.T) {
}
tmpl := initTmpl
if runtime.GOOS == "darwin" {
tmpl = initDarwinTmpl
}
diff, err := diffOutput(buf.String(), tmpl)
if err != nil {
@ -93,18 +89,13 @@ type outputData struct {
}
const (
unixBuildScript = `TMPDIR=$WORK HOME=$HOME GOROOT_BOOTSTRAP=go1.4 $WORK/go/src/make.bash --no-clean`
windowsBuildScript = `TEMP=$WORK TMP=$WORK HOMEDRIVE=C: HOMEPATH=$HOMEPATH GOROOT_BOOTSTRAP=go1.4 $WORK/go/src/make.bat --no-clean`
unixBuildScript = `TMPDIR=$WORK HOME=$HOME go install std`
windowsBuildScript = `TEMP=$WORK TMP=$WORK HOMEDRIVE=C: HOMEPATH=$HOMEPATH go install std`
)
var initTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
mkdir -p $GOMOBILE/android-{{.NDK}}
WORK=/GOPATH1/pkg/gomobile/work
mkdir -p $WORK/go/pkg
cp -a $GOROOT/lib $WORK/go/lib
cp -a $GOROOT/src $WORK/go/src
cp -a $GOROOT/misc $WORK/go/misc
ln -s $GOROOT/.git $WORK/go/.git
mkdir -p $GOMOBILE/dl
curl -o$GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz https://dl.google.com/go/mobile/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
tar xfz $GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
@ -125,66 +116,12 @@ tar xfz $GOMOBILE/dl/gomobile-openal-soft-1.16.0.1.tar.gz
mv $WORK/openal/include/AL $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/include/AL
mkdir -p $GOMOBILE/android-{{.NDK}}/openal
mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib
PATH=$PATH GOOS=android GOROOT=$WORK/go GOARCH=arm GOARM=7 CGO_ENABLED=1 CC_FOR_TARGET=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX_FOR_TARGET=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} {{.BuildScript}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/compile{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/compile{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/asm{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/asm{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/cgo{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/cgo{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/nm{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/nm{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/old5a{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/old5a{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/pack{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/pack{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/link{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/link{{.EXE}}
go build -o $GOMOBILE/android-{{.NDK}}/arm/bin/toolexec{{.EXE}} $WORK/toolexec.go
rm -r -f "$GOROOT/pkg/android_arm"
mv $WORK/go/pkg/android_arm $GOROOT/pkg/android_arm
go version > $GOMOBILE/version
rm -r -f "$WORK"
`))
var initDarwinTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
mkdir -p $GOMOBILE/android-{{.NDK}}
WORK=/GOPATH1/pkg/gomobile/work
mkdir -p $WORK/go/pkg
cp -a $GOROOT/lib $WORK/go/lib
cp -a $GOROOT/src $WORK/go/src
cp -a $GOROOT/misc $WORK/go/misc
ln -s $GOROOT/.git $WORK/go/.git
mkdir -p $GOMOBILE/dl
curl -o$GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz https://dl.google.com/go/mobile/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
tar xfz $GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
mkdir -p $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr
mv $WORK/android-{{.NDK}}/platforms/android-15/arch-arm/usr/include $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/include
mv $WORK/android-{{.NDK}}/platforms/android-15/arch-arm/usr/lib $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/lib
mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin $GOMOBILE/android-{{.NDK}}/arm/bin
mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/lib $GOMOBILE/android-{{.NDK}}/arm/lib
mv $WORK/android-{{.NDK}}/toolchains/arm-linux-androideabi-4.8/prebuilt/{{.GOOS}}-{{.NDKARCH}}/libexec $GOMOBILE/android-{{.NDK}}/arm/libexec
mkdir -p $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin
ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-ld{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/ld{{.EXE}}
ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-as{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/as{{.EXE}}
ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/gcc{{.EXE}}
ln -s $GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/arm-linux-androideabi/bin/g++{{.EXE}}
mkdir -p $GOMOBILE/dl
curl -o$GOMOBILE/dl/gomobile-openal-soft-1.16.0.1.tar.gz https://dl.google.com/go/mobile/gomobile-openal-soft-1.16.0.1.tar.gz
tar xfz $GOMOBILE/dl/gomobile-openal-soft-1.16.0.1.tar.gz
mv $WORK/openal/include/AL $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/include/AL
mkdir -p $GOMOBILE/android-{{.NDK}}/openal
mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib
PATH=$PATH GOOS=android GOROOT=$WORK/go GOARCH=arm GOARM=7 CGO_ENABLED=1 CC_FOR_TARGET=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX_FOR_TARGET=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} {{.BuildScript}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/compile{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/compile{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/asm{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/asm{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/cgo{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/cgo{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/nm{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/nm{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/old5a{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/old5a{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/pack{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/pack{{.EXE}}
mv $WORK/go/pkg/tool/{{.GOOS}}_{{.GOARCH}}/link{{.EXE}} $GOMOBILE/android-{{.NDK}}/arm/bin/link{{.EXE}}
go build -o $GOMOBILE/android-{{.NDK}}/arm/bin/toolexec{{.EXE}} $WORK/toolexec.go
rm -r -f "$GOROOT/pkg/android_arm"
mv $WORK/go/pkg/android_arm $GOROOT/pkg/android_arm
PATH=$PATH GOOS=darwin GOROOT=$WORK/go GOARCH=arm CGO_ENABLED=1 CC_FOR_TARGET=$WORK/go/misc/ios/clangwrap.sh CXX_FOR_TARGET=$WORK/go/misc/ios/clangwrap.sh GOARM=7 TMPDIR=$WORK HOME=$HOME GOROOT_BOOTSTRAP=go1.4 $WORK/go/src/make.bash --no-clean
PATH=$PATH GOOS=darwin GOROOT=$WORK/go GOARCH=arm64 CGO_ENABLED=1 CC_FOR_TARGET=$WORK/go/misc/ios/clangwrap.sh CXX_FOR_TARGET=$WORK/go/misc/ios/clangwrap.sh TMPDIR=$WORK HOME=$HOME GOROOT_BOOTSTRAP=go1.4 $WORK/go/src/make.bash --no-clean
rm -r -f "$GOROOT/pkg/darwin_arm"
mv $WORK/go/pkg/darwin_arm $GOROOT/pkg/darwin_arm
PATH=$PATH GOOS=android GOARCH=arm GOARM=7 CGO_ENABLED=1 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} {{.BuildScript}}
{{if eq .GOOS "darwin"}}rm -r -f "$GOROOT/pkg/darwin_arm"
PATH=$PATH GOOS=darwin GOARCH=arm CGO_ENABLED=1 CC=$GOROOT/misc/ios/clangwrap.sh CXX=$GOROOT/misc/ios/clangwrap.sh GOARM=7 {{.BuildScript}}
rm -r -f "$GOROOT/pkg/darwin_arm64"
mv $WORK/go/pkg/darwin_arm64 $GOROOT/pkg/darwin_arm64
go version > $GOMOBILE/version
PATH=$PATH GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 CC=$GOROOT/misc/ios/clangwrap.sh CXX=$GOROOT/misc/ios/clangwrap.sh {{.BuildScript}}
{{end}}go version > $GOMOBILE/version
rm -r -f "$WORK"
`))

View File

@ -100,7 +100,7 @@ const documentationHeader = `// Copyright 2015 The Go Authors. All rights reser
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// DO NOT EDIT. GENERATED BY 'gomobile help documentation'.
// DO NOT EDIT. GENERATED BY 'gomobile help documentation doc.go'.
`
func helpDocumentation(path string) {
@ -151,47 +151,16 @@ func (cmd *command) usage() {
var usageTmpl = template.Must(template.New("usage").Parse(
`Gomobile is a tool for building and running mobile apps written in Go.
Installation:
To install:
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init
Note that until Go 1.5 is released, you must compile Go from tip.
At least Go 1.5 is required. Until it is released, build tip from
source: http://golang.org/doc/install/source
Clone the source from the tip under $HOME/go directory. On Windows,
you may like to clone the repo to your user folder, %USERPROFILE%\go.
$ git clone https://go.googlesource.com/go $HOME/go
Go 1.5 requires Go 1.4. Read more about this requirement at
http://golang.org/s/go15bootstrap.
Set GOROOT_BOOTSTRAP to the GOROOT of your existing 1.4 installation or
follow the steps below to checkout go1.4 from the source and build.
$ git clone https://go.googlesource.com/go $HOME/go1.4
$ cd $HOME/go1.4
$ git checkout go1.4.1
$ cd src && ./make.bash
If you clone Go 1.4 to a different destination, set GOROOT_BOOTSTRAP
environmental variable accordingly.
Build Go 1.5 and add Go 1.5 bin to your path.
$ cd $HOME/go/src && ./make.bash
$ export PATH=$PATH:$HOME/go/bin
Set a GOPATH if no GOPATH is set, add $GOPATH/bin to your path.
$ export GOPATH=$HOME
$ export PATH=$PATH:$GOPATH/bin
Now you can get the gomobile tool and initialize.
$ go get golang.org/x/mobile/cmd/gomobile
$ gomobile init
It may take a while to initialize gomobile, please wait.
Initialization rebuilds the standard library and may download
the Android NDK compiler.
Usage: