Commit ea9a08f5 by Ian Lance Taylor

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
parent 1279f21f
bc785455a35bfa7d4b0a66781c7c3ef08a24a845 372e75503c1dc9a38d9978aa6b67631283d5d6dd
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -86,11 +86,29 @@ func (f *File) DiscardCgoDirectives() { ...@@ -86,11 +86,29 @@ func (f *File) DiscardCgoDirectives() {
// addToFlag appends args to flag. All flags are later written out onto the // addToFlag appends args to flag. All flags are later written out onto the
// _cgo_flags file for the build system to use. // _cgo_flags file for the build system to use.
func (p *Package) addToFlag(flag string, args []string) { func (p *Package) addToFlag(flag string, args []string) {
p.CgoFlags[flag] = append(p.CgoFlags[flag], args...)
if flag == "CFLAGS" { 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...) 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 // splitQuoted splits the string s around each instance of one or more consecutive
......
...@@ -40,14 +40,19 @@ func (p *Package) writeDefs() { ...@@ -40,14 +40,19 @@ func (p *Package) writeDefs() {
var gccgoInit bytes.Buffer var gccgoInit bytes.Buffer
fflg := creat(*objDir + "_cgo_flags") fflg := creat(*objDir + "_cgo_flags")
var flags []string
for k, v := range p.CgoFlags { 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 { if k == "LDFLAGS" && !*gccgo {
for _, arg := range v { for _, arg := range v {
fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg) fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg)
} }
} }
} }
sort.Strings(flags)
for _, flag := range flags {
fmt.Fprintln(fflg, flag)
}
fflg.Close() fflg.Close()
// Write C main file for using gcc to resolve imports. // Write C main file for using gcc to resolve imports.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment