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  }