// Copyright (c) Tailscale Inc & AUTHORS // SPDX-License-Identifier: BSD-3-Clause //go:build ignore package main import ( "bytes" "encoding/json" "fmt" "log" "os" "os/exec" "strings" ) func main() { for _, goos := range []string{"windows", "linux", "darwin", "freebsd", "openbsd"} { generate(goos) } } func generate(goos string) { var x struct { Imports []string } cmd := exec.Command("go", "list", "-json", "tailscale.com/cmd/tailscaled") cmd.Env = append(os.Environ(), "GOOS="+goos, "GOARCH=amd64") j, err := cmd.Output() if err != nil { log.Fatalf("GOOS=%s GOARCH=amd64 %s: %v", goos, cmd, err) } if err := json.Unmarshal(j, &x); err != nil { log.Fatal(err) } var out bytes.Buffer out.WriteString(`// Copyright (c) Tailscale Inc & AUTHORS // SPDX-License-Identifier: BSD-3-Clause // Code generated by gen_deps.go; DO NOT EDIT. package integration import ( // And depend on a bunch of tailscaled innards, for Go's test caching. // Otherwise cmd/go never sees that we depend on these packages' // transitive deps when we run "go install tailscaled" in a child // process and can cache a prior success when a dependency changes. `) for _, dep := range x.Imports { if !strings.Contains(dep, ".") { // Omit standard library deps. continue } fmt.Fprintf(&out, "\t_ %q\n", dep) } fmt.Fprintf(&out, ")\n") filename := fmt.Sprintf("tailscaled_deps_test_%s.go", goos) err = os.WriteFile(filename, out.Bytes(), 0644) if err != nil { log.Fatal(err) } }