]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: os/arch dependent #cgo directives
authorGustavo Niemeyer <gustavo@niemeyer.net>
Thu, 3 Feb 2011 18:51:47 +0000 (13:51 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 3 Feb 2011 18:51:47 +0000 (13:51 -0500)
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
https://golang.org/cl/4121048

src/cmd/cgo/doc.go
src/cmd/cgo/gcc.go

index c4868345ca84bfb9364081e14ee9948b68305ec8..b3aa9aded29e2090689c6e562479f6400e93d23a 100644 (file)
@@ -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"
index 9754c1d5652ceacb742640f6d591f71d0c03c9fc..7a022055cfeb6ce6f14ba59a7335f24fcac467aa 100644 (file)
@@ -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())