| From 4759221d46b1666de96b8047cec3160bfe4d3d5d Mon Sep 17 00:00:00 2001 |
| From: Ian Lance Taylor <iant@golang.org> |
| Date: Fri, 13 Nov 2020 11:05:37 -0800 |
| Subject: [PATCH] cmd/go: permit CGO_LDFLAGS to appear in //go:ldflag |
| |
| Fixes #42565 |
| |
| Upstream-Status: Backport [https://github.com/golang/go/commit/782cf560db4c919790fdb476d1bbe18e5ddf5ffd] |
| Change-Id: If7cf39905d124dbd54dfac6a53ee38270498efed |
| Reviewed-on: https://go-review.googlesource.com/c/go/+/269818 |
| Trust: Ian Lance Taylor <iant@golang.org> |
| Run-TryBot: Ian Lance Taylor <iant@golang.org> |
| TryBot-Result: Go Bot <gobot@golang.org> |
| Reviewed-by: Jay Conrod <jayconrod@google.com> |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| --- |
| src/cmd/go/internal/work/exec.go | 15 +++++++++ |
| src/cmd/go/testdata/script/ldflag.txt | 44 +++++++++++++++++++++++++++ |
| 2 files changed, 59 insertions(+) |
| create mode 100644 src/cmd/go/testdata/script/ldflag.txt |
| |
| diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go |
| index 575a2df..9209e3d 100644 |
| --- a/src/cmd/go/internal/work/exec.go |
| +++ b/src/cmd/go/internal/work/exec.go |
| @@ -2821,6 +2821,21 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo |
| idx = bytes.Index(src, []byte(cgoLdflag)) |
| } |
| } |
| + |
| + // We expect to find the contents of cgoLDFLAGS in flags. |
| + if len(cgoLDFLAGS) > 0 { |
| + outer: |
| + for i := range flags { |
| + for j, f := range cgoLDFLAGS { |
| + if f != flags[i+j] { |
| + continue outer |
| + } |
| + } |
| + flags = append(flags[:i], flags[i+len(cgoLDFLAGS):]...) |
| + break |
| + } |
| + } |
| + |
| if err := checkLinkerFlags("LDFLAGS", "go:cgo_ldflag", flags); err != nil { |
| return nil, nil, err |
| } |
| diff --git a/src/cmd/go/testdata/script/ldflag.txt b/src/cmd/go/testdata/script/ldflag.txt |
| new file mode 100644 |
| index 0000000..6ceb33b |
| --- /dev/null |
| +++ b/src/cmd/go/testdata/script/ldflag.txt |
| @@ -0,0 +1,44 @@ |
| +# Issue #42565 |
| + |
| +[!cgo] skip |
| + |
| +# We can't build package bad, which uses #cgo LDFLAGS. |
| +cd bad |
| +! go build |
| +stderr no-such-warning |
| + |
| +# We can build package ok with the same flags in CGO_LDFLAGS. |
| +env CGO_LDFLAGS=-Wno-such-warning -Wno-unknown-warning-option |
| +cd ../ok |
| +go build |
| + |
| +# Build a main program that actually uses LDFLAGS. |
| +cd .. |
| +go build -ldflags=-v |
| + |
| +# Because we passed -v the Go linker should print the external linker |
| +# command which should include the flag we passed in CGO_LDFLAGS. |
| +stderr no-such-warning |
| + |
| +-- go.mod -- |
| +module ldflag |
| + |
| +-- bad/bad.go -- |
| +package bad |
| + |
| +// #cgo LDFLAGS: -Wno-such-warning -Wno-unknown-warning |
| +import "C" |
| + |
| +func F() {} |
| +-- ok/ok.go -- |
| +package ok |
| + |
| +import "C" |
| + |
| +func F() {} |
| +-- main.go -- |
| +package main |
| + |
| +import _ "ldflag/ok" |
| + |
| +func main() {} |
| -- |
| 2.29.2 |
| |