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

     1  [compiler:gccgo] skip
     2  [short] skip 'builds and links another cmd/go'
     3  
     4  mkdir $WORK/new/bin
     5  
     6  # $GOROOT/bin/go is whatever the user has already installed
     7  # (using make.bash or similar). We can't make assumptions about what
     8  # options it may have been built with, such as -trimpath or not.
     9  # Instead, we build a fresh copy of the binary with known settings.
    10  go build -o $WORK/new/bin/go$GOEXE cmd/go &
    11  go build -trimpath -o $WORK/bin/check$GOEXE check.go &
    12  wait
    13  
    14  env TESTGOROOT=$GOROOT
    15  env GOROOT=
    16  
    17  # Relocated Executable
    18  exec $WORK/bin/check$GOEXE $WORK/new/bin/go$GOEXE $TESTGOROOT
    19  
    20  # Relocated Tree:
    21  # If the binary is sitting in a bin dir next to ../pkg/tool, that counts as a GOROOT,
    22  # so it should find the new tree.
    23  mkdir $WORK/new/pkg/tool
    24  exec $WORK/bin/check$GOEXE $WORK/new/bin/go$GOEXE $WORK/new
    25  
    26  [!symlink] stop 'The rest of the test cases require symlinks'
    27  
    28  # Symlinked Executable:
    29  # With a symlink into go tree, we should still find the go tree.
    30  mkdir $WORK/other/bin
    31  symlink $WORK/other/bin/go$GOEXE -> $WORK/new/bin/go$GOEXE
    32  exec $WORK/bin/check$GOEXE $WORK/new/bin/go$GOEXE $WORK/new
    33  
    34  rm $WORK/new/pkg
    35  
    36  # Runtime GOROOT:
    37  # Binaries built in the new tree should report the
    38  # new tree when they call runtime.GOROOT.
    39  symlink $WORK/new/src -> $TESTGOROOT/src
    40  symlink $WORK/new/pkg -> $TESTGOROOT/pkg
    41  exec $WORK/new/bin/go$GOEXE run check_runtime_goroot.go $WORK/new
    42  
    43  -- check.go --
    44  package main
    45  
    46  import (
    47  	"fmt"
    48  	"os"
    49  	"os/exec"
    50  	"path/filepath"
    51  	"strings"
    52  )
    53  
    54  func main() {
    55  	exe := os.Args[1]
    56  	want := os.Args[2]
    57  	cmd := exec.Command(exe, "env", "GOROOT")
    58  	out, err := cmd.CombinedOutput()
    59  	if err != nil {
    60  		fmt.Fprintf(os.Stderr, "%s env GOROOT: %v, %s\n", exe, err, out)
    61  		os.Exit(1)
    62  	}
    63  	goroot, err := filepath.EvalSymlinks(strings.TrimSpace(string(out)))
    64  	if err != nil {
    65  		fmt.Fprintln(os.Stderr, err)
    66  		os.Exit(1)
    67  	}
    68  	want, err = filepath.EvalSymlinks(want)
    69  	if err != nil {
    70  		fmt.Fprintln(os.Stderr, err)
    71  		os.Exit(1)
    72  	}
    73  	if !strings.EqualFold(goroot, want) {
    74  		fmt.Fprintf(os.Stderr, "go env GOROOT:\nhave %s\nwant %s\n", goroot, want)
    75  		os.Exit(1)
    76  	}
    77  	fmt.Fprintf(os.Stderr, "go env GOROOT: %s\n", goroot)
    78  
    79  }
    80  -- check_runtime_goroot.go --
    81  package main
    82  
    83  import (
    84  	"fmt"
    85  	"os"
    86  	"path/filepath"
    87  	"runtime"
    88  	"strings"
    89  )
    90  
    91  func main() {
    92  	goroot, err := filepath.EvalSymlinks(runtime.GOROOT())
    93  	if err != nil {
    94  		fmt.Fprintln(os.Stderr, err)
    95  		os.Exit(1)
    96  	}
    97  	want, err := filepath.EvalSymlinks(os.Args[1])
    98  	if err != nil {
    99  		fmt.Fprintln(os.Stderr, err)
   100  		os.Exit(1)
   101  	}
   102  	if !strings.EqualFold(goroot, want) {
   103  		fmt.Fprintf(os.Stderr, "go env GOROOT:\nhave %s\nwant %s\n", goroot, want)
   104  		os.Exit(1)
   105  	}
   106  	fmt.Fprintf(os.Stderr, "go env GOROOT: %s\n", goroot)
   107  
   108  }
   109  

View as plain text