cmd/gomobile: update tests and add bind tests
Change-Id: I9e2fdf179b1e07a8b0d9b612913814768f8284dc Reviewed-on: https://go-review.googlesource.com/12331 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
This commit is contained in:
Родитель
7d5958d761
Коммит
ea6f260cd0
|
@ -65,7 +65,11 @@ func goAndroidBind(pkg *build.Package) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
dst := filepath.Join(androidDir, "src/main/java/go/LoadJNI.java")
|
dst := filepath.Join(androidDir, "src/main/java/go/LoadJNI.java")
|
||||||
if err := ioutil.WriteFile(dst, []byte(loadSrc), 0664); err != nil {
|
genLoadJNI := func(w io.Writer) error {
|
||||||
|
_, err := io.WriteString(w, loadSrc)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := writeFile(dst, genLoadJNI); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
"text/template"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO(crawshaw): TestBindIOS
|
||||||
|
|
||||||
|
func TestBindAndroid(t *testing.T) {
|
||||||
|
if os.Getenv("ANDROID_HOME") == "" {
|
||||||
|
t.Skip("ANDROID_HOME not found, skipping bind")
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
defer func() {
|
||||||
|
xout = os.Stderr
|
||||||
|
buildN = false
|
||||||
|
buildX = false
|
||||||
|
}()
|
||||||
|
xout = buf
|
||||||
|
buildN = true
|
||||||
|
buildX = true
|
||||||
|
buildO = "asset.aar"
|
||||||
|
buildTarget = "android"
|
||||||
|
gopath = filepath.SplitList(os.Getenv("GOPATH"))[0]
|
||||||
|
if goos == "windows" {
|
||||||
|
os.Setenv("HOMEDRIVE", "C:")
|
||||||
|
}
|
||||||
|
cmdBind.flag.Parse([]string{"golang.org/x/mobile/asset"})
|
||||||
|
err := runBind(cmdBind)
|
||||||
|
if err != nil {
|
||||||
|
t.Log(buf.String())
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
diff, err := diffOutput(buf.String(), bindAndroidTmpl)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("computing diff failed: %v", err)
|
||||||
|
}
|
||||||
|
if diff != "" {
|
||||||
|
t.Errorf("unexpected output:\n%s", diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var bindAndroidTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
||||||
|
WORK=$WORK
|
||||||
|
gobind -lang=go golang.org/x/mobile/asset > $WORK/go_asset/go_assetmain.go
|
||||||
|
mkdir -p $WORK/go_asset
|
||||||
|
mkdir -p $WORK/androidlib
|
||||||
|
GOOS=android GOARCH=arm GOARM=7 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so $WORK/androidlib/main.go
|
||||||
|
gobind -lang=java golang.org/x/mobile/asset > $WORK/android/src/main/java/go/asset/Asset.java
|
||||||
|
mkdir -p $WORK/android/src/main/java/go/asset
|
||||||
|
mkdir -p $WORK/android/src/main/java/go
|
||||||
|
rm $WORK/android/src/main/java/go/Seq.java
|
||||||
|
ln -s $GOPATH/src/golang.org/x/mobile/bind/java/Seq.java $WORK/android/src/main/java/go/Seq.java
|
||||||
|
javac -d $WORK/javac-output -source 1.7 -target 1.7 -bootclasspath $ANDROID_HOME/platforms/android-22/android.jar *.java
|
||||||
|
jar c -C $WORK/javac-output .
|
||||||
|
rm -r -f "$WORK/javac-output"
|
||||||
|
`))
|
|
@ -134,6 +134,9 @@ func printcmd(format string, args ...interface{}) {
|
||||||
if tmpdir != "" {
|
if tmpdir != "" {
|
||||||
cmd = strings.Replace(cmd, tmpdir, "$WORK", -1)
|
cmd = strings.Replace(cmd, tmpdir, "$WORK", -1)
|
||||||
}
|
}
|
||||||
|
if androidHome := os.Getenv("ANDROID_HOME"); androidHome != "" {
|
||||||
|
cmd = strings.Replace(cmd, androidHome, "$ANDROID_HOME", -1)
|
||||||
|
}
|
||||||
if gomobilepath != "" {
|
if gomobilepath != "" {
|
||||||
cmd = strings.Replace(cmd, gomobilepath, "$GOMOBILE", -1)
|
cmd = strings.Replace(cmd, gomobilepath, "$GOMOBILE", -1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,14 +22,13 @@ func TestBuild(t *testing.T) {
|
||||||
xout = buf
|
xout = buf
|
||||||
buildN = true
|
buildN = true
|
||||||
buildX = true
|
buildX = true
|
||||||
|
buildO = "basic.apk"
|
||||||
|
buildTarget = "android"
|
||||||
gopath = filepath.SplitList(os.Getenv("GOPATH"))[0]
|
gopath = filepath.SplitList(os.Getenv("GOPATH"))[0]
|
||||||
if goos == "windows" {
|
if goos == "windows" {
|
||||||
os.Setenv("HOMEDRIVE", "C:")
|
os.Setenv("HOMEDRIVE", "C:")
|
||||||
}
|
}
|
||||||
cmdBuild.flag.Parse([]string{"golang.org/x/mobile/example/basic"})
|
cmdBuild.flag.Parse([]string{"golang.org/x/mobile/example/basic"})
|
||||||
if buildTarget != "android" {
|
|
||||||
t.Fatalf("-target=%q, want android", buildTarget)
|
|
||||||
}
|
|
||||||
err := runBuild(cmdBuild)
|
err := runBuild(cmdBuild)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log(buf.String())
|
t.Log(buf.String())
|
||||||
|
@ -43,11 +42,9 @@ func TestBuild(t *testing.T) {
|
||||||
if diff != "" {
|
if diff != "" {
|
||||||
t.Errorf("unexpected output:\n%s", diff)
|
t.Errorf("unexpected output:\n%s", diff)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var buildTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
var buildTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
||||||
WORK=$WORK
|
WORK=$WORK
|
||||||
CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 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" go build -tags="" -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
|
GOOS=android GOARCH=arm GOARM=7 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++{{.EXE}} CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
|
||||||
rm -r -f "$WORK"
|
|
||||||
`))
|
`))
|
||||||
|
|
|
@ -30,15 +30,21 @@ func buildEnvInit() (cleanup func(), err error) {
|
||||||
gopath := goEnv("GOPATH")
|
gopath := goEnv("GOPATH")
|
||||||
for _, p := range filepath.SplitList(gopath) {
|
for _, p := range filepath.SplitList(gopath) {
|
||||||
gomobilepath = filepath.Join(p, "pkg", "gomobile")
|
gomobilepath = filepath.Join(p, "pkg", "gomobile")
|
||||||
if _, err := os.Stat(gomobilepath); err == nil {
|
if _, err := os.Stat(gomobilepath); buildN || err == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := envInit(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
if buildX {
|
if buildX {
|
||||||
fmt.Fprintln(xout, "GOMOBILE="+gomobilepath)
|
fmt.Fprintln(xout, "GOMOBILE="+gomobilepath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the toolchain is in a good state.
|
// Check the toolchain is in a good state.
|
||||||
|
// Pick a temporary directory for assembling an apk/app.
|
||||||
version, err := goVersion()
|
version, err := goVersion()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -46,23 +52,21 @@ func buildEnvInit() (cleanup func(), err error) {
|
||||||
if gomobilepath == "" {
|
if gomobilepath == "" {
|
||||||
return nil, errors.New("toolchain not installed, run `gomobile init`")
|
return nil, errors.New("toolchain not installed, run `gomobile init`")
|
||||||
}
|
}
|
||||||
verpath := filepath.Join(gomobilepath, "version")
|
|
||||||
installedVersion, err := ioutil.ReadFile(verpath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("toolchain partially installed, run `gomobile init`")
|
|
||||||
}
|
|
||||||
if !bytes.Equal(installedVersion, version) {
|
|
||||||
return nil, errors.New("toolchain out of date, run `gomobile init`")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := envInit(); err != nil {
|
cleanupFn := func() { removeAll(tmpdir) }
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need a temporary directory when assembling an apk/app.
|
|
||||||
if buildN {
|
if buildN {
|
||||||
tmpdir = "$WORK"
|
tmpdir = "$WORK"
|
||||||
|
cleanupFn = func() {}
|
||||||
} else {
|
} else {
|
||||||
|
verpath := filepath.Join(gomobilepath, "version")
|
||||||
|
installedVersion, err := ioutil.ReadFile(verpath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("toolchain partially installed, run `gomobile init`")
|
||||||
|
}
|
||||||
|
if !bytes.Equal(installedVersion, version) {
|
||||||
|
return nil, errors.New("toolchain out of date, run `gomobile init`")
|
||||||
|
}
|
||||||
|
|
||||||
tmpdir, err = ioutil.TempDir("", "gomobile-work-")
|
tmpdir, err = ioutil.TempDir("", "gomobile-work-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -72,7 +76,7 @@ func buildEnvInit() (cleanup func(), err error) {
|
||||||
fmt.Fprintln(xout, "WORK="+tmpdir)
|
fmt.Fprintln(xout, "WORK="+tmpdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
return func() { removeAll(tmpdir) }, nil
|
return cleanupFn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func envInit() (err error) {
|
func envInit() (err error) {
|
||||||
|
@ -156,6 +160,9 @@ func envInit() (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func envClang(sdkName string) (clang, cflags string, err error) {
|
func envClang(sdkName string) (clang, cflags string, err error) {
|
||||||
|
if buildN {
|
||||||
|
return "clang-" + sdkName, "-isysroot=" + sdkName, nil
|
||||||
|
}
|
||||||
cmd := exec.Command("xcrun", "--sdk", sdkName, "--find", "clang")
|
cmd := exec.Command("xcrun", "--sdk", sdkName, "--find", "clang")
|
||||||
out, err := cmd.Output()
|
out, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -87,7 +87,7 @@ type outputData struct {
|
||||||
|
|
||||||
var initTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
var initTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
|
||||||
mkdir -p $GOMOBILE/android-{{.NDK}}
|
mkdir -p $GOMOBILE/android-{{.NDK}}
|
||||||
WORK=/GOPATH1/pkg/gomobile/work
|
WORK={{.GOPATH}}/pkg/gomobile/work
|
||||||
mkdir -p $GOMOBILE/dl
|
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
|
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
|
tar xfz $GOMOBILE/dl/gomobile-{{.NDK}}-{{.GOOS}}-{{.NDKARCH}}.tar.gz
|
||||||
|
@ -108,12 +108,10 @@ 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
|
mv $WORK/openal/include/AL $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/include/AL
|
||||||
mkdir -p $GOMOBILE/android-{{.NDK}}/openal
|
mkdir -p $GOMOBILE/android-{{.NDK}}/openal
|
||||||
mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib
|
mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib
|
||||||
rm -r -f "$GOROOT/pkg/android_arm"
|
{{if eq .GOOS "darwin"}}PATH=$PATH GOOS=android GOARCH=arm GOARM=7 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_android_arm -x std
|
||||||
PATH=$PATH GOOS=android GOARCH=arm 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}} GOARM=7 go install std
|
PATH=$PATH GOOS=darwin GOARCH=arm GOARM=7 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -arch armv7 CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_darwin_arm -x std
|
||||||
{{if eq .GOOS "darwin"}}rm -r -f "$GOROOT/pkg/darwin_arm"
|
PATH=$PATH GOOS=darwin GOARCH=arm64 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -arch arm64 CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_darwin_arm64 -x std
|
||||||
PATH=$PATH GOOS=darwin GOARCH=arm CGO_ENABLED=1 CC=$GOROOT/misc/ios/clangwrap.sh CXX=$GOROOT/misc/ios/clangwrap.sh GOARM=7 go install std
|
PATH=$PATH GOOS=darwin GOARCH=amd64 CC=clang-iphonesimulator CXX=clang-iphonesimulator CGO_CFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch x86_64 CGO_LDFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch x86_64 CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_darwin_amd64 -tags=ios -x std
|
||||||
rm -r -f "$GOROOT/pkg/darwin_arm64"
|
|
||||||
PATH=$PATH GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 CC=$GOROOT/misc/ios/clangwrap.sh CXX=$GOROOT/misc/ios/clangwrap.sh go install std
|
|
||||||
{{end}}go version > $GOMOBILE/version
|
{{end}}go version > $GOMOBILE/version
|
||||||
rm -r -f "$WORK"
|
rm -r -f "$WORK"
|
||||||
`))
|
`))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче