|  | #!/bin/sh | 
|  |  | 
|  | # Copyright 2016 The Go Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style | 
|  | # license that can be found in the LICENSE file. | 
|  |  | 
|  | # Given a source directory, returns the non-test Go files that should | 
|  | # be built for this target.  This implements Go's build constraints in | 
|  | # a shell script.  There is similar code in testsuite/gotest. | 
|  |  | 
|  | set -e | 
|  |  | 
|  | LANG=C | 
|  | LC_ALL=C | 
|  | LC_CTYPE=C | 
|  | export LANG LC_ALL LC_CTYPE | 
|  |  | 
|  | srcdir="" | 
|  | goarch="" | 
|  | goos="" | 
|  | extrafiles="" | 
|  | cmdlinetag="nosuchtag" | 
|  | cgotag="cgo" | 
|  |  | 
|  | for arg; do | 
|  | case "x$arg" in | 
|  | x--srcdir) | 
|  | srcdir=$2 | 
|  | shift | 
|  | shift | 
|  | ;; | 
|  | x--srcdir=*) | 
|  | srcdir=`echo $1 | sed -e 's/^--srcdir=//'` | 
|  | shift | 
|  | ;; | 
|  | x--goarch) | 
|  | goarch=$2 | 
|  | shift | 
|  | shift | 
|  | ;; | 
|  | x--goarch=*) | 
|  | goarch=`echo $1 | sed -e 's/^--goarch=//'` | 
|  | shift | 
|  | ;; | 
|  | x--goos) | 
|  | goos=$2 | 
|  | shift | 
|  | shift | 
|  | ;; | 
|  | x--goos=*) | 
|  | goos=`echo $1 | sed -e 's/^--goos=//'` | 
|  | shift | 
|  | ;; | 
|  | x--extrafiles) | 
|  | extrafiles=$2 | 
|  | shift | 
|  | shift | 
|  | ;; | 
|  | x--extrafiles=*) | 
|  | extrafiles=`echo $1 | sed -e 's/^--extrafiles=//'` | 
|  | shift | 
|  | ;; | 
|  | x--tag) | 
|  | cmdlinetag=$2 | 
|  | shift | 
|  | shift | 
|  | ;; | 
|  | x--tag=*) | 
|  | cmdlinetag=`echo $1 | sed -e 's/^--tag=//'` | 
|  | shift | 
|  | ;; | 
|  | x--nocgo) | 
|  | cgotag="nosuchtag" | 
|  | shift | 
|  | ;; | 
|  | *) | 
|  | echo 1>&2 "unknown argument $arg" | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | cd $srcdir | 
|  |  | 
|  | gofiles= | 
|  | for f in *.go; do | 
|  | case $f in | 
|  | *_test.go) | 
|  | ;; | 
|  | *.go) | 
|  | gofiles="$gofiles $f" | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | if test "$gofiles" = ""; then | 
|  | echo 1>&2 "no non-test .go files in $srcdir" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | matched= | 
|  | for f in $gofiles; do | 
|  | tag1=`echo $f | sed -e 's/^.*_\([^_]*\).go$/\1/'` | 
|  | tag2=`echo $f | sed -e 's/^.*_\([^_]*\)_[^_]*.go$/\1/'` | 
|  | if test x$tag1 = x$f; then | 
|  | tag1= | 
|  | fi | 
|  | if test x$tag2 = x$f; then | 
|  | tag2= | 
|  | fi | 
|  |  | 
|  | case "$tag1" in | 
|  | "") ;; | 
|  | $goarch) ;; | 
|  | $goos) ;; | 
|  | aix | android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows) | 
|  | tag1=nonmatchingtag | 
|  | ;; | 
|  | 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64) | 
|  | tag1=nonmatchingtag | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | case "$tag2" in | 
|  | "") ;; | 
|  | $goarch) ;; | 
|  | $goos) ;; | 
|  | aix | android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows) | 
|  | tag2=nonmatchingtag | 
|  | ;; | 
|  | 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64) | 
|  | tag2=nonmatchingtag | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then | 
|  | # Pipe through cat so that `set -e` doesn't affect fgrep. | 
|  | tags=`sed '/^package /q' < $f | grep '^// +build ' | cat` | 
|  | omatch=true | 
|  | first=true | 
|  | match=false | 
|  | for tag in $tags; do | 
|  | case $tag in | 
|  | "//") | 
|  | ;; | 
|  | "+build") | 
|  | if test "$first" = "true"; then | 
|  | first=false | 
|  | elif test "$match" = "false"; then | 
|  | omatch=false | 
|  | fi | 
|  | match=false | 
|  | ;; | 
|  | $goos | $goarch | $cgotag | $cmdlinetag | "gccgo") | 
|  | match=true | 
|  | ;; | 
|  | "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo") | 
|  | ;; | 
|  | *,*) | 
|  | cmatch=true | 
|  | for ctag in `echo $tag | sed -e 's/,/ /g'`; do | 
|  | case $ctag in | 
|  | $goos | $goarch | $cgotag | $cmdlinetag | "gccgo") | 
|  | ;; | 
|  | "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo") | 
|  | cmatch=false | 
|  | ;; | 
|  | "!"*) | 
|  | ;; | 
|  | *) | 
|  | cmatch=false | 
|  | ;; | 
|  | esac | 
|  | done | 
|  | if test "$cmatch" = "true"; then | 
|  | match=true | 
|  | fi | 
|  | ;; | 
|  | "!"*) | 
|  | match=true | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | if test "$match" = "false" -a "$first" = "false"; then | 
|  | omatch=false | 
|  | fi | 
|  |  | 
|  | if test "$omatch" = "true"; then | 
|  | matched="$matched $srcdir/$f" | 
|  | fi | 
|  | fi | 
|  | done | 
|  |  | 
|  | echo $matched $extrafiles | 
|  |  | 
|  | exit 0 |