Browse Source

tool/gocross: support running from outside the repo dir

A bunch of us invoke tool/go from outside the repo that hosts gocross,
as a way of accessing our version-controlled toolchain. This removes
assumptions from gocross that it's being invoked within the repository
that contains its source code and toolchain configuration.

Fixes tailscale/corp#9627

Signed-off-by: David Anderson <[email protected]>
David Anderson 3 years ago
parent
commit
e7a78bc28f
2 changed files with 21 additions and 4 deletions
  1. 7 0
      tool/gocross/gocross-wrapper.sh
  2. 14 4
      tool/gocross/toolchain.go

+ 7 - 0
tool/gocross/gocross-wrapper.sh

@@ -19,6 +19,13 @@ fi
 (
 repo_root="$(dirname $0)/../.."
 
+# Figuring out if gocross needs a rebuild, as well as the rebuild itself, need
+# to happen with CWD inside this repo. Since we're in a subshell entirely
+# dedicated to wrangling gocross and toolchains, cd over now before doing
+# anything further so that the rest of this logic works the same if gocross is
+# being invoked from somewhere else.
+cd "$repo_root"
+
 toolchain="$HOME/.cache/tailscale-go"
 
 if [ -d "$toolchain" ]; then

+ 14 - 4
tool/gocross/toolchain.go

@@ -15,11 +15,21 @@ import (
 )
 
 func toolchainRev() (string, error) {
-	cwd, err := os.Getwd()
+	// gocross gets built in the root of the repo that has toolchain
+	// information, so we can use os.Args[0] to locate toolchain info.
+	//
+	// We might be getting invoked via the synthetic goroot that we create, so
+	// walk symlinks to find the true location of gocross.
+	start, err := os.Executable()
+	if err != nil {
+		return "", err
+	}
+	start, err = filepath.EvalSymlinks(start)
 	if err != nil {
-		return "", fmt.Errorf("getting CWD: %v", err)
+		return "", fmt.Errorf("evaluating symlinks in %q: %v", os.Args[0], err)
 	}
-	d := cwd
+	start = filepath.Dir(start)
+	d := start
 findTopLevel:
 	for {
 		if _, err := os.Lstat(filepath.Join(d, ".git")); err == nil {
@@ -29,7 +39,7 @@ findTopLevel:
 		}
 		d = filepath.Dir(d)
 		if d == "/" {
-			return "", fmt.Errorf("couldn't find .git starting from %q, cannot manage toolchain", cwd)
+			return "", fmt.Errorf("couldn't find .git starting from %q, cannot manage toolchain", start)
 		}
 	}