cmd/gomobile: fix gomobile build of non-main packages for iOS

Non-main packages are built in an earlier code path than main
packages. Add the ios build tag before that early code path to
ensure packages that expect that tag successfully compiles.

Fixes golang/go#25944

Change-Id: Ida15475109373127dde024037e9787c76b32ee0b
Reviewed-on: https://go-review.googlesource.com/119555
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go
index 156feb4..727a7c7 100644
--- a/cmd/gomobile/build.go
+++ b/cmd/gomobile/build.go
@@ -81,6 +81,10 @@
 	ctx.GOARCH = targetArchs[0]
 	ctx.GOOS = targetOS
 
+	if ctx.GOOS == "darwin" {
+		ctx.BuildTags = append(ctx.BuildTags, "ios")
+	}
+
 	switch len(args) {
 	case 0:
 		pkg, err = ctx.ImportDir(cwd, build.ImportComment)
diff --git a/cmd/gomobile/build_darwin_test.go b/cmd/gomobile/build_darwin_test.go
index 3b33832..81a607e 100644
--- a/cmd/gomobile/build_darwin_test.go
+++ b/cmd/gomobile/build_darwin_test.go
@@ -13,75 +13,92 @@
 )
 
 func TestIOSBuild(t *testing.T) {
-	buf := new(bytes.Buffer)
 	defer func() {
 		xout = os.Stderr
 		buildN = false
 		buildX = false
 	}()
-	xout = buf
 	buildN = true
 	buildX = true
-	buildO = "basic.app"
 	buildTarget = "ios"
 	gopath = filepath.SplitList(goEnv("GOPATH"))[0]
-	cmdBuild.flag.Parse([]string{"golang.org/x/mobile/example/basic"})
 	oldTags := ctx.BuildTags
 	ctx.BuildTags = []string{"tag1"}
 	defer func() {
 		ctx.BuildTags = oldTags
 	}()
-	err := runBuild(cmdBuild)
-	if err != nil {
-		t.Log(buf.String())
-		t.Fatal(err)
-	}
-
-	teamID, err := detectTeamID()
-	if err != nil {
-		t.Fatalf("detecting team ID failed: %v", err)
-	}
-
-	data := struct {
-		outputData
-		TeamID string
+	tests := []struct {
+		pkg  string
+		main bool
 	}{
-		outputData: defaultOutputData(),
-		TeamID:     teamID,
+		{"golang.org/x/mobile/example/basic", true},
+		{"golang.org/x/mobile/bind/testdata/testpkg", false},
 	}
+	for _, test := range tests {
+		buf := new(bytes.Buffer)
+		xout = buf
+		if test.main {
+			buildO = "basic.app"
+		} else {
+			buildO = ""
+		}
+		cmdBuild.flag.Parse([]string{test.pkg})
+		err := runBuild(cmdBuild)
+		if err != nil {
+			t.Log(buf.String())
+			t.Fatal(err)
+		}
 
-	got := filepath.ToSlash(buf.String())
+		teamID, err := detectTeamID()
+		if err != nil {
+			t.Fatalf("detecting team ID failed: %v", err)
+		}
 
-	wantBuf := new(bytes.Buffer)
+		data := struct {
+			outputData
+			TeamID string
+			Pkg    string
+			Main   bool
+		}{
+			outputData: defaultOutputData(),
+			TeamID:     teamID,
+			Pkg:        test.pkg,
+			Main:       test.main,
+		}
 
-	if err := iosBuildTmpl.Execute(wantBuf, data); err != nil {
-		t.Fatalf("computing diff failed: %v", err)
-	}
+		got := filepath.ToSlash(buf.String())
 
-	diff, err := diff(got, wantBuf.String())
+		wantBuf := new(bytes.Buffer)
 
-	if err != nil {
-		t.Fatalf("computing diff failed: %v", err)
-	}
-	if diff != "" {
-		t.Errorf("unexpected output:\n%s", diff)
+		if err := iosBuildTmpl.Execute(wantBuf, data); err != nil {
+			t.Fatalf("computing diff failed: %v", err)
+		}
+
+		diff, err := diff(got, wantBuf.String())
+
+		if err != nil {
+			t.Fatalf("computing diff failed: %v", err)
+		}
+		if diff != "" {
+			t.Errorf("unexpected output:\n%s", diff)
+		}
 	}
 }
 
 var iosBuildTmpl = template.Must(infoplistTmpl.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
-WORK=$WORK
+WORK=$WORK{{if .Main}}
 mkdir -p $WORK/main.xcodeproj
 echo "{{.Xproj}}" > $WORK/main.xcodeproj/project.pbxproj
 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
-GOARM=7 GOOS=darwin GOARCH=arm 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 -tags tag1 ios -x -ldflags=-w -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 -tags tag1 ios -x -ldflags=-w -o=$WORK/arm64 golang.org/x/mobile/example/basic
-GOOS=darwin GOARCH=386 CC=clang-iphonesimulator CXX=clang-iphonesimulator CGO_CFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch i386 CGO_LDFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch i386 CGO_ENABLED=1 go build -tags tag1 ios -x -ldflags=-w -o=$WORK/386 golang.org/x/mobile/example/basic
-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 build -tags tag1 ios -x -ldflags=-w -o=$WORK/amd64 golang.org/x/mobile/example/basic
+echo "{{.Xcontents}}" > $WORK/main/Images.xcassets/AppIcon.appiconset/Contents.json{{end}}
+GOARM=7 GOOS=darwin GOARCH=arm 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 -tags tag1 ios -x {{if .Main}}-ldflags=-w -o=$WORK/arm {{end}}{{.Pkg}}
+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 -tags tag1 ios -x {{if .Main}}-ldflags=-w -o=$WORK/arm64 {{end}}{{.Pkg}}
+GOOS=darwin GOARCH=386 CC=clang-iphonesimulator CXX=clang-iphonesimulator CGO_CFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch i386 CGO_LDFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch i386 CGO_ENABLED=1 go build -tags tag1 ios -x {{if .Main}}-ldflags=-w -o=$WORK/386 {{end}}{{.Pkg}}
+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 build -tags tag1 ios -x {{if .Main}}-ldflags=-w -o=$WORK/amd64 {{end}}{{.Pkg}}{{if .Main}}
 xcrun lipo -o $WORK/main/main -create $WORK/arm $WORK/arm64 $WORK/386 $WORK/amd64
 mkdir -p $WORK/main/assets
 xcrun xcodebuild -configuration Release -project $WORK/main.xcodeproj -allowProvisioningUpdates DEVELOPMENT_TEAM={{.TeamID}}
-mv $WORK/build/Release-iphoneos/main.app basic.app
+mv $WORK/build/Release-iphoneos/main.app basic.app{{end}}
 `))
diff --git a/cmd/gomobile/build_iosapp.go b/cmd/gomobile/build_iosapp.go
index 0b0ff2c..9cc22ab 100644
--- a/cmd/gomobile/build_iosapp.go
+++ b/cmd/gomobile/build_iosapp.go
@@ -62,8 +62,6 @@
 		}
 	}
 
-	ctx.BuildTags = append(ctx.BuildTags, "ios")
-
 	// We are using lipo tool to build multiarchitecture binaries.
 	cmd := exec.Command(
 		"xcrun", "lipo",