github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/match.sh (about)

     1  #!/bin/sh
     2  
     3  # Copyright 2016 The Go Authors. All rights reserved.
     4  # Use of this source code is governed by a BSD-style
     5  # license that can be found in the LICENSE file.
     6  
     7  # Given a source directory, returns the non-test Go files that should
     8  # be built for this target.  This implements Go's build constraints in
     9  # a shell script.  There is similar code in testsuite/gotest.
    10  
    11  set -e
    12  
    13  LANG=C
    14  LC_ALL=C
    15  LC_CTYPE=C
    16  export LANG LC_ALL LC_CTYPE
    17  
    18  srcdir=""
    19  goarch=""
    20  goos=""
    21  extrafiles=""
    22  cmdlinetag="nosuchtag"
    23  cgotag="cgo"
    24  
    25  for arg; do
    26      case "x$arg" in
    27  	x--srcdir)
    28  	    srcdir=$2
    29  	    shift
    30  	    shift
    31  	    ;;
    32  	x--srcdir=*)
    33  	    srcdir=`echo $1 | sed -e 's/^--srcdir=//'`
    34  	    shift
    35  	    ;;
    36  	x--goarch)
    37  	    goarch=$2
    38  	    shift
    39  	    shift
    40  	    ;;
    41  	x--goarch=*)
    42  	    goarch=`echo $1 | sed -e 's/^--goarch=//'`
    43  	    shift
    44  	    ;;
    45  	x--goos)
    46  	    goos=$2
    47  	    shift
    48  	    shift
    49  	    ;;
    50  	x--goos=*)
    51  	    goos=`echo $1 | sed -e 's/^--goos=//'`
    52  	    shift
    53  	    ;;
    54  	x--extrafiles)
    55  	    extrafiles=$2
    56  	    shift
    57  	    shift
    58  	    ;;
    59  	x--extrafiles=*)
    60  	    extrafiles=`echo $1 | sed -e 's/^--extrafiles=//'`
    61  	    shift
    62  	    ;;
    63  	x--tag)
    64  	    cmdlinetag=$2
    65  	    shift
    66  	    shift
    67  	    ;;
    68  	x--tag=*)
    69  	    cmdlinetag=`echo $1 | sed -e 's/^--tag=//'`
    70  	    shift
    71  	    ;;
    72  	x--nocgo)
    73  	    cgotag="nosuchtag"
    74  	    shift
    75  	    ;;
    76  	*)
    77  	    echo 1>&2 "unknown argument $arg"
    78  	    exit 1
    79  	    ;;
    80      esac
    81  done
    82  
    83  cd $srcdir
    84  
    85  gofiles=
    86  for f in *.go; do
    87      case $f in
    88  	*_test.go)
    89  	    ;;
    90  	*.go)
    91  	    gofiles="$gofiles $f"
    92  	    ;;
    93      esac
    94  done
    95  
    96  if test "$gofiles" = ""; then
    97      echo 1>&2 "no non-test .go files in $srcdir"
    98      exit 1
    99  fi
   100  
   101  matched=
   102  for f in $gofiles; do
   103      tag1=`echo $f | sed -e 's/^.*_\([^_]*\).go$/\1/'`
   104      tag2=`echo $f | sed -e 's/^.*_\([^_]*\)_[^_]*.go$/\1/'`
   105      if test x$tag1 = x$f; then
   106  	tag1=
   107      fi
   108      if test x$tag2 = x$f; then
   109  	tag2=
   110      fi
   111  
   112      case "$tag1" in
   113  	"") ;;
   114  	$goarch) ;;
   115  	$goos) ;;
   116  	aix | android | darwin | dragonfly | freebsd | illumos | hurd | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
   117  	    tag1=nonmatchingtag
   118  	    ;;
   119  	386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
   120  	    tag1=nonmatchingtag
   121  	    ;;
   122      esac
   123  
   124      case "$tag2" in
   125  	"") ;;
   126  	$goarch) ;;
   127  	$goos) ;;
   128  	aix | android | darwin | dragonfly | freebsd | hurd | illumos | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
   129  	    tag2=nonmatchingtag
   130  	    ;;
   131  	386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
   132  	    tag2=nonmatchingtag
   133  	    ;;
   134      esac
   135  
   136      if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
   137  	# Pipe through cat so that `set -e` doesn't affect fgrep.
   138  	tags=`sed '/^package /q' < $f | grep '^// *+build ' | cat`
   139  	omatch=true
   140  	first=true
   141  	match=false
   142  	for tag in $tags; do
   143  	    case $tag in
   144  		"//")
   145  		    ;;
   146  		"+build" | "//+build")
   147  		    if test "$first" = "true"; then
   148  			first=false
   149  		    elif test "$match" = "false"; then
   150  			omatch=false
   151  		    fi
   152  		    match=false
   153  		    ;;
   154  		$goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9])
   155  		    match=true
   156  		    ;;
   157  		"!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9])
   158  		    ;;
   159  		*,*)
   160  		    cmatch=true
   161  		    for ctag in `echo $tag | sed -e 's/,/ /g'`; do
   162  			case $ctag in
   163  			    $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | go1.[0-9])
   164  				;;
   165  			    "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!"go1.[0-9])
   166  				cmatch=false
   167  				;;
   168  			    "!"*)
   169  				;;
   170  			    *)
   171  				cmatch=false
   172  				;;
   173  			esac
   174  		    done
   175  		    if test "$cmatch" = "true"; then
   176  			match=true
   177  		    fi
   178  		    ;;
   179  		"!"*)
   180  		    match=true
   181  		    ;;
   182  	    esac
   183  	done
   184  
   185  	if test "$match" = "false" -a "$first" = "false"; then
   186  	    omatch=false
   187  	fi
   188  
   189  	if test "$omatch" = "true"; then
   190  	    matched="$matched $srcdir/$f"
   191  	fi
   192      fi
   193  done
   194  
   195  echo $matched $extrafiles
   196  
   197  exit 0