build_darwin_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2015 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "bytes"
  7. "os"
  8. "path/filepath"
  9. "testing"
  10. "text/template"
  11. )
  12. func TestAppleBuild(t *testing.T) {
  13. if !xcodeAvailable() {
  14. t.Skip("Xcode is missing")
  15. }
  16. defer func() {
  17. xout = os.Stderr
  18. buildN = false
  19. buildX = false
  20. }()
  21. buildN = true
  22. buildX = true
  23. buildTarget = "ios"
  24. buildBundleID = "org.golang.todo"
  25. gopath = filepath.SplitList(goEnv("GOPATH"))[0]
  26. oldTags := buildTags
  27. buildTags = []string{"tag1"}
  28. defer func() {
  29. buildTags = oldTags
  30. }()
  31. tests := []struct {
  32. pkg string
  33. main bool
  34. }{
  35. {"golang.org/x/mobile/example/basic", true},
  36. {"golang.org/x/mobile/bind/testdata/testpkg", false},
  37. }
  38. for _, test := range tests {
  39. buf := new(bytes.Buffer)
  40. xout = buf
  41. var tmpl *template.Template
  42. if test.main {
  43. buildO = "basic.app"
  44. tmpl = appleMainBuildTmpl
  45. } else {
  46. buildO = ""
  47. tmpl = appleOtherBuildTmpl
  48. }
  49. cmdBuild.flag.Parse([]string{test.pkg})
  50. err := runBuild(cmdBuild)
  51. if err != nil {
  52. t.Log(buf.String())
  53. t.Fatal(err)
  54. }
  55. teamID, err := detectTeamID()
  56. if err != nil {
  57. t.Fatalf("detecting team ID failed: %v", err)
  58. }
  59. output, err := defaultOutputData(teamID)
  60. if err != nil {
  61. t.Fatal(err)
  62. }
  63. data := struct {
  64. outputData
  65. TeamID string
  66. Pkg string
  67. Main bool
  68. BuildO string
  69. }{
  70. outputData: output,
  71. TeamID: teamID,
  72. Pkg: test.pkg,
  73. Main: test.main,
  74. BuildO: buildO,
  75. }
  76. got := filepath.ToSlash(buf.String())
  77. wantBuf := new(bytes.Buffer)
  78. if err := tmpl.Execute(wantBuf, data); err != nil {
  79. t.Fatalf("computing diff failed: %v", err)
  80. }
  81. diff, err := diff(got, wantBuf.String())
  82. if err != nil {
  83. t.Fatalf("computing diff failed: %v", err)
  84. }
  85. if diff != "" {
  86. t.Errorf("unexpected output:\n%s", diff)
  87. }
  88. }
  89. }
  90. var appleMainBuildTmpl = template.Must(infoplistTmpl.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
  91. WORK=$WORK
  92. mkdir -p $WORK/main.xcodeproj
  93. echo "{{.Xproj}}" > $WORK/main.xcodeproj/project.pbxproj
  94. mkdir -p $WORK/main
  95. echo "{{template "infoplist" .Xinfo}}" > $WORK/main/Info.plist
  96. mkdir -p $WORK/main/Images.xcassets/AppIcon.appiconset
  97. echo "{{.Xcontents}}" > $WORK/main/Images.xcassets/AppIcon.appiconset/Contents.json
  98. GOMODCACHE=$GOPATH/pkg/mod GOOS=ios GOARCH=arm64 GOFLAGS=-tags=ios CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_CXXFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_LDFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_ENABLED=1 DARWIN_SDK=iphoneos go build -tags tag1 -x -ldflags=-w -o=$WORK/ios/arm64 {{.Pkg}}
  99. GOMODCACHE=$GOPATH/pkg/mod GOOS=ios GOARCH=amd64 GOFLAGS=-tags=ios CC=iphonesimulator-clang CXX=iphonesimulator-clang++ CGO_CFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_CXXFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_LDFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_ENABLED=1 DARWIN_SDK=iphonesimulator go build -tags tag1 -x -ldflags=-w -o=$WORK/iossimulator/amd64 {{.Pkg}}
  100. xcrun lipo -o $WORK/main/main -create $WORK/ios/arm64 $WORK/iossimulator/amd64
  101. mkdir -p $WORK/main/assets
  102. xcrun xcodebuild -configuration Release -project $WORK/main.xcodeproj -allowProvisioningUpdates DEVELOPMENT_TEAM={{.TeamID}}
  103. mv $WORK/build/Release-iphoneos/main.app {{.BuildO}}
  104. `))
  105. var appleOtherBuildTmpl = template.Must(infoplistTmpl.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
  106. WORK=$WORK
  107. GOMODCACHE=$GOPATH/pkg/mod GOOS=ios GOARCH=arm64 GOFLAGS=-tags=ios CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_CXXFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_LDFLAGS=-isysroot iphoneos -miphoneos-version-min=13.0 -fembed-bitcode -arch arm64 CGO_ENABLED=1 DARWIN_SDK=iphoneos go build -tags tag1 -x {{.Pkg}}
  108. GOMODCACHE=$GOPATH/pkg/mod GOOS=ios GOARCH=arm64 GOFLAGS=-tags=ios CC=iphonesimulator-clang CXX=iphonesimulator-clang++ CGO_CFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch arm64 CGO_CXXFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch arm64 CGO_LDFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch arm64 CGO_ENABLED=1 DARWIN_SDK=iphonesimulator go build -tags tag1 -x {{.Pkg}}
  109. GOMODCACHE=$GOPATH/pkg/mod GOOS=ios GOARCH=amd64 GOFLAGS=-tags=ios CC=iphonesimulator-clang CXX=iphonesimulator-clang++ CGO_CFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_CXXFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_LDFLAGS=-isysroot iphonesimulator -mios-simulator-version-min=13.0 -fembed-bitcode -arch x86_64 CGO_ENABLED=1 DARWIN_SDK=iphonesimulator go build -tags tag1 -x {{.Pkg}}
  110. `))