cmd/cgo: make _cgo_flags consistent across runs
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 14 Jun 2017 13:59:02 +0000 (13:59 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 14 Jun 2017 13:59:02 +0000 (13:59 +0000)
    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

gcc/go/gofrontend/MERGE
libgo/go/cmd/cgo/gcc.go
libgo/go/cmd/cgo/out.go

index f1055bcb17d4f23baf98566b19fb5f406b02e460..1f600d3e312312e939c618acf0b3a3830544babd 100644 (file)
@@ -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.
index 5ea2d941ca2ea9f9609c2c3531f7373ebd31aeb4..028804e4ab1428a718d4fbbd76d4166b2a6754e6 100644 (file)
@@ -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
index e82ec375a274510a6f0d120b5b59e0a6daa59f19..a8292f22d3fea953bc2448d4bdcc681ebdfbb929 100644 (file)
@@ -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.