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.
Change-Id: I82afd2837d2ac7ca00660cf967d1b31b07d4916c
Reviewed-on: https://go-review.googlesource.com/45692
Reviewed-by: Than McIntosh <thanm@google.com>
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 @@
// 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 @@
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.