cmd/gomobile: enable Cgo

This CL gives CGO_ENABLED=1 explicitly when executing gobind since
Cgo is disabled by default when GOOS is given.

This CL also adds importing C to the tests to confirm that Cgo
works correctly.

This CL also updates go.mod since this change requries the change
in go/packages: golang.org/cl/214943

Updates golang/go#27234
Updates golang/go#36547

Change-Id: I66f9697f992f15b52fca7871e4e0ed64ca2b4965
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/214498
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/bind/testdata/cgopkg/cgopkg.go b/bind/testdata/cgopkg/cgopkg.go
index 567bba4..efef3da 100644
--- a/bind/testdata/cgopkg/cgopkg.go
+++ b/bind/testdata/cgopkg/cgopkg.go
@@ -1,5 +1,7 @@
 package cgopkg
 
+import "C"
+
 import (
 	_ "golang.org/x/mobile/gl"
 )
diff --git a/cmd/gobind/gobind_test.go b/cmd/gobind/gobind_test.go
index c31fce2..4a433dd 100644
--- a/cmd/gobind/gobind_test.go
+++ b/cmd/gobind/gobind_test.go
@@ -94,7 +94,8 @@
 	cmd.Dir = exported.Config.Dir
 	cmd.Env = exported.Config.Env
 	if goos != "" {
-		cmd.Env = append(cmd.Env, "GOOS="+goos)
+		// Add CGO_ENABLED=1 explicitly since Cgo is disabled when GOOS is different from host OS.
+		cmd.Env = append(cmd.Env, "GOOS="+goos, "CGO_ENABLED=1")
 	}
 	if out, err := cmd.CombinedOutput(); err != nil {
 		var cmd string
diff --git a/cmd/gobind/main.go b/cmd/gobind/main.go
index 530032f..8ccb995 100644
--- a/cmd/gobind/main.go
+++ b/cmd/gobind/main.go
@@ -52,6 +52,9 @@
 		langs = []string{"go", "java", "objc"}
 	}
 
+	// We need to give appropriate environment variables like CC or CXX so that the returned packages no longer have errors.
+	// However, getting such environment variables is difficult or impossible so far.
+	// Gomobile can obtain such environment variables in env.go, but this logic assumes some condiitons gobind doesn't assume.
 	cfg := &packages.Config{
 		Mode: packages.NeedName | packages.NeedFiles |
 			packages.NeedImports | packages.NeedDeps |
@@ -143,10 +146,8 @@
 	typePkgs := make([]*types.Package, len(allPkg))
 	astPkgs := make([][]*ast.File, len(allPkg))
 	for i, pkg := range allPkg {
-		if len(pkg.Errors) > 0 {
-			errorf("%v", pkg.Errors)
-			return
-		}
+		// Ignore pkg.Errors. pkg.Errors can exist when Cgo is used, but this should not affect the result.
+		// See the discussion at golang/go#36547.
 		typePkgs[i] = pkg.Types
 		astPkgs[i] = pkg.Syntax
 	}
diff --git a/cmd/gomobile/bind.go b/cmd/gomobile/bind.go
index 5a74d93..741f72c 100644
--- a/cmd/gomobile/bind.go
+++ b/cmd/gomobile/bind.go
@@ -214,7 +214,8 @@
 
 func packagesConfig(targetOS string) *packages.Config {
 	config := &packages.Config{}
-	config.Env = append(os.Environ(), "GOARCH=arm", "GOOS="+targetOS)
+	// Add CGO_ENABLED=1 explicitly since Cgo is disabled when GOOS is different from host OS.
+	config.Env = append(os.Environ(), "GOARCH=arm", "GOOS="+targetOS, "CGO_ENABLED=1")
 	tags := buildTags
 	if targetOS == "darwin" {
 		tags = append(tags, "ios")
diff --git a/go.mod b/go.mod
index 807e703..2a2408c 100644
--- a/go.mod
+++ b/go.mod
@@ -6,5 +6,5 @@
 	golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56
 	golang.org/x/image v0.0.0-20190802002840-cff245a6509b
 	golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd
-	golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e
+	golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69
 )
diff --git a/go.sum b/go.sum
index c387242..1143895 100644
--- a/go.sum
+++ b/go.sum
@@ -10,6 +10,7 @@
 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=
 golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -23,6 +24,8 @@
 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=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=