Skip to content

Commit 6621de0

Browse files
author
Elias Naur
committed
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 <[email protected]>
1 parent c37eee0 commit 6621de0

File tree

3 files changed

+58
-39
lines changed

3 files changed

+58
-39
lines changed

cmd/gomobile/build.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ func runBuild(cmd *command) (err error) {
8181
ctx.GOARCH = targetArchs[0]
8282
ctx.GOOS = targetOS
8383

84+
if ctx.GOOS == "darwin" {
85+
ctx.BuildTags = append(ctx.BuildTags, "ios")
86+
}
87+
8488
switch len(args) {
8589
case 0:
8690
pkg, err = ctx.ImportDir(cwd, build.ImportComment)

cmd/gomobile/build_darwin_test.go

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,75 +13,92 @@ import (
1313
)
1414

1515
func TestIOSBuild(t *testing.T) {
16-
buf := new(bytes.Buffer)
1716
defer func() {
1817
xout = os.Stderr
1918
buildN = false
2019
buildX = false
2120
}()
22-
xout = buf
2321
buildN = true
2422
buildX = true
25-
buildO = "basic.app"
2623
buildTarget = "ios"
2724
gopath = filepath.SplitList(goEnv("GOPATH"))[0]
28-
cmdBuild.flag.Parse([]string{"golang.org/x/mobile/example/basic"})
2925
oldTags := ctx.BuildTags
3026
ctx.BuildTags = []string{"tag1"}
3127
defer func() {
3228
ctx.BuildTags = oldTags
3329
}()
34-
err := runBuild(cmdBuild)
35-
if err != nil {
36-
t.Log(buf.String())
37-
t.Fatal(err)
30+
tests := []struct {
31+
pkg string
32+
main bool
33+
}{
34+
{"golang.org/x/mobile/example/basic", true},
35+
{"golang.org/x/mobile/bind/testdata/testpkg", false},
3836
}
37+
for _, test := range tests {
38+
buf := new(bytes.Buffer)
39+
xout = buf
40+
if test.main {
41+
buildO = "basic.app"
42+
} else {
43+
buildO = ""
44+
}
45+
cmdBuild.flag.Parse([]string{test.pkg})
46+
err := runBuild(cmdBuild)
47+
if err != nil {
48+
t.Log(buf.String())
49+
t.Fatal(err)
50+
}
3951

40-
teamID, err := detectTeamID()
41-
if err != nil {
42-
t.Fatalf("detecting team ID failed: %v", err)
43-
}
52+
teamID, err := detectTeamID()
53+
if err != nil {
54+
t.Fatalf("detecting team ID failed: %v", err)
55+
}
4456

45-
data := struct {
46-
outputData
47-
TeamID string
48-
}{
49-
outputData: defaultOutputData(),
50-
TeamID: teamID,
51-
}
57+
data := struct {
58+
outputData
59+
TeamID string
60+
Pkg string
61+
Main bool
62+
}{
63+
outputData: defaultOutputData(),
64+
TeamID: teamID,
65+
Pkg: test.pkg,
66+
Main: test.main,
67+
}
5268

53-
got := filepath.ToSlash(buf.String())
69+
got := filepath.ToSlash(buf.String())
5470

55-
wantBuf := new(bytes.Buffer)
71+
wantBuf := new(bytes.Buffer)
5672

57-
if err := iosBuildTmpl.Execute(wantBuf, data); err != nil {
58-
t.Fatalf("computing diff failed: %v", err)
59-
}
73+
if err := iosBuildTmpl.Execute(wantBuf, data); err != nil {
74+
t.Fatalf("computing diff failed: %v", err)
75+
}
6076

61-
diff, err := diff(got, wantBuf.String())
77+
diff, err := diff(got, wantBuf.String())
6278

63-
if err != nil {
64-
t.Fatalf("computing diff failed: %v", err)
65-
}
66-
if diff != "" {
67-
t.Errorf("unexpected output:\n%s", diff)
79+
if err != nil {
80+
t.Fatalf("computing diff failed: %v", err)
81+
}
82+
if diff != "" {
83+
t.Errorf("unexpected output:\n%s", diff)
84+
}
6885
}
6986
}
7087

7188
var iosBuildTmpl = template.Must(infoplistTmpl.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
72-
WORK=$WORK
89+
WORK=$WORK{{if .Main}}
7390
mkdir -p $WORK/main.xcodeproj
7491
echo "{{.Xproj}}" > $WORK/main.xcodeproj/project.pbxproj
7592
mkdir -p $WORK/main
7693
echo "{{template "infoplist" .Xinfo}}" > $WORK/main/Info.plist
7794
mkdir -p $WORK/main/Images.xcassets/AppIcon.appiconset
78-
echo "{{.Xcontents}}" > $WORK/main/Images.xcassets/AppIcon.appiconset/Contents.json
79-
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
80-
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
81-
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
82-
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
95+
echo "{{.Xcontents}}" > $WORK/main/Images.xcassets/AppIcon.appiconset/Contents.json{{end}}
96+
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}}
97+
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}}
98+
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}}
99+
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}}
83100
xcrun lipo -o $WORK/main/main -create $WORK/arm $WORK/arm64 $WORK/386 $WORK/amd64
84101
mkdir -p $WORK/main/assets
85102
xcrun xcodebuild -configuration Release -project $WORK/main.xcodeproj -allowProvisioningUpdates DEVELOPMENT_TEAM={{.TeamID}}
86-
mv $WORK/build/Release-iphoneos/main.app basic.app
103+
mv $WORK/build/Release-iphoneos/main.app basic.app{{end}}
87104
`))

cmd/gomobile/build_iosapp.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ func goIOSBuild(pkg *build.Package, bundleID string, archs []string) (map[string
6262
}
6363
}
6464

65-
ctx.BuildTags = append(ctx.BuildTags, "ios")
66-
6765
// We are using lipo tool to build multiarchitecture binaries.
6866
cmd := exec.Command(
6967
"xcrun", "lipo",

0 commit comments

Comments
 (0)