cmd/gomobile: install common dev packages

I often forget to do this. I can't be the only one.

Change-Id: Ia5dfaa6811242758f996de614f80cb42badf327b
Reviewed-on: https://go-review.googlesource.com/13742
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/init.go b/cmd/gomobile/init.go
index d2f36b8..8710c6a 100644
--- a/cmd/gomobile/init.go
+++ b/cmd/gomobile/init.go
@@ -128,6 +128,14 @@
 		return err
 	}
 
+	// Install common x/mobile packages for local development.
+	// These are often slow to compile (due to cgo) and easy to forget.
+	for _, pkg := range commonPkgs {
+		if err := installPkg(pkg, nil); err != nil {
+			return err
+		}
+	}
+
 	// Install standard libraries for cross compilers.
 	start := time.Now()
 	if err := installStd(androidArmEnv); err != nil {
@@ -152,6 +160,12 @@
 	return nil
 }
 
+var commonPkgs = []string{
+	"golang.org/x/mobile/gl",
+	"golang.org/x/mobile/app",
+	"golang.org/x/mobile/exp/app/debug",
+}
+
 func installDarwin() error {
 	if goos != "darwin" {
 		return nil // Only build iOS compilers on OS X.
@@ -170,15 +184,25 @@
 }
 
 func installStd(env []string, args ...string) error {
-	tOS := getenv(env, "GOOS")
-	tArch := getenv(env, "GOARCH")
-	if buildV {
-		fmt.Fprintf(os.Stderr, "\n# Building standard library for %s/%s.\n", tOS, tArch)
+	return installPkg("std", env, args...)
+}
+
+func installPkg(pkg string, env []string, args ...string) error {
+	tOS, tArch, pd := getenv(env, "GOOS"), getenv(env, "GOARCH"), pkgdir(env)
+	if tOS != "" && tArch != "" {
+		if buildV {
+			fmt.Fprintf(os.Stderr, "\n# Installing %s for %s/%s.\n", pkg, tOS, tArch)
+		}
+		args = append(args, "-pkgdir="+pd)
+	} else {
+		if buildV {
+			fmt.Fprintf(os.Stderr, "\n# Installing %s.\n", pkg)
+		}
 	}
 
 	// The -p flag is to speed up darwin/arm builds.
 	// Remove when golang.org/issue/10477 is resolved.
-	cmd := exec.Command("go", "install", fmt.Sprintf("-p=%d", runtime.NumCPU()), "-pkgdir="+pkgdir(env))
+	cmd := exec.Command("go", "install", fmt.Sprintf("-p=%d", runtime.NumCPU()))
 	cmd.Args = append(cmd.Args, args...)
 	if buildV {
 		cmd.Args = append(cmd.Args, "-v")
@@ -189,7 +213,7 @@
 	if buildWork {
 		cmd.Args = append(cmd.Args, "-work")
 	}
-	cmd.Args = append(cmd.Args, "std")
+	cmd.Args = append(cmd.Args, pkg)
 	cmd.Env = append([]string{}, env...)
 	return runCmd(cmd)
 }
diff --git a/cmd/gomobile/init_test.go b/cmd/gomobile/init_test.go
index 1be2ff6..e5c7bda 100644
--- a/cmd/gomobile/init_test.go
+++ b/cmd/gomobile/init_test.go
@@ -120,10 +120,13 @@
 mv $WORK/openal/include/AL $GOMOBILE/android-{{.NDK}}/arm/sysroot/usr/include/AL
 mkdir -p $GOMOBILE/android-{{.NDK}}/openal
 mv $WORK/openal/lib $GOMOBILE/android-{{.NDK}}/openal/lib
+go install -p={{.NumCPU}} -x golang.org/x/mobile/gl
+go install -p={{.NumCPU}} -x golang.org/x/mobile/app
+go install -p={{.NumCPU}} -x golang.org/x/mobile/exp/app/debug
 GOOS=android GOARCH=arm GOARM=7 CC=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-gcc{{.EXE}} CXX=$GOMOBILE/android-{{.NDK}}/arm/bin/arm-linux-androideabi-g++ CGO_ENABLED=1 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_android_arm -x std
 {{if eq .GOOS "darwin"}}GOOS=darwin GOARCH=arm GOARM=7 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -arch armv7 CGO_ENABLED=1 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_darwin_arm -x std
 GOOS=darwin GOARCH=arm64 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -arch arm64 CGO_ENABLED=1 go install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_darwin_arm64 -x std
-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 install -p={{.NumCPU}} -pkgdir=$GOMOBILE/pkg_darwin_amd64 -tags=ios -x std
+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 install -p={{.NumCPU}} -tags=ios -pkgdir=$GOMOBILE/pkg_darwin_amd64 -x std
 {{end}}go version > $GOMOBILE/version
 rm -r -f "$WORK"
 `))