Text file src/cmd/go/testdata/script/build_trimpath.txt

     1  [short] skip
     2  
     3  # If GOROOT_FINAL is set, 'go build -trimpath' bakes that into the resulting
     4  # binary instead of GOROOT. Explicitly unset it here.
     5  env GOROOT_FINAL=
     6  
     7  # Set up two identical directories that can be used as GOPATH.
     8  env GO111MODULE=on
     9  mkdir $WORK/a/src/paths $WORK/b/src/paths
    10  cp paths.go $WORK/a/src/paths
    11  cp paths.go $WORK/b/src/paths
    12  cp overlay.json $WORK/a/src/paths
    13  cp overlay.json $WORK/b/src/paths
    14  cp go.mod $WORK/a/src/paths/
    15  cp go.mod $WORK/b/src/paths/
    16  
    17  
    18  # A binary built without -trimpath should contain the module root dir
    19  # and GOROOT for debugging and stack traces.
    20  cd $WORK/a/src/paths
    21  go build -o $WORK/paths-dbg.exe .
    22  exec $WORK/paths-dbg.exe $WORK/paths-dbg.exe
    23  stdout 'binary contains module root: true'
    24  stdout 'binary contains GOROOT: true'
    25  
    26  # A binary built with -trimpath should not contain the current workspace
    27  # or GOROOT.
    28  go build -trimpath -o $WORK/paths-a.exe .
    29  exec $WORK/paths-a.exe $WORK/paths-a.exe
    30  stdout 'binary contains module root: false'
    31  stdout 'binary contains GOROOT: false'
    32  
    33  # A binary from an external module built with -trimpath should not contain
    34  # the current workspace or GOROOT.
    35  go get rsc.io/fortune
    36  go install -trimpath rsc.io/fortune
    37  exec $WORK/paths-a.exe $GOPATH/bin/fortune$GOEXE
    38  stdout 'binary contains module root: false'
    39  stdout 'binary contains GOROOT: false'
    40  go mod edit -droprequire rsc.io/fortune
    41  
    42  # Two binaries built from identical packages in different directories
    43  # should be identical.
    44  cd $WORK/b/src/paths
    45  go build -trimpath -o $WORK/paths-b.exe
    46  cmp -q $WORK/paths-a.exe $WORK/paths-b.exe
    47  
    48  
    49  # Same sequence of tests but with overlays.
    50  # A binary built without -trimpath should contain the module root dir
    51  # and GOROOT for debugging and stack traces.
    52  cd $WORK/a/src/paths
    53  go build -overlay overlay.json -o $WORK/paths-dbg.exe ./overlaydir
    54  exec $WORK/paths-dbg.exe $WORK/paths-dbg.exe
    55  stdout 'binary contains module root: true'
    56  stdout 'binary contains GOROOT: true'
    57  
    58  # A binary built with -trimpath should not contain the current workspace
    59  # or GOROOT.
    60  go build -overlay overlay.json -trimpath -o $WORK/paths-a.exe ./overlaydir
    61  exec $WORK/paths-a.exe $WORK/paths-a.exe
    62  stdout 'binary contains module root: false'
    63  stdout 'binary contains GOROOT: false'
    64  
    65  # Two binaries built from identical packages in different directories
    66  # should be identical.
    67  cd $WORK/b/src/paths
    68  go build -overlay overlay.json -trimpath -o $WORK/paths-b.exe ./overlaydir
    69  cmp -q $WORK/paths-a.exe $WORK/paths-b.exe
    70  
    71  
    72  # Same sequence of tests but in GOPATH mode.
    73  # A binary built without -trimpath should contain GOPATH and GOROOT.
    74  env GO111MODULE=off
    75  cd $WORK
    76  env GOPATH=$WORK/a
    77  go build -o paths-dbg.exe paths
    78  exec ./paths-dbg.exe paths-dbg.exe
    79  stdout 'binary contains GOPATH: true'
    80  stdout 'binary contains GOROOT: true'
    81  
    82  # A binary built with -trimpath should not contain GOPATH or GOROOT.
    83  go build -trimpath -o paths-a.exe paths
    84  exec ./paths-a.exe paths-a.exe
    85  stdout 'binary contains GOPATH: false'
    86  stdout 'binary contains GOROOT: false'
    87  
    88  # Two binaries built from identical packages in different GOPATH roots
    89  # should be identical.
    90  env GOPATH=$WORK/b
    91  go build -trimpath -o paths-b.exe paths
    92  cmp -q paths-a.exe paths-b.exe
    93  
    94  
    95  # Same sequence of tests but with gccgo.
    96  # gccgo does not support builds in module mode.
    97  [!exec:gccgo] stop
    98  [cross] stop  # gccgo can't necessarily cross-compile
    99  env GOPATH=$WORK/a
   100  
   101  # A binary built with gccgo without -trimpath should contain the current
   102  # GOPATH and GOROOT.
   103  go build -compiler=gccgo -o paths-dbg.exe paths
   104  exec ./paths-dbg.exe paths-dbg.exe
   105  stdout 'binary contains GOPATH: true'
   106  stdout 'binary contains GOROOT: false' # gccgo doesn't load std from GOROOT.
   107  
   108  # A binary built with gccgo with -trimpath should not contain GOPATH or GOROOT.
   109  go build -compiler=gccgo -trimpath -o paths-a.exe paths
   110  exec ./paths-a.exe paths-a.exe
   111  stdout 'binary contains GOPATH: false'
   112  stdout 'binary contains GOROOT: false'
   113  
   114  # Two binaries built from identical packages in different directories
   115  # should be identical.
   116  env GOPATH=$WORK/b
   117  go build -compiler=gccgo -trimpath -o paths-b.exe paths
   118  cmp -q paths-a.exe paths-b.exe
   119  
   120  -- paths.go --
   121  package main
   122  
   123  import (
   124  	"bytes"
   125  	"fmt"
   126  	"io/ioutil"
   127  	"log"
   128  	"os"
   129  	"os/exec"
   130  	"path/filepath"
   131  	"strings"
   132  )
   133  
   134  func main() {
   135  	exe := os.Args[1]
   136  	data, err := ioutil.ReadFile(exe)
   137  	if err != nil {
   138  		log.Fatal(err)
   139  	}
   140  
   141  	if os.Getenv("GO111MODULE") == "on" {
   142  		out, err := exec.Command("go", "env", "GOMOD").Output()
   143  		if err != nil {
   144  			log.Fatal(err)
   145  		}
   146  		modRoot := filepath.Dir(strings.TrimSpace(string(out)))
   147  		check(data, "module root", modRoot)
   148  	} else {
   149  		check(data, "GOPATH", os.Getenv("GOPATH"))
   150  	}
   151  	check(data, "GOROOT", os.Getenv("GOROOT"))
   152  }
   153  
   154  func check(data []byte, desc, dir string) {
   155  	containsDir := bytes.Contains(data, []byte(dir))
   156  	containsSlashDir := bytes.Contains(data, []byte(filepath.ToSlash(dir)))
   157  	fmt.Printf("binary contains %s: %v\n", desc, containsDir || containsSlashDir)
   158  }
   159  -- overlay.json --
   160  { "Replace": { "overlaydir/paths.go": "paths.go" } }
   161  -- go.mod --
   162  module paths
   163  
   164  go 1.14
   165  

View as plain text