| # 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 |
| } |