| # Copyright 2012 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. | |
| # These function names are also known to | |
| # (and are the plan for transitioning to) run.go. | |
| # helper (not known to run.go) | |
| # group file list by packages and return list of packages | |
| # each package is a comma-separated list of go files. | |
| pkgs() { | |
| pkglist=$(grep -h '^package ' $* | awk '{print $2}' | sort -u) | |
| for p in $pkglist | |
| do | |
| echo $(grep -l "^package $p\$" $*) | tr ' ' , | |
| done | sort | |
| } | |
| _match() { | |
| case $1 in | |
| *,*) | |
| #echo >&2 "match comma separated $1" | |
| first=$(echo $1 | sed 's/,.*//') | |
| rest=$(echo $1 | sed 's/[^,]*,//') | |
| if _match $first && _match $rest; then | |
| return 0 | |
| fi | |
| return 1 | |
| ;; | |
| '!'*) | |
| #echo >&2 "match negation $1" | |
| neg=$(echo $1 | sed 's/^!//') | |
| if _match $neg; then | |
| return 1 | |
| fi | |
| return 0 | |
| ;; | |
| $GOARCH|$GOOS) | |
| #echo >&2 "match GOARCH or GOOS $1" | |
| return 0 | |
| ;; | |
| esac | |
| return 1 | |
| } | |
| # +build aborts execution if the supplied tags don't match, | |
| # i.e. none of the tags (x or !x) matches GOARCH or GOOS. | |
| +build() { | |
| if (( $# == 0 )); then | |
| return | |
| fi | |
| m=0 | |
| for tag; do | |
| if _match $tag; then | |
| m=1 | |
| fi | |
| done | |
| if [ $m = 0 ]; then | |
| #echo >&2 no match | |
| exit 0 | |
| fi | |
| unset m | |
| } | |
| compile() { | |
| $G $D/$F.go | |
| } | |
| compiledir() { | |
| for pkg in $(pkgs $D/$F.dir/*.go) | |
| do | |
| $G -I . $(echo $pkg | tr , ' ') || return 1 | |
| done | |
| } | |
| errorcheckdir() { | |
| lastzero="" | |
| if [ "$1" = "-0" ]; then | |
| lastzero="-0" | |
| fi | |
| pkgs=$(pkgs $D/$F.dir/*.go) | |
| for pkg in $pkgs.last | |
| do | |
| zero="-0" | |
| case $pkg in | |
| *.last) | |
| pkg=$(echo $pkg |sed 's/\.last$//') | |
| zero=$lastzero | |
| esac | |
| errchk $zero $G -D . -I . -e $(echo $pkg | tr , ' ') | |
| done | |
| } | |
| rundir() { | |
| lastfile="" | |
| for pkg in $(pkgs $D/$F.dir/*.go) | |
| do | |
| name=$(echo $pkg | sed 's/\.go.*//; s/.*\///') | |
| $G -D . -I . -e $(echo $pkg | tr , ' ') || return 1 | |
| lastfile=$name | |
| done | |
| $L -o $A.out -L . $lastfile.$A | |
| ./$A.out | |
| } | |
| rundircmpout() { | |
| lastfile="" | |
| for pkg in $(pkgs $D/$F.dir/*.go) | |
| do | |
| name=$(echo $pkg | sed 's/\.go.*//; s/.*\///') | |
| $G -D . -I . -e $(echo $pkg | tr , ' ') || return 1 | |
| lastfile=$name | |
| done | |
| $L -o $A.out -L . $lastfile.$A | |
| ./$A.out 2>&1 | cmp - $D/$F.out | |
| } | |
| build() { | |
| $G $D/$F.go && $L $F.$A | |
| } | |
| runoutput() { | |
| go run "$D/$F.go" "$@" > tmp.go | |
| go run tmp.go | |
| } | |
| run() { | |
| gofiles="" | |
| ingo=true | |
| while $ingo; do | |
| case "$1" in | |
| *.go) | |
| gofiles="$gofiles $1" | |
| shift | |
| ;; | |
| *) | |
| ingo=false | |
| ;; | |
| esac | |
| done | |
| $G $D/$F.go $gofiles && $L $F.$A && ./$A.out "$@" | |
| } | |
| cmpout() { | |
| $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out | |
| } | |
| errorcheck() { | |
| zero="" | |
| if [ "$1" = "-0" ]; then | |
| zero="-0" | |
| shift | |
| fi | |
| errchk $zero $G -e $* $D/$F.go | |
| } | |
| errorcheckoutput() { | |
| zero="" | |
| if [ "$1" = "-0" ]; then | |
| zero="-0" | |
| shift | |
| fi | |
| go run "$D/$F.go" "$@" > tmp.go | |
| errchk $zero $G -e tmp.go | |
| } | |
| skip() { | |
| true | |
| } |