cmd/gomobile: create go.sum at the temporary directory

As of Go1.16, `go build` fails if go.sum does not exist. This change
fixes this issue by forcing to create go.sum by calling `go mod tidy`.

Closes golang/go#44162

Change-Id: Ibba738503d1a58c6533b2427dd4efa6954b8eaa3
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/290409
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
Trust: Than McIntosh <thanm@google.com>
Trust: Hyang-Ah Hana Kim <hyangah@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/bind_androidapp.go b/cmd/gomobile/bind_androidapp.go
index 8fe9179..88a5c86 100644
--- a/cmd/gomobile/bind_androidapp.go
+++ b/cmd/gomobile/bind_androidapp.go
@@ -52,6 +52,11 @@
 
 	androidDir := filepath.Join(tmpdir, "android")
 
+	modulesUsed, err := areGoModulesUsed()
+	if err != nil {
+		return err
+	}
+
 	// Generate binding code and java source code only when processing the first package.
 	for _, arch := range androidArchs {
 		if err := writeGoMod("android", arch); err != nil {
@@ -62,8 +67,16 @@
 		// Add the generated packages to GOPATH for reverse bindings.
 		gopath := fmt.Sprintf("GOPATH=%s%c%s", tmpdir, filepath.ListSeparator, goEnv("GOPATH"))
 		env = append(env, gopath)
-		toolchain := ndk.Toolchain(arch)
 
+		// Run `go mod tidy` to force to create go.sum.
+		// Without go.sum, `go build` fails as of Go 1.16.
+		if modulesUsed {
+			if err := goModTidyAt(filepath.Join(tmpdir, "src"), env); err != nil {
+				return err
+			}
+		}
+
+		toolchain := ndk.Toolchain(arch)
 		err := goBuildAt(
 			filepath.Join(tmpdir, "src"),
 			"./gobind",
diff --git a/cmd/gomobile/bind_iosapp.go b/cmd/gomobile/bind_iosapp.go
index 91d0de3..846a63f 100644
--- a/cmd/gomobile/bind_iosapp.go
+++ b/cmd/gomobile/bind_iosapp.go
@@ -61,6 +61,11 @@
 
 	cmd = exec.Command("xcrun", "lipo", "-create")
 
+	modulesUsed, err := areGoModulesUsed()
+	if err != nil {
+		return err
+	}
+
 	for _, arch := range archs {
 		if err := writeGoMod("darwin", arch); err != nil {
 			return err
@@ -70,6 +75,15 @@
 		// Add the generated packages to GOPATH for reverse bindings.
 		gopath := fmt.Sprintf("GOPATH=%s%c%s", tmpdir, filepath.ListSeparator, goEnv("GOPATH"))
 		env = append(env, gopath)
+
+		// Run `go mod tidy` to force to create go.sum.
+		// Without go.sum, `go build` fails as of Go 1.16.
+		if modulesUsed {
+			if err := goModTidyAt(filepath.Join(tmpdir, "src"), env); err != nil {
+				return err
+			}
+		}
+
 		path, err := goIOSBindArchive(name, env, filepath.Join(tmpdir, "src"))
 		if err != nil {
 			return fmt.Errorf("darwin-%s: %v", arch, err)
@@ -145,11 +159,10 @@
 	if err := symlink("Versions/Current/Resources", buildO+"/Resources"); err != nil {
 		return err
 	}
-	err := writeFile(buildO+"/Resources/Info.plist", func(w io.Writer) error {
+	if err := writeFile(buildO+"/Resources/Info.plist", func(w io.Writer) error {
 		_, err := w.Write([]byte(iosBindInfoPlist))
 		return err
-	})
-	if err != nil {
+	}); err != nil {
 		return err
 	}
 
diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go
index 4a4c147..9a5ffa8 100644
--- a/cmd/gomobile/bind_test.go
+++ b/cmd/gomobile/bind_test.go
@@ -186,6 +186,7 @@
 WORK=$WORK
 GOOS=android CGO_ENABLED=1 gobind -lang=go,java -outdir=$WORK{{if .JavaPkg}} -javapkg={{.JavaPkg}}{{end}} golang.org/x/mobile/asset
 mkdir -p $WORK/src
+PWD=$WORK/src GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang++ CGO_ENABLED=1 GOARM=7 GOPATH=$WORK:$GOPATH go mod tidy
 PWD=$WORK/src GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/armv7a-linux-androideabi16-clang++ CGO_ENABLED=1 GOARM=7 GOPATH=$WORK:$GOPATH go build -x -buildmode=c-shared -o=$WORK/android/src/main/jniLibs/armeabi-v7a/libgojni.so ./gobind
 PWD=$WORK/java javac -d $WORK/javac-output -source 1.7 -target 1.7 -bootclasspath {{.AndroidPlatform}}/android.jar *.java
 jar c -C $WORK/javac-output .
diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go
index 4811ab7..072af00 100644
--- a/cmd/gomobile/build.go
+++ b/cmd/gomobile/build.go
@@ -329,6 +329,16 @@
 	return runCmd(cmd)
 }
 
+func goModTidyAt(at string, env []string) error {
+	cmd := exec.Command("go", "mod", "tidy")
+	if buildV {
+		cmd.Args = append(cmd.Args, "-v")
+	}
+	cmd.Env = append([]string{}, env...)
+	cmd.Dir = at
+	return runCmd(cmd)
+}
+
 func parseBuildTarget(buildTarget string) (os string, archs []string, _ error) {
 	if buildTarget == "" {
 		return "", nil, fmt.Errorf(`invalid target ""`)
diff --git a/go.sum b/go.sum
index 1143895..1bf420b 100644
--- a/go.sum
+++ b/go.sum
@@ -8,7 +8,6 @@
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mod v0.1.0 h1:sfUMP1Gu8qASkorDVjnMuvgJzwFbTZSeXFiGBYAVdl4=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd h1:ePuNC7PZ6O5BzgPn9bZayERXBdfZjUYoXEf5BTfDfh8=
@@ -22,7 +21,6 @@
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e h1:aZzprAO9/8oim3qStq3wc1Xuxx4QmAGriC4VU4ojemQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69 h1:yBHHx+XZqXJBm6Exke3N7V9gnlsyXxoCPEb1yVenjfk=
 golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=