|  | // Copyright 2013 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package cgo | 
|  |  | 
|  | import ( | 
|  | "errors" | 
|  | "fmt" | 
|  | "go/build" | 
|  | "os/exec" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | // pkgConfig runs pkg-config with the specified arguments and returns the flags it prints. | 
|  | func pkgConfig(mode string, pkgs []string) (flags []string, err error) { | 
|  | cmd := exec.Command("pkg-config", append([]string{mode}, pkgs...)...) | 
|  | out, err := cmd.CombinedOutput() | 
|  | if err != nil { | 
|  | s := fmt.Sprintf("%s failed: %v", strings.Join(cmd.Args, " "), err) | 
|  | if len(out) > 0 { | 
|  | s = fmt.Sprintf("%s: %s", s, out) | 
|  | } | 
|  | return nil, errors.New(s) | 
|  | } | 
|  | if len(out) > 0 { | 
|  | flags = strings.Fields(string(out)) | 
|  | } | 
|  | return | 
|  | } | 
|  |  | 
|  | // pkgConfigFlags calls pkg-config if needed and returns the cflags | 
|  | // needed to build the package. | 
|  | func pkgConfigFlags(p *build.Package) (cflags []string, err error) { | 
|  | if len(p.CgoPkgConfig) == 0 { | 
|  | return nil, nil | 
|  | } | 
|  | return pkgConfig("--cflags", p.CgoPkgConfig) | 
|  | } |