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",