mirror of
https://github.com/golang/go
synced 2024-11-25 04:57:56 -07:00
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 https://golang.org/cl/4121048
This commit is contained in:
parent
3f61184e1b
commit
ab15a978fb
@ -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"
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user