Source file src/cmd/go/internal/base/tool.go

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package base
     6  
     7  import (
     8  	"fmt"
     9  	"go/build"
    10  	"os"
    11  	"path/filepath"
    12  
    13  	"cmd/go/internal/cfg"
    14  	"cmd/internal/par"
    15  )
    16  
    17  // Tool returns the path to the named tool (for example, "vet").
    18  // If the tool cannot be found, Tool exits the process.
    19  func Tool(toolName string) string {
    20  	toolPath, err := ToolPath(toolName)
    21  	if err != nil && len(cfg.BuildToolexec) == 0 {
    22  		// Give a nice message if there is no tool with that name.
    23  		fmt.Fprintf(os.Stderr, "go: no such tool %q\n", toolName)
    24  		SetExitStatus(2)
    25  		Exit()
    26  	}
    27  	return toolPath
    28  }
    29  
    30  // ToolPath returns the path at which we expect to find the named tool
    31  // (for example, "vet"), and the error (if any) from statting that path.
    32  func ToolPath(toolName string) (string, error) {
    33  	toolPath := filepath.Join(build.ToolDir, toolName) + cfg.ToolExeSuffix()
    34  	err := toolStatCache.Do(toolPath, func() error {
    35  		_, err := os.Stat(toolPath)
    36  		return err
    37  	})
    38  	return toolPath, err
    39  }
    40  
    41  var toolStatCache par.Cache[string, error]
    42  

View as plain text