From 9ec2d17db2b8d521645b76d4d1616223e982858a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 8 Jan 2017 18:10:11 +0100 Subject: [PATCH] cmd: fix handling of (multiple) tags The gomobile tool mishandled build tags in two ways, first by ignoring tags for iOS, second by passing multiple tags along to the go tool incorrectly. This CL fixes both. Fixes golang/go#18523 Fixes golang/go#18515 Change-Id: I28a49c1e23670adb085617d9f5fb5cd5e22a4b65 Reviewed-on: https://go-review.googlesource.com/34955 Reviewed-by: David Crawshaw --- bind/java/SeqTest.java | 4 ++++ bind/java/seq_test.go | 8 ++++---- bind/objc/SeqTest.m | 4 ++++ bind/objc/seq_test.go | 6 ++++-- bind/testpkg/tagged.go | 10 ++++++++++ cmd/gomobile/bind.go | 4 ++++ cmd/gomobile/bind_iosapp.go | 2 +- cmd/gomobile/bind_test.go | 4 ++-- cmd/gomobile/build.go | 5 +++-- cmd/gomobile/build_darwin_test.go | 4 ++-- cmd/gomobile/build_test.go | 2 +- 11 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 bind/testpkg/tagged.go diff --git a/bind/java/SeqTest.java b/bind/java/SeqTest.java index 6bce54d..2439c51 100644 --- a/bind/java/SeqTest.java +++ b/bind/java/SeqTest.java @@ -581,4 +581,8 @@ public class SeqTest extends InstrumentationTestCase { public void testSIGPIPE() { Testpkg.testSIGPIPE(); } + + public void testTags() { + assertEquals("Constant from a tagged file", 42, Testpkg.TaggedConst); + } } diff --git a/bind/java/seq_test.go b/bind/java/seq_test.go index d8636a2..d8271ad 100644 --- a/bind/java/seq_test.go +++ b/bind/java/seq_test.go @@ -106,12 +106,12 @@ func runTest(t *testing.T, pkgNames []string, javaPkg, javaCls string) { } } - cmd := []string{"gomobile", "bind", "-o", "pkg.aar"} + args := []string{"bind", "-tags", "aaa bbb", "-o", "pkg.aar"} if javaPkg != "" { - cmd = append(cmd, "-javapkg", javaPkg) + args = append(args, "-javapkg", javaPkg) } - cmd = append(cmd, pkgNames...) - buf, err := run(strings.Join(cmd, " ")) + args = append(args, pkgNames...) + buf, err := exec.Command("gomobile", args...).CombinedOutput() if err != nil { t.Logf("%s", buf) t.Fatalf("failed to run gomobile bind: %v", err) diff --git a/bind/objc/SeqTest.m b/bind/objc/SeqTest.m index 91f2468..e6d0fe7 100644 --- a/bind/objc/SeqTest.m +++ b/bind/objc/SeqTest.m @@ -447,4 +447,8 @@ static int numI = 0; - (void)testSIGPIPE { TestpkgTestSIGPIPE(); } + +- (void)testTags { + XCTAssertEqual(42, TestpkgTaggedConst, @"Tagged const must exist"); +} @end diff --git a/bind/objc/seq_test.go b/bind/objc/seq_test.go index a75ac5f..4dfa334 100644 --- a/bind/objc/seq_test.go +++ b/bind/objc/seq_test.go @@ -102,13 +102,15 @@ func runTest(t *testing.T, pkgNames []string, project, testfile string, dumpOutp } defer os.Chdir(cwd) - buf, err := run("gomobile bind -target=ios " + strings.Join(pkgNames, " ")) + cmd := exec.Command("gomobile", "bind", "-target", "ios", "-tags", "aaa bbb") + cmd.Args = append(cmd.Args, pkgNames...) + buf, err := cmd.CombinedOutput() if err != nil { t.Logf("%s", buf) t.Fatalf("failed to run gomobile bind: %v", err) } - cmd := exec.Command("xcodebuild", "test", "-scheme", project, "-destination", *destination) + cmd = exec.Command("xcodebuild", "test", "-scheme", project, "-destination", *destination) buf, err = cmd.CombinedOutput() if err != nil { t.Logf("%s", buf) diff --git a/bind/testpkg/tagged.go b/bind/testpkg/tagged.go new file mode 100644 index 0000000..69ebff0 --- /dev/null +++ b/bind/testpkg/tagged.go @@ -0,0 +1,10 @@ +// Copyright 2017 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. + +// +build aaa,bbb + +// This file tests that tags work with gomobile. +package testpkg + +const TaggedConst = 42 diff --git a/cmd/gomobile/bind.go b/cmd/gomobile/bind.go index 1256265..2c70f92 100644 --- a/cmd/gomobile/bind.go +++ b/cmd/gomobile/bind.go @@ -91,6 +91,10 @@ func runBind(cmd *command) error { ctx.GOARCH = "arm" ctx.GOOS = targetOS + if ctx.GOOS == "darwin" { + ctx.BuildTags = append(ctx.BuildTags, "ios") + } + if bindJavaPkg != "" && ctx.GOOS != "android" { return fmt.Errorf("-javapkg is supported only for android target") } diff --git a/cmd/gomobile/bind_iosapp.go b/cmd/gomobile/bind_iosapp.go index 4224b06..3f13587 100644 --- a/cmd/gomobile/bind_iosapp.go +++ b/cmd/gomobile/bind_iosapp.go @@ -197,7 +197,7 @@ var iosModuleMapTmpl = template.Must(template.New("iosmmap").Parse(`framework mo func goIOSBindArchive(name, path string, env, fileBases []string) (string, error) { arch := getenv(env, "GOARCH") archive := filepath.Join(tmpdir, name+"-"+arch+".a") - err := goBuild(path, env, "-buildmode=c-archive", "-tags=ios", "-o", archive) + err := goBuild(path, env, "-buildmode=c-archive", "-o", archive) if err != nil { return "", err } diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go index 61bfe07..de12951 100644 --- a/cmd/gomobile/bind_test.go +++ b/cmd/gomobile/bind_test.go @@ -106,7 +106,7 @@ mkdir -p $WORK/gomobile_bind mkdir -p $WORK/gomobile_bind mkdir -p $WORK/gomobile_bind mkdir -p $WORK/gen/src/Java -GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++ CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH go install -pkgdir=$GOMOBILE/pkg_android_arm -tags="" -x golang.org/x/mobile/asset +GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++ CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH go install -pkgdir=$GOMOBILE/pkg_android_arm -x golang.org/x/mobile/asset rm -r -f "$WORK/fakegopath" mkdir -p $WORK/fakegopath/pkg cp $GOMOBILE/pkg_android_arm/golang.org/x/mobile/asset.a $WORK/fakegopath/pkg/android_arm/golang.org/x/mobile/asset.a @@ -134,7 +134,7 @@ mkdir -p $WORK/gomobile_bind cp $GOPATH/src/golang.org/x/mobile/bind/seq.go.support $WORK/gomobile_bind/seq.go mkdir -p $WORK/gomobile_bind mkdir -p $WORK/android/src/main/java/go -GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH 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 +GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH go build -pkgdir=$GOMOBILE/pkg_android_arm -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so $WORK/androidlib/main.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 rm $WORK/android/src/main/java/go/LoadJNI.java diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go index 3ed4576..3b36502 100644 --- a/cmd/gomobile/build.go +++ b/cmd/gomobile/build.go @@ -15,7 +15,6 @@ import ( "os/exec" "regexp" "runtime" - "strconv" "strings" ) @@ -270,8 +269,10 @@ func goCmd(subcmd string, srcs []string, env []string, args ...string) error { "go", subcmd, "-pkgdir="+pkgdir(env), - "-tags="+strconv.Quote(strings.Join(ctx.BuildTags, ",")), ) + if len(ctx.BuildTags) > 0 { + cmd.Args = append(cmd.Args, "-tags", strings.Join(ctx.BuildTags, " ")) + } if buildV { cmd.Args = append(cmd.Args, "-v") } diff --git a/cmd/gomobile/build_darwin_test.go b/cmd/gomobile/build_darwin_test.go index a5d8de6..0cb6754 100644 --- a/cmd/gomobile/build_darwin_test.go +++ b/cmd/gomobile/build_darwin_test.go @@ -50,8 +50,8 @@ mkdir -p $WORK/main echo "{{template "infoplist" .Xinfo}}" > $WORK/main/Info.plist mkdir -p $WORK/main/Images.xcassets/AppIcon.appiconset echo "{{.Xcontents}}" > $WORK/main/Images.xcassets/AppIcon.appiconset/Contents.json -GOOS=darwin GOARCH=arm GOARM=7 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_darwin_arm -tags="tag1,ios" -x -o=$WORK/arm golang.org/x/mobile/example/basic -GOOS=darwin GOARCH=arm64 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_darwin_arm64 -tags="tag1,ios" -x -o=$WORK/arm64 golang.org/x/mobile/example/basic +GOOS=darwin GOARCH=arm GOARM=7 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_darwin_arm -tags tag1 ios -x -o=$WORK/arm golang.org/x/mobile/example/basic +GOOS=darwin GOARCH=arm64 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_ENABLED=1 go build -pkgdir=$GOMOBILE/pkg_darwin_arm64 -tags tag1 ios -x -o=$WORK/arm64 golang.org/x/mobile/example/basic xcrun lipo -create $WORK/arm $WORK/arm64 -o $WORK/main/main mkdir -p $WORK/main/assets xcrun xcodebuild -configuration Release -project $WORK/main.xcodeproj diff --git a/cmd/gomobile/build_test.go b/cmd/gomobile/build_test.go index f7790f0..1234c7a 100644 --- a/cmd/gomobile/build_test.go +++ b/cmd/gomobile/build_test.go @@ -100,7 +100,7 @@ func TestAndroidBuild(t *testing.T) { var androidBuildTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile WORK=$WORK mkdir -p $WORK/lib/armeabi-v7a -GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 go build -pkgdir=$GOMOBILE/pkg_android_arm -tags="tag1" -x -buildmode=c-shared -o $WORK/lib/armeabi-v7a/libbasic.so golang.org/x/mobile/example/basic +GOOS=android GOARCH=arm CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $GOMOBILE/android-{{.NDK}}/arm/sysroot CGO_ENABLED=1 GOARM=7 go build -pkgdir=$GOMOBILE/pkg_android_arm -tags tag1 -x -buildmode=c-shared -o $WORK/lib/armeabi-v7a/libbasic.so golang.org/x/mobile/example/basic `)) func TestParseBuildTargetFlag(t *testing.T) {