]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10] cmd/go: permit pkg-config flags in any argument position
authorIan Lance Taylor <iant@golang.org>
Sat, 17 Feb 2018 00:17:44 +0000 (16:17 -0800)
committerAndrew Bonventre <andybons@golang.org>
Thu, 29 Mar 2018 06:07:04 +0000 (06:07 +0000)
Fixes #23875

Change-Id: I503af71f44d11cd6b787fef100246b55735614a0
Reviewed-on: https://go-review.googlesource.com/94896
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-on: https://go-review.googlesource.com/102779
Run-TryBot: Andrew Bonventre <andybons@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/go_test.go
src/cmd/go/internal/work/exec.go

index 3972d79e3f627664c828b1c041c528e1168a4213..773b8240d27578519712a38d200dcf910babc3bc 100644 (file)
@@ -5888,3 +5888,36 @@ func TestBadCgoDirectives(t *testing.T) {
        tg.run("build", "-n", "x")
        tg.grepStderr("-D@foo", "did not find -D@foo in commands")
 }
+
+func TestTwoPkgConfigs(t *testing.T) {
+       if !canCgo {
+               t.Skip("no cgo")
+       }
+       if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
+               t.Skipf("no shell scripts on %s", runtime.GOOS)
+       }
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.parallel()
+       tg.tempFile("src/x/a.go", `package x
+               // #cgo pkg-config: --static a
+               import "C"
+       `)
+       tg.tempFile("src/x/b.go", `package x
+               // #cgo pkg-config: --static a
+               import "C"
+       `)
+       tg.tempFile("pkg-config.sh", `#!/bin/sh
+echo $* >>`+tg.path("pkg-config.out"))
+       tg.must(os.Chmod(tg.path("pkg-config.sh"), 0755))
+       tg.setenv("GOPATH", tg.path("."))
+       tg.setenv("PKG_CONFIG", tg.path("pkg-config.sh"))
+       tg.run("build", "x")
+       out, err := ioutil.ReadFile(tg.path("pkg-config.out"))
+       tg.must(err)
+       out = bytes.TrimSpace(out)
+       want := "--cflags --static --static -- a a\n--libs --static --static -- a a"
+       if !bytes.Equal(out, []byte(want)) {
+               t.Errorf("got %q want %q", out, want)
+       }
+}
index c4c1500eb2da9c2f6653403928eee3bb85e2a017..02981d7164e309b145142d2292946656eab13825 100644 (file)
@@ -934,11 +934,19 @@ func splitPkgConfigOutput(out []byte) []string {
 
 // Calls pkg-config if needed and returns the cflags/ldflags needed to build the package.
 func (b *Builder) getPkgConfigFlags(p *load.Package) (cflags, ldflags []string, err error) {
-       if pkgs := p.CgoPkgConfig; len(pkgs) > 0 {
+       if pcargs := p.CgoPkgConfig; len(pcargs) > 0 {
+               // pkg-config permits arguments to appear anywhere in
+               // the command line. Move them all to the front, before --.
                var pcflags []string
-               for len(pkgs) > 0 && strings.HasPrefix(pkgs[0], "--") {
-                       pcflags = append(pcflags, pkgs[0])
-                       pkgs = pkgs[1:]
+               var pkgs []string
+               for _, pcarg := range pcargs {
+                       if pcarg == "--" {
+                               // We're going to add our own "--" argument.
+                       } else if strings.HasPrefix(pcarg, "--") {
+                               pcflags = append(pcflags, pcarg)
+                       } else {
+                               pkgs = append(pkgs, pcarg)
+                       }
                }
                for _, pkg := range pkgs {
                        if !load.SafeArg(pkg) {