From 48ec5122ff439ae2c8619fb29a82339555403a9f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Sun, 24 Sep 2017 11:16:52 +0100 Subject: [PATCH] cmd/go: move GOOS/GOARCH and tags checks to Init MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit They were in Do, which is the method that actually starts the build. However, we can already run these checks in Init, since we already have all the information necessary to do the checks. More importantly, some work happens between Init and Do, namely package loading. That may exit with an error, meaning that in some cases the user gets a confusing error instead of the correct one. For example, using a GOOS typo, before showed: $ GOOS=windwos go build can't load package: package p: build constraints exclude all Go files in ... And now: $ GOOS=windwos go build cmd/go: unsupported GOOS/GOARCH pair windwos/amd64 Also had to tweak TestGoEnv to modify GOOS as well as GOARCH. Otherwise, on windows this would result in the invalid GOOS/GOARCH pair windows/arm, which would error given that we now check that in non-build commands such as "go env". Fixes #21999. Change-Id: Iff9890dea472bff0179a9d703d6f698a0e3187c1 Reviewed-on: https://go-review.googlesource.com/65656 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: David Crawshaw --- src/cmd/go/go_test.go | 10 ++++++++++ src/cmd/go/internal/work/build.go | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 2145ffb275..08b3cd0e6a 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -3820,6 +3820,7 @@ func TestGoEnv(t *testing.T) { tg := testgo(t) tg.parallel() defer tg.cleanup() + tg.setenv("GOOS", "freebsd") // to avoid invalid pair errors tg.setenv("GOARCH", "arm") tg.run("env", "GOARCH") tg.grepStdout("^arm$", "GOARCH not honored") @@ -4589,3 +4590,12 @@ func TestParallelNumber(t *testing.T) { }) } } + +func TestWrongGOOSErrorBeforeLoadError(t *testing.T) { + tg := testgo(t) + defer tg.cleanup() + tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata")) + tg.setenv("GOOS", "windwos") + tg.runFail("build", "exclude") + tg.grepStderr("unsupported GOOS/GOARCH pair", "GOOS=windwos go build exclude did not report 'unsupported GOOS/GOARCH pair'") +} diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 62ae7ef2bf..031c92e7f9 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -733,6 +733,17 @@ func (b *Builder) Init() { base.AtExit(func() { os.RemoveAll(workdir) }) } } + + if _, ok := cfg.OSArchSupportsCgo[cfg.Goos+"/"+cfg.Goarch]; !ok && cfg.BuildContext.Compiler == "gc" { + fmt.Fprintf(os.Stderr, "cmd/go: unsupported GOOS/GOARCH pair %s/%s\n", cfg.Goos, cfg.Goarch) + os.Exit(2) + } + for _, tag := range cfg.BuildContext.BuildTags { + if strings.Contains(tag, ",") { + fmt.Fprintf(os.Stderr, "cmd/go: -tags space-separated list contains comma\n") + os.Exit(2) + } + } } // readpkglist returns the list of packages that were built into the shared library @@ -1104,17 +1115,6 @@ func allArchiveActions(root *Action) []*Action { // do runs the action graph rooted at root. func (b *Builder) Do(root *Action) { - if _, ok := cfg.OSArchSupportsCgo[cfg.Goos+"/"+cfg.Goarch]; !ok && cfg.BuildContext.Compiler == "gc" { - fmt.Fprintf(os.Stderr, "cmd/go: unsupported GOOS/GOARCH pair %s/%s\n", cfg.Goos, cfg.Goarch) - os.Exit(2) - } - for _, tag := range cfg.BuildContext.BuildTags { - if strings.Contains(tag, ",") { - fmt.Fprintf(os.Stderr, "cmd/go: -tags space-separated list contains comma\n") - os.Exit(2) - } - } - // Build list of all actions, assigning depth-first post-order priority. // The original implementation here was a true queue // (using a channel) but it had the effect of getting -- 2.48.1