Skip to content

Commit

Permalink
cmd/dist, cmd/go: add environment variable override for pkg-config
Browse files Browse the repository at this point in the history
Allow overriding default name of `pkg-config` tool via environment
variable PKG_CONFIG (same as used by autoconf pkg.m4 macros). This
facilitates easy cross-compilation of cgo code.

Original patch against Go <= 1.4 was written by
xnox_canonical <dimitri.ledkov@canonical.com> in 2014.
Source: https://codereview.appspot.com/104960043/

Fixes #16253

Change-Id: I31c33ffc3ecbff65da31421e6188d092ab4fe7e4
Reviewed-on: https://go-review.googlesource.com/29991
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
  • Loading branch information
Boris Nagaev authored and ianlancetaylor committed Oct 3, 2016
1 parent 6c5e377 commit 5dcb31b
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 30 deletions.
2 changes: 2 additions & 0 deletions src/cmd/cgo/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ For example:
// #include <png.h>
import "C"
The default pkg-config tool may be changed by setting the PKG_CONFIG environment variable.
When building, the CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS, CGO_FFLAGS and
CGO_LDFLAGS environment variables are added to the flags derived from
these directives. Package-specific flags should be set using the
Expand Down
55 changes: 31 additions & 24 deletions src/cmd/dist/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,31 @@ import (

// The usual variables.
var (
goarch string
gobin string
gohostarch string
gohostos string
goos string
goarm string
go386 string
goroot string
goroot_final string
goextlinkenabled string
gogcflags string // For running built compiler
workdir string
tooldir string
oldgoos string
oldgoarch string
slash string
exe string
defaultcc string
defaultcflags string
defaultldflags string
defaultcxxtarget string
defaultcctarget string
rebuildall bool
defaultclang bool
goarch string
gobin string
gohostarch string
gohostos string
goos string
goarm string
go386 string
goroot string
goroot_final string
goextlinkenabled string
gogcflags string // For running built compiler
workdir string
tooldir string
oldgoos string
oldgoarch string
slash string
exe string
defaultcc string
defaultcflags string
defaultldflags string
defaultcxxtarget string
defaultcctarget string
defaultpkgconfigtarget string
rebuildall bool
defaultclang bool

vflag int // verbosity
)
Expand Down Expand Up @@ -208,6 +209,12 @@ func xinit() {
}
defaultcxxtarget = b

b = os.Getenv("PKG_CONFIG")
if b == "" {
b = "pkg-config"
}
defaultpkgconfigtarget = b

// For tools being invoked but also for os.ExpandEnv.
os.Setenv("GO386", go386)
os.Setenv("GOARCH", goarch)
Expand Down
6 changes: 4 additions & 2 deletions src/cmd/dist/buildgo.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
// package main
// const defaultCC = <defaultcc>
// const defaultCXX = <defaultcxx>
// const defaultPkgConfig = <defaultpkgconfig>
//
// It is invoked to write cmd/go/zdefaultcc.go
// but we also write cmd/cgo/zdefaultcc.go
Expand All @@ -29,8 +30,9 @@ func mkzdefaultcc(dir, file string) {
"package main\n"+
"\n"+
"const defaultCC = `%s`\n"+
"const defaultCXX = `%s`\n",
defaultcctarget, defaultcxxtarget)
"const defaultCXX = `%s`\n"+
"const defaultPkgConfig = `%s`\n",
defaultcctarget, defaultcxxtarget, defaultpkgconfigtarget)

writefile(out, file, writeSkipSame)

Expand Down
2 changes: 2 additions & 0 deletions src/cmd/go/alldocs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,8 @@
// Flags that cgo will pass to the compiler when linking.
// CXX
// The command to use to compile C++ code.
// PKG_CONFIG
// Path to pkg-config tool.
//
// Architecture-specific environment variables:
//
Expand Down
14 changes: 10 additions & 4 deletions src/cmd/go/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -1624,23 +1624,29 @@ func (b *builder) build(a *action) (err error) {
return nil
}

// pkgconfigCmd returns a pkg-config binary name
// defaultPkgConfig is defined in zdefaultcc.go, written by cmd/dist.
func (b *builder) pkgconfigCmd() string {
return envList("PKG_CONFIG", defaultPkgConfig)[0]
}

// Calls pkg-config if needed and returns the cflags/ldflags needed to build the package.
func (b *builder) getPkgConfigFlags(p *Package) (cflags, ldflags []string, err error) {
if pkgs := p.CgoPkgConfig; len(pkgs) > 0 {
var out []byte
out, err = b.runOut(p.Dir, p.ImportPath, nil, "pkg-config", "--cflags", pkgs)
out, err = b.runOut(p.Dir, p.ImportPath, nil, b.pkgconfigCmd(), "--cflags", pkgs)
if err != nil {
b.showOutput(p.Dir, "pkg-config --cflags "+strings.Join(pkgs, " "), string(out))
b.showOutput(p.Dir, b.pkgconfigCmd()+" --cflags "+strings.Join(pkgs, " "), string(out))
b.print(err.Error() + "\n")
err = errPrintedOutput
return
}
if len(out) > 0 {
cflags = strings.Fields(string(out))
}
out, err = b.runOut(p.Dir, p.ImportPath, nil, "pkg-config", "--libs", pkgs)
out, err = b.runOut(p.Dir, p.ImportPath, nil, b.pkgconfigCmd(), "--libs", pkgs)
if err != nil {
b.showOutput(p.Dir, "pkg-config --libs "+strings.Join(pkgs, " "), string(out))
b.showOutput(p.Dir, b.pkgconfigCmd()+" --libs "+strings.Join(pkgs, " "), string(out))
b.print(err.Error() + "\n")
err = errPrintedOutput
return
Expand Down
2 changes: 2 additions & 0 deletions src/cmd/go/help.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,8 @@ Environment variables for use with cgo:
Flags that cgo will pass to the compiler when linking.
CXX
The command to use to compile C++ code.
PKG_CONFIG
Path to pkg-config tool.
Architecture-specific environment variables:
Expand Down
2 changes: 2 additions & 0 deletions src/make.bash
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
# FC: Command line to run to compile Fortran code for GOARCH.
# This is used by cgo. Default is "gfortran".
#
# PKG_CONFIG: Path to pkg-config tool. Default is "pkg-config".
#
# GO_DISTFLAGS: extra flags to provide to "dist bootstrap".

set -e
Expand Down

0 comments on commit 5dcb31b

Please sign in to comment.