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:
parent
d1e52bb351
commit
743b9bfd9a
@ -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, " "))
|
||||
|
@ -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"
|
||||
`))
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := checkVersionMatch(tmpGoroot, version); err != nil {
|
||||
// Install standard libraries for cross compilers.
|
||||
if err := installAndroidArm(); 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 {
|
||||
if goos == "darwin" {
|
||||
if err := installDarwin("arm"); 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{
|
||||
`PATH=` + envpath,
|
||||
`GOOS=darwin`,
|
||||
`GOROOT=` + tmpGoroot, // set to override any bad os.Environ
|
||||
`GOARCH=` + arch,
|
||||
`CGO_ENABLED=1`,
|
||||
`CC_FOR_TARGET=` + filepath.Join(tmpGoroot, "misc/ios/clangwrap.sh"),
|
||||
`CXX_FOR_TARGET=` + filepath.Join(tmpGoroot, "misc/ios/clangwrap.sh"),
|
||||
bin := func(name string) string {
|
||||
if goos == "windows" {
|
||||
return name + ".exe"
|
||||
}
|
||||
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)
|
||||
}
|
||||
if buildV {
|
||||
fmt.Fprintf(os.Stderr, "building darwin/arm cross compiler\n")
|
||||
m.Stdout = os.Stdout
|
||||
m.Stderr = os.Stderr
|
||||
}
|
||||
if buildX {
|
||||
printcmd("%s", strings.Join(m.Env, " ")+" "+strings.Join(m.Args, " "))
|
||||
}
|
||||
if !buildN {
|
||||
if err := m.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return name
|
||||
}
|
||||
if err := makeCC("arm"); err != nil {
|
||||
return nil
|
||||
|
||||
cmd := exec.Command("go", "install", "std")
|
||||
cmd.Env = []string{
|
||||
`PATH=` + envpath,
|
||||
`GOOS=android`,
|
||||
`GOARCH=arm`,
|
||||
`GOARM=7`,
|
||||
`CGO_ENABLED=1`,
|
||||
`CC=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-gcc")),
|
||||
`CXX=` + filepath.Join(ndkccbin, bin("arm-linux-androideabi-g++")),
|
||||
}
|
||||
if err := makeCC("arm64"); err != nil {
|
||||
return nil
|
||||
cmd.Env = appendCommonEnv(cmd.Env)
|
||||
if buildV {
|
||||
fmt.Fprintf(os.Stderr, "Building android/arm standard library.\n")
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
}
|
||||
if err := installCC("darwin", "arm"); err != nil {
|
||||
return err
|
||||
if buildX {
|
||||
printcmd("%s", strings.Join(cmd.Env, " ")+" "+strings.Join(cmd.Args, " "))
|
||||
}
|
||||
return installCC("darwin", "arm64")
|
||||
if !buildN {
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
if err := move(filepath.Join(goroot, "pkg"), filepath.Join(tmpGoroot, "pkg"), name); err != nil {
|
||||
return fmt.Errorf("GOROOT is not writable: %v", err)
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
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)
|
||||
|
@ -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"
|
||||
`))
|
||||
|
@ -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:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user