diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-06-14 13:59:02 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-06-14 13:59:02 +0000 |
commit | ea9a08f5dfbab28de2eabfeb684b42c0615cd99d (patch) | |
tree | 6ce4306631e5e2799767b4aab2de1bd3f442eb58 | |
parent | 1279f21fc520cc8c91ef4dd3a8938b7aa256d799 (diff) | |
download | gcc-ea9a08f5dfbab28de2eabfeb684b42c0615cd99d.zip gcc-ea9a08f5dfbab28de2eabfeb684b42c0615cd99d.tar.gz gcc-ea9a08f5dfbab28de2eabfeb684b42c0615cd99d.tar.bz2 |
cmd/cgo: make _cgo_flags consistent across runs
The go tool will pass -I objdir as one of the flags, where objdir is
the temporary build directory. Remove that from _cgo_flags: we don't
need it, and it will be different each time.
Sort the flags to avoid the unpredictable map iteration order.
This matters for gccgo because for a package that uses cgo, the go
tool when building for gccgo will store the _cgo_flags file in the
archive. That means that we want to generate identical _cgo_flags for
every run.
The test for this is the cmd/go testsuite, to follow in a future CL.
Reviewed-on: https://go-review.googlesource.com/45692
From-SVN: r249199
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | libgo/go/cmd/cgo/gcc.go | 22 | ||||
-rw-r--r-- | libgo/go/cmd/cgo/out.go | 7 |
3 files changed, 27 insertions, 4 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index f1055bc..1f600d3 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -bc785455a35bfa7d4b0a66781c7c3ef08a24a845 +372e75503c1dc9a38d9978aa6b67631283d5d6dd The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/go/cmd/cgo/gcc.go b/libgo/go/cmd/cgo/gcc.go index 5ea2d94..028804e 100644 --- a/libgo/go/cmd/cgo/gcc.go +++ b/libgo/go/cmd/cgo/gcc.go @@ -86,11 +86,29 @@ func (f *File) DiscardCgoDirectives() { // addToFlag appends args to flag. All flags are later written out onto the // _cgo_flags file for the build system to use. func (p *Package) addToFlag(flag string, args []string) { - p.CgoFlags[flag] = append(p.CgoFlags[flag], args...) if flag == "CFLAGS" { - // We'll also need these when preprocessing for dwarf information. + // We'll need these when preprocessing for dwarf information. p.GccOptions = append(p.GccOptions, args...) } + + skip := false + for i, arg := range args { + // The go tool will pass us a -I option pointing to objdir; + // we don't need to record that for later, as the objdir + // will disappear anyhow. + if skip { + // Discard argument in "-I objdir" case. + skip = false + } else if strings.HasPrefix(arg, "-I") && strings.HasPrefix(arg[2:], *objDir) { + // This is -Iobjdir. Don't save this argument. + } else if arg == "-I" && i+1 < len(args) && strings.HasPrefix(args[i+1], *objDir) { + // This is -I objdir. Don't save this argument + // or the next one. + skip = true + } else { + p.CgoFlags[flag] = append(p.CgoFlags[flag], arg) + } + } } // splitQuoted splits the string s around each instance of one or more consecutive diff --git a/libgo/go/cmd/cgo/out.go b/libgo/go/cmd/cgo/out.go index e82ec37..a8292f2 100644 --- a/libgo/go/cmd/cgo/out.go +++ b/libgo/go/cmd/cgo/out.go @@ -40,14 +40,19 @@ func (p *Package) writeDefs() { var gccgoInit bytes.Buffer fflg := creat(*objDir + "_cgo_flags") + var flags []string for k, v := range p.CgoFlags { - fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, strings.Join(v, " ")) + flags = append(flags, fmt.Sprintf("_CGO_%s=%s", k, strings.Join(v, " "))) if k == "LDFLAGS" && !*gccgo { for _, arg := range v { fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg) } } } + sort.Strings(flags) + for _, flag := range flags { + fmt.Fprintln(fflg, flag) + } fflg.Close() // Write C main file for using gcc to resolve imports. |