summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2011-02-03 13:51:47 -0500
committerGustavo Niemeyer <gustavo@niemeyer.net>2011-02-03 13:51:47 -0500
commit2d5fe0b4bb5a8ec588287bb29fee592ba32102fd (patch)
tree6dfecc7f0f2bc55661d89061f90ef0f92e6c959d /src
parentb844793155965a73646513b5bdef0276e4f25877 (diff)
downloadgo-2d5fe0b4bb5a8ec588287bb29fee592ba32102fd.tar.gz
cgo: os/arch dependent #cgo directives
This enables #cgo directives to contain a os/arch specification which restricts the definition of the given option to matching systems. For example: #cgo amd64 CFLAGS: -DAMD64=1 #cgo linux CFLAGS: -DLINUX=1 #cgo linux/amd64 CFLAGS: -DLINUX_ON_AMD64=1 R=rsc CC=golang-dev http://codereview.appspot.com/4121048 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/cgo/doc.go5
-rw-r--r--src/cmd/cgo/gcc.go25
2 files changed, 27 insertions, 3 deletions
diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index c4868345c..b3aa9aded 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -25,9 +25,12 @@ the package. For example:
CFLAGS and LDFLAGS may be defined with pseudo #cgo directives
within these comments to tweak the behavior of gcc. Values defined
-in multiple directives are concatenated together. For example:
+in multiple directives are concatenated together. Options prefixed
+by $GOOS, $GOARCH, or $GOOS/$GOARCH are only defined in matching
+systems. For example:
// #cgo CFLAGS: -DPNG_DEBUG=1
+ // #cgo linux CFLAGS: -DLINUX=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 9754c1d56..7a022055c 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -19,6 +19,7 @@ import (
"go/parser"
"go/token"
"os"
+ "runtime"
"strconv"
"strings"
"unicode"
@@ -66,6 +67,8 @@ func cname(s string) string {
func (p *Package) ParseFlags(f *File, srcfile string) {
linesIn := strings.Split(f.Preamble, "\n", -1)
linesOut := make([]string, 0, len(linesIn))
+
+NextLine:
for _, line := range linesIn {
l := strings.TrimSpace(line)
if len(l) < 5 || l[:4] != "#cgo" || !unicode.IsSpace(int(l[4])) {
@@ -79,11 +82,29 @@ func (p *Package) ParseFlags(f *File, srcfile string) {
fatal("%s: bad #cgo line: %s", srcfile, line)
}
- k := fields[0]
- v := strings.TrimSpace(fields[1])
+ var k string
+ kf := strings.Fields(fields[0])
+ switch len(kf) {
+ case 1:
+ k = kf[0]
+ case 2:
+ k = kf[1]
+ switch kf[0] {
+ case runtime.GOOS:
+ case runtime.GOARCH:
+ case runtime.GOOS + "/" + runtime.GOARCH:
+ default:
+ continue NextLine
+ }
+ default:
+ fatal("%s: bad #cgo option: %s", srcfile, fields[0])
+ }
+
if k != "CFLAGS" && k != "LDFLAGS" {
fatal("%s: unsupported #cgo option %s", srcfile, k)
}
+
+ v := strings.TrimSpace(fields[1])
args, err := splitQuoted(v)
if err != nil {
fatal("%s: bad #cgo option %s: %s", srcfile, k, err.String())