Skip to content

Commit

Permalink
tool/gocross: support running from outside the repo dir
Browse files Browse the repository at this point in the history
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 <danderson@tailscale.com>
  • Loading branch information
danderson committed Mar 20, 2023
1 parent df02bb0 commit e7a78bc
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
7 changes: 7 additions & 0 deletions tool/gocross/gocross-wrapper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 14 additions & 4 deletions tool/gocross/toolchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
}
}

Expand Down

0 comments on commit e7a78bc

Please sign in to comment.