1
0
mirror of https://github.com/golang/go synced 2024-11-17 04:04:46 -07:00

cmd/go: make go line declare minimum required Go version

For #57001, enforce the go line as declaring the minimum required
version of Go that can compile a module.

Modules that maintain compatibility with old versions of Go
but want to make use of new features in //go:build-constrained files
will be able to do so: the //go:build constraint will be interpreted
as changing the minimum Go version for that file and will unlock
the Go features allowed in that version.

Change-Id: Ibeeb7c93ce7ea2e5187d78af0757cbfac19484a0
Reviewed-on: https://go-review.googlesource.com/c/go/+/476279
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Russ Cox <rsc@golang.org>
Auto-Submit: Russ Cox <rsc@golang.org>
This commit is contained in:
Russ Cox 2023-03-13 13:22:34 -04:00 committed by Gopher Robot
parent 804d786a30
commit 4bd20ec884
2 changed files with 10 additions and 96 deletions

View File

@ -532,6 +532,10 @@ func (b *Builder) build(ctx context.Context, a *Action) (err error) {
return errors.New("binary-only packages are no longer supported")
}
if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
return errors.New("module requires Go " + p.Module.GoVersion + " or later")
}
if err := b.checkDirectives(a); err != nil {
return err
}
@ -853,10 +857,6 @@ OverlayLoop:
ofile, out, err := BuildToolchain.gc(b, a, objpkg, icfg.Bytes(), embedcfg, symabis, len(sfiles) > 0, gofiles)
if len(out) > 0 {
output := b.processOutput(out)
if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
output += "note: module requires Go " + p.Module.GoVersion + "\n"
}
if err != nil {
return formatOutput(b.WorkDir, p.Dir, p.ImportPath, p.Desc(), output)
} else {
@ -864,9 +864,6 @@ OverlayLoop:
}
}
if err != nil {
if p.Module != nil && !allowedVersion(p.Module.GoVersion) {
b.showOutput(a, p.Dir, p.Desc(), "note: module requires Go "+p.Module.GoVersion+"\n")
}
return err
}
if ofile != objpkg {

View File

@ -3,40 +3,17 @@
env GO111MODULE=on
go list
go build
go build sub.1
go build subver.1
! stderr 'module requires'
! go build badsub.1
stderr '^note: module requires Go 1.11111$'
go build versioned.1
go mod edit -require versioned.1@v1.1.0
! go build versioned.1
stderr '^note: module requires Go 1.99999$'
[short] stop
# The message should be printed even if the compiler emits no output.
go build -o $WORK/nooutput.exe nooutput.go
! go build -toolexec=$WORK/nooutput.exe versioned.1
stderr '^# versioned.1\nnote: module requires Go 1.99999$'
! go build sub
stderr '^sub: module requires Go 1.999 or later$'
-- go.mod --
module m
go 1.999
go 1.1
require (
sub.1 v1.0.0
subver.1 v1.0.0
badsub.1 v1.0.0
versioned.1 v1.0.0
sub v1.0.0
)
replace (
sub.1 => ./sub
subver.1 => ./subver
badsub.1 => ./badsub
versioned.1 v1.0.0 => ./versioned1
versioned.1 v1.1.0 => ./versioned2
sub => ./sub
)
-- x.go --
@ -44,67 +21,7 @@ package x
-- sub/go.mod --
module m
go 1.11
go 1.999
-- sub/x.go --
package x
-- subver/go.mod --
module m
go 1.11111
-- subver/x.go --
package x
-- badsub/go.mod --
module m
go 1.11111
-- badsub/x.go --
package x
invalid syntax
-- versioned1/go.mod --
module versioned
go 1.0
-- versioned1/x.go --
package x
-- versioned2/go.mod --
module versioned
go 1.99999
-- versioned2/x.go --
package x
invalid syntax
-- nooutput.go --
// +build ignore
package main
import (
"bytes"
"os"
"os/exec"
"strings"
)
func main() {
stderr := new(bytes.Buffer)
stdout := new(bytes.Buffer)
cmd := exec.Command(os.Args[1], os.Args[2:]...)
cmd.Stderr = stderr
cmd.Stdout = stdout
err := cmd.Run()
if strings.HasPrefix(os.Args[2], "-V") {
os.Stderr.Write(stderr.Bytes())
os.Stdout.Write(stdout.Bytes())
}
if err != nil {
os.Exit(1)
}
}