]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.9] 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:06:08 +0000 (06:06 +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/103155
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/build.go

index 28c2bc147ac24cee6b899a9a6ed76d2f36cba53d..03d29609a9e86b699abe42a07cd36cef53d14306 100644 (file)
@@ -4496,3 +4496,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 23946e466b9ab21a7316975ba7353f589d6a14b0..e93162910553593e0a90fc77ae48622337a6e34e 100644 (file)
@@ -1525,11 +1525,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) {