123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- #!/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
- gobuild() {
- line=$(echo "$1" | sed -e 's|//go:build ||')
- line=$(echo "$line" | sed -e 's/go1\.[0-9]\+/1/g' -e 's/goexperiment\./goexperiment/')
- line=" $line "
- wrap='[ ()!&|]'
- for ones in $goarch $goos $cgotag $cmdlinetag gccgo goexperimentfieldtrack; do
- line=$(echo "$line" | sed -e "s/\\(${wrap}\\)${ones}\\(${wrap}\\)/"'\11\2/g')
- done
- # 386 is a special case since it looks like a number to the shell.
- # We need it to be 0 if it's not $goarch.
- if test "$goarch" != "386"; then
- line=$(echo "$line" | sed -e "s/\\(${wrap}\\)386\\(${wrap}\\)/\10\2/g")
- fi
- (($line))
- }
- 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 | illumos | hurd | ios | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows | zos)
- tag1=nonmatchingtag
- ;;
- 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
- tag1=nonmatchingtag
- ;;
- *)
- # File name like x_amd64_random.go, where tag1=random.
- # Don't match based on tag2.
- tag2=
- ;;
- esac
- case "$tag2" in
- "") ;;
- $goarch) ;;
- $goos) ;;
- aix | android | darwin | dragonfly | freebsd | hurd | ios | illumos | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows | zos)
- tag2=nonmatchingtag
- ;;
- 386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
- tag2=nonmatchingtag
- ;;
- esac
- if test x$tag1 = xnonmatchingtag -o x$tag2 = xnonmatchingtag; then
- continue
- fi
- # Check for go:build line
- build=$(sed '/^package /q' < $f | grep '^//go:build ' | cat)
- if test -n "$build"; then
- if $(gobuild "$build"); then
- matched="$matched $srcdir/$f"
- fi
- continue
- fi
- # No go:build line, check for +build lines.
- # 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" | "//+build")
- if test "$first" = "true"; then
- first=false
- elif test "$match" = "false"; then
- omatch=false
- fi
- match=false
- ;;
- $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9])
- match=true
- ;;
- "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7])
- ;;
- *,*)
- cmatch=true
- for ctag in `echo $tag | sed -e 's/,/ /g'`; do
- case $ctag in
- $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9])
- ;;
- "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7])
- 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
- done
- echo $matched $extrafiles
- exit 0
|