89d3af5ef7
match.sh was not correctly handling build constraints for Go versions that have a two-digit suffix, like "go1.10". The same issue will arise with Go 1.100, but that is a long ways off. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/260077
198 lines
4.1 KiB
Bash
Executable File
198 lines
4.1 KiB
Bash
Executable File
#!/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 | illumos | hurd | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
|
|
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
|
|
;;
|
|
esac
|
|
|
|
case "$tag2" in
|
|
"") ;;
|
|
$goarch) ;;
|
|
$goos) ;;
|
|
aix | android | darwin | dragonfly | freebsd | hurd | illumos | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
|
|
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 -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" | "//+build")
|
|
if test "$first" = "true"; then
|
|
first=false
|
|
elif test "$match" = "false"; then
|
|
omatch=false
|
|
fi
|
|
match=false
|
|
;;
|
|
$goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9] | go1.[0-9][0-9])
|
|
match=true
|
|
;;
|
|
"!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9] | "!"go1.[0-9][0-9])
|
|
;;
|
|
*,*)
|
|
cmatch=true
|
|
for ctag in `echo $tag | sed -e 's/,/ /g'`; do
|
|
case $ctag in
|
|
$goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9] | go1.[0-9][0-9])
|
|
;;
|
|
"!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9] | "!"go1.[0-9][0-9])
|
|
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
|