Skip to content

Commit 0a84d43

Browse files
committed
cmd/gomobile: refactor android*Env to handle more architectures
This does not change the tool's behavior. The global ndkConfig 'ndk' holds info on all supported architectures with the latest Go and gomobile tools (tip), and provides Root and Toolchain methods that returns the current NDK installation directory and the toolchain info depending on the GOPATH and the current go version. The global androidEnv is a map from arch name to the env vars. ndkccpath is replaced by ndk.Root. For golang/go#10743 Change-Id: I70d8e7b3e9979836112eb82d50c468df4f4ab43f Reviewed-on: https://go-review.googlesource.com/17720 Reviewed-by: David Crawshaw <[email protected]>
1 parent 3abfce6 commit 0a84d43

File tree

8 files changed

+99
-35
lines changed

8 files changed

+99
-35
lines changed

cmd/gomobile/bind_androidapp.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func goAndroidBind(pkgs []*build.Package) error {
2828
// https://golang.org/issue/13234.
2929
androidArgs = []string{"-gcflags=-shared", "-ldflags=-shared"}
3030
}
31-
typesPkgs, err := loadExportData(pkgs, androidArmEnv, androidArgs...)
31+
typesPkgs, err := loadExportData(pkgs, androidEnv["arm"], androidArgs...)
3232
if err != nil {
3333
return err
3434
}
@@ -56,7 +56,7 @@ func goAndroidBind(pkgs []*build.Package) error {
5656

5757
err = goBuild(
5858
mainFile,
59-
androidArmEnv,
59+
androidEnv["arm"],
6060
"-buildmode=c-shared",
6161
"-o="+filepath.Join(androidDir, "src/main/jniLibs/armeabi-v7a/libgojni.so"),
6262
)

cmd/gomobile/bind_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,15 @@ func TestBindAndroid(t *testing.T) {
101101

102102
var bindAndroidTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
103103
WORK=$WORK
104-
GOOS=android GOARCH=arm GOARM=7 CC=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-gcc CXX=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x golang.org/x/mobile/asset
104+
GOOS=android GOARCH=arm CC=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-gcc CXX=$GOMOBILE/android-ndk-r10e/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 GOARM=7 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x golang.org/x/mobile/asset
105105
rm -r -f "$WORK/fakegopath"
106106
mkdir -p $WORK/fakegopath/pkg
107107
cp $GOMOBILE/pkg_android_arm/golang.org/x/mobile/asset.a $WORK/fakegopath/pkg/android_arm/golang.org/x/mobile/asset.a
108108
mkdir -p $WORK/fakegopath/pkg/android_arm/golang.org/x/mobile
109109
mkdir -p $WORK/go_asset
110110
gobind -lang=go -outdir=$WORK/go_asset golang.org/x/mobile/asset
111111
mkdir -p $WORK/androidlib
112-
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 -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so $WORK/androidlib/main.go
112+
GOOS=android GOARCH=arm 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 GOARM=7 go build -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so $WORK/androidlib/main.go
113113
mkdir -p $WORK/android/src/main/java/{{.JavaPkgDir}}
114114
{{.GobindJavaCmd}} -outdir=$WORK/android/src/main/java/{{.JavaPkgDir}} golang.org/x/mobile/asset
115115
mkdir -p $WORK/android/src/main/java/go

cmd/gomobile/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func runBuild(cmd *command) (err error) {
9696
switch buildTarget {
9797
case "android":
9898
if pkg.Name != "main" {
99-
return goBuild(pkg.ImportPath, androidArmEnv)
99+
return goBuild(pkg.ImportPath, androidEnv["arm"])
100100
}
101101
nmpkgs, err = goAndroidBuild(pkg)
102102
if err != nil {

cmd/gomobile/build_androidapp.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,21 @@ func goAndroidBuild(pkg *build.Package) (map[string]bool, error) {
5252
return nil, fmt.Errorf("error parsing %s: %v", manifestPath, err)
5353
}
5454
}
55-
libPath := filepath.Join(tmpdir, "lib"+libName+".so")
5655

56+
toolchain := ndk.Toolchain("arm")
57+
58+
libPath := filepath.Join(tmpdir, "lib"+libName+".so")
5759
err = goBuild(
5860
pkg.ImportPath,
59-
androidArmEnv,
61+
androidEnv["arm"],
6062
"-buildmode=c-shared",
6163
"-o", libPath,
6264
)
6365
if err != nil {
6466
return nil, err
6567
}
6668

67-
nmpkgs, err := extractPkgs(androidArmNM, libPath)
69+
nmpkgs, err := extractPkgs(toolchain.Path("nm"), libPath)
6870
if err != nil {
6971
return nil, err
7072
}
@@ -155,7 +157,7 @@ func goAndroidBuild(pkg *build.Package) (map[string]bool, error) {
155157

156158
if nmpkgs["golang.org/x/mobile/exp/audio/al"] {
157159
dst := "lib/armeabi/libopenal.so"
158-
src := filepath.Join(ndkccpath, "openal/"+dst)
160+
src := filepath.Join(ndk.Root(), "openal/"+dst)
159161
if err := apkwWriteFile(dst, src); err != nil {
160162
return nil, err
161163
}

cmd/gomobile/build_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,5 +98,5 @@ func TestAndroidBuild(t *testing.T) {
9898

9999
var androidBuildTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
100100
WORK=$WORK
101-
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 -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="tag1" -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
101+
GOOS=android GOARCH=arm 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 GOARM=7 go build -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -tags="tag1" -x -buildmode=c-shared -o $WORK/libbasic.so golang.org/x/mobile/example/basic
102102
`))

cmd/gomobile/env.go

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import (
1616
var (
1717
cwd string
1818
gomobilepath string // $GOPATH/pkg/gomobile
19-
ndkccpath string // $GOPATH/pkg/gomobile/android-{{.NDK}}
2019

21-
androidArmEnv []string
20+
androidEnv map[string][]string // android arch -> []string
21+
2222
darwinArmEnv []string
2323
darwinArm64Env []string
2424
darwin386Env []string
@@ -92,23 +92,23 @@ func envInit() (err error) {
9292

9393
// Setup the cross-compiler environments.
9494

95-
// TODO(crawshaw): Remove ndkccpath global.
96-
ndkccpath = filepath.Join(gomobilepath, "android-"+ndkVersion)
97-
ndkccbin := filepath.Join(ndkccpath, "arm", "bin")
95+
androidEnv = make(map[string][]string)
96+
for arch, toolchain := range ndk {
97+
if goVersion < toolchain.minGoVer {
98+
continue
99+
}
98100

99-
exe := ""
100-
if goos == "windows" {
101-
exe = ".exe"
102-
}
103-
androidArmEnv = []string{
104-
"GOOS=android",
105-
"GOARCH=arm",
106-
"GOARM=7",
107-
"CC=" + filepath.Join(ndkccbin, "arm-linux-androideabi-gcc"+exe),
108-
"CXX=" + filepath.Join(ndkccbin, "arm-linux-androideabi-g++"+exe),
109-
"CGO_ENABLED=1",
101+
androidEnv[arch] = []string{
102+
"GOOS=android",
103+
"GOARCH=" + arch,
104+
"CC=" + toolchain.Path("gcc"),
105+
"CXX=" + toolchain.Path("g++"),
106+
"CGO_ENABLED=1",
107+
}
108+
if arch == "arm" {
109+
androidEnv[arch] = append(androidEnv[arch], "GOARM=7")
110+
}
110111
}
111-
androidArmNM = filepath.Join(ndkccbin, "arm-linux-androideabi-nm"+exe)
112112

113113
if runtime.GOOS != "darwin" {
114114
return nil
@@ -250,3 +250,64 @@ func getenv(env []string, key string) string {
250250
func pkgdir(env []string) string {
251251
return gomobilepath + "/pkg_" + getenv(env, "GOOS") + "_" + getenv(env, "GOARCH")
252252
}
253+
254+
type ndkToolchain struct {
255+
arch string
256+
abi string
257+
platform string
258+
gcc string
259+
toolPrefix string
260+
minGoVer goToolVersion
261+
}
262+
263+
func (tc *ndkToolchain) Path(toolName string) string {
264+
if goos == "windows" {
265+
toolName += ".exe"
266+
}
267+
return filepath.Join(ndk.Root(), tc.arch, "bin", tc.toolPrefix+"-"+toolName)
268+
}
269+
270+
type ndkConfig map[string]ndkToolchain // map: GOOS->androidConfig.
271+
272+
func (nc ndkConfig) Root() string {
273+
return filepath.Join(gomobilepath, "android-"+ndkVersion)
274+
}
275+
276+
func (nc ndkConfig) Toolchain(arch string) ndkToolchain {
277+
tc, ok := nc[arch]
278+
if !ok || tc.minGoVer > goVersion {
279+
panic(`unsupported architecture: ` + arch)
280+
}
281+
return tc
282+
}
283+
284+
// TODO: share this with release.go
285+
var ndk = ndkConfig{
286+
"arm": {
287+
arch: "arm",
288+
abi: "armeabi-v7a",
289+
platform: "android-15",
290+
gcc: "arm-linux-androideabi-4.8",
291+
toolPrefix: "arm-linux-androideabi",
292+
minGoVer: go1_5,
293+
},
294+
/*
295+
"386": {
296+
arch: "x86",
297+
abi: "x86",
298+
platform: "android-15",
299+
gcc: "x86-4.8",
300+
toolPrefix: "i686-linux-android",
301+
minGoVer: go1_6,
302+
303+
},
304+
"amd64": {
305+
arch: "x86_64",
306+
abi: "x86_64",
307+
platform: "android-21",
308+
gcc: "x86_64-4.9",
309+
toolPrefix: "x86_64-linux-android",
310+
minGoVer: go1_6,
311+
},
312+
*/
313+
}

cmd/gomobile/init.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ func runInit(cmd *command) error {
8181
return fmt.Errorf("GOPATH is not set")
8282
}
8383
gomobilepath = filepath.Join(gopaths[0], "pkg/gomobile")
84-
ndkccpath = filepath.Join(gopaths[0], "pkg/gomobile/android-"+ndkVersion)
85-
verpath := filepath.Join(gopaths[0], "pkg/gomobile/version")
84+
85+
verpath := filepath.Join(gomobilepath, "version")
8686
if buildX || buildN {
8787
fmt.Fprintln(xout, "GOMOBILE="+gomobilepath)
8888
}
8989
removeGomobilepkg()
9090

91-
if err := mkdir(ndkccpath); err != nil {
91+
if err := mkdir(ndk.Root()); err != nil {
9292
return err
9393
}
9494

@@ -146,7 +146,7 @@ func runInit(cmd *command) error {
146146
// https://golang.org/issue/13234.
147147
androidArgs = []string{"-gcflags=-shared", "-ldflags=-shared"}
148148
}
149-
if err := installStd(androidArmEnv, androidArgs...); err != nil {
149+
if err := installStd(androidEnv["arm"], androidArgs...); err != nil {
150150
return err
151151
}
152152
if err := installDarwin(); err != nil {
@@ -309,12 +309,13 @@ func fetchOpenAL() error {
309309
if goos == "windows" {
310310
resetReadOnlyFlagAll(filepath.Join(tmpdir, "openal"))
311311
}
312-
dst := filepath.Join(ndkccpath, "arm", "sysroot", "usr", "include")
312+
ndkroot := ndk.Root()
313+
dst := filepath.Join(ndkroot, "arm", "sysroot", "usr", "include")
313314
src := filepath.Join(tmpdir, "openal", "include")
314315
if err := move(dst, src, "AL"); err != nil {
315316
return err
316317
}
317-
libDst := filepath.Join(ndkccpath, "openal")
318+
libDst := filepath.Join(ndkroot, "openal")
318319
libSrc := filepath.Join(tmpdir, "openal")
319320
if err := mkdir(libDst); err != nil {
320321
return nil
@@ -388,7 +389,7 @@ func fetchNDK() error {
388389
resetReadOnlyFlagAll(filepath.Join(tmpdir, "android-"+ndkVersion))
389390
}
390391

391-
dst := filepath.Join(ndkccpath, "arm")
392+
dst := filepath.Join(ndk.Root(), "arm")
392393
dstSysroot := filepath.Join(dst, "sysroot/usr")
393394
if err := mkdir(dstSysroot); err != nil {
394395
return err

cmd/gomobile/init_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib{{if eq .GOOS "darwin"}
132132
go install -p={{.NumCPU}} -x golang.org/x/mobile/gl
133133
go install -p={{.NumCPU}} -x golang.org/x/mobile/app
134134
go install -p={{.NumCPU}} -x golang.org/x/mobile/exp/app/debug{{end}}
135-
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 install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -x std
135+
GOOS=android GOARCH=arm 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 GOARM=7 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -x std
136136
{{if eq .GOOS "darwin"}}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 -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_darwin_arm -x std
137137
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 -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_darwin_arm64 -x std
138138
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 -p={{.NumCPU}} -tags=ios -pkgdir=$GOMOBILE/pkg_darwin_amd64 -x std

0 commit comments

Comments
 (0)