github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/apps/pkg-config/main.go (about) 1 // Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // pkg-config for cgo. 6 package main 7 8 import ( 9 "io/ioutil" 10 "os" 11 "path/filepath" 12 "regexp" 13 "strings" 14 ) 15 16 func flags(root, pkg, name string) string { 17 f, e := os.Open(filepath.Join(root, pkg+".pc")) 18 if e != nil { 19 println(e.Error()) 20 return "" 21 } 22 defer f.Close() 23 b, e := ioutil.ReadAll(f) 24 if e != nil { 25 println(e.Error()) 26 return "" 27 } 28 re := regexp.MustCompile(`^(\w+)=(.*)$`) 29 vv := make(map[string]string) 30 for _, l := range strings.Split(string(b), "\n") { 31 m := re.FindStringSubmatch(l) 32 if m != nil && len(m) == 3 { 33 key, val := m[1], m[2] 34 for k, v := range vv { 35 val = strings.Replace(val, "${"+k+"}", v, -1) 36 } 37 vv[key] = val 38 continue 39 } 40 if strings.HasPrefix(l, name+":") { 41 val := strings.TrimSpace(l[len(name)+1:]) 42 for k, v := range vv { 43 val = strings.Replace(val, "${"+k+"}", v, -1) 44 } 45 return val 46 } 47 } 48 return "" 49 } 50 51 func main() { 52 root := os.Getenv("PKG_CONFIG_PATH") 53 if len(root) == 0 { 54 println("PKG_CONFIG_PATH is not set.") 55 os.Exit(1) 56 } 57 58 var pkgs []string 59 var fcflags, flibs bool 60 for _, arg := range os.Args[1:] { 61 if len(arg) < 2 || arg[:2] != "--" { 62 pkgs = append(pkgs, arg) 63 } else { 64 if arg == "--cflags" { 65 fcflags = true 66 } else if arg == "--libs" { 67 flibs = true 68 } else { 69 println("invalid argument:", arg) 70 os.Exit(2) 71 } 72 } 73 } 74 75 r := "" 76 if fcflags { 77 for _, pkg := range pkgs { 78 r += " " + flags(root, pkg, "Cflags") 79 } 80 } 81 if flibs { 82 for _, pkg := range pkgs { 83 r += " " + flags(root, pkg, "Libs") 84 } 85 } 86 println(r) 87 }