Home | History | Annotate | Download | only in go
      1 // Copyright 2011 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 main
      6 
      7 import (
      8 	"bytes"
      9 	"crypto/sha1"
     10 	"errors"
     11 	"fmt"
     12 	"go/build"
     13 	"go/scanner"
     14 	"go/token"
     15 	"io"
     16 	"io/ioutil"
     17 	"os"
     18 	pathpkg "path"
     19 	"path/filepath"
     20 	"runtime"
     21 	"sort"
     22 	"strconv"
     23 	"strings"
     24 	"unicode"
     25 )
     26 
     27 var ignoreImports bool // control whether we ignore imports in packages
     28 
     29 // A Package describes a single package found in a directory.
     30 type Package struct {
     31 	// Note: These fields are part of the go command's public API.
     32 	// See list.go. It is okay to add fields, but not to change or
     33 	// remove existing ones. Keep in sync with list.go
     34 	Dir           string `json:",omitempty"` // directory containing package sources
     35 	ImportPath    string `json:",omitempty"` // import path of package in dir
     36 	ImportComment string `json:",omitempty"` // path in import comment on package statement
     37 	Name          string `json:",omitempty"` // package name
     38 	Doc           string `json:",omitempty"` // package documentation string
     39 	Target        string `json:",omitempty"` // install path
     40 	Shlib         string `json:",omitempty"` // the shared library that contains this package (only set when -linkshared)
     41 	Goroot        bool   `json:",omitempty"` // is this package found in the Go root?
     42 	Standard      bool   `json:",omitempty"` // is this package part of the standard Go library?
     43 	Stale         bool   `json:",omitempty"` // would 'go install' do anything for this package?
     44 	StaleReason   string `json:",omitempty"` // why is Stale true?
     45 	Root          string `json:",omitempty"` // Go root or Go path dir containing this package
     46 	ConflictDir   string `json:",omitempty"` // Dir is hidden by this other directory
     47 	BinaryOnly    bool   `json:",omitempty"` // package cannot be recompiled
     48 
     49 	// Source files
     50 	GoFiles        []string `json:",omitempty"` // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
     51 	CgoFiles       []string `json:",omitempty"` // .go sources files that import "C"
     52 	IgnoredGoFiles []string `json:",omitempty"` // .go sources ignored due to build constraints
     53 	CFiles         []string `json:",omitempty"` // .c source files
     54 	CXXFiles       []string `json:",omitempty"` // .cc, .cpp and .cxx source files
     55 	MFiles         []string `json:",omitempty"` // .m source files
     56 	HFiles         []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files
     57 	FFiles         []string `json:",omitempty"` // .f, .F, .for and .f90 Fortran source files
     58 	SFiles         []string `json:",omitempty"` // .s source files
     59 	SwigFiles      []string `json:",omitempty"` // .swig files
     60 	SwigCXXFiles   []string `json:",omitempty"` // .swigcxx files
     61 	SysoFiles      []string `json:",omitempty"` // .syso system object files added to package
     62 
     63 	// Cgo directives
     64 	CgoCFLAGS    []string `json:",omitempty"` // cgo: flags for C compiler
     65 	CgoCPPFLAGS  []string `json:",omitempty"` // cgo: flags for C preprocessor
     66 	CgoCXXFLAGS  []string `json:",omitempty"` // cgo: flags for C++ compiler
     67 	CgoFFLAGS    []string `json:",omitempty"` // cgo: flags for Fortran compiler
     68 	CgoLDFLAGS   []string `json:",omitempty"` // cgo: flags for linker
     69 	CgoPkgConfig []string `json:",omitempty"` // cgo: pkg-config names
     70 
     71 	// Dependency information
     72 	Imports []string `json:",omitempty"` // import paths used by this package
     73 	Deps    []string `json:",omitempty"` // all (recursively) imported dependencies
     74 
     75 	// Error information
     76 	Incomplete bool            `json:",omitempty"` // was there an error loading this package or dependencies?
     77 	Error      *PackageError   `json:",omitempty"` // error loading this package (not dependencies)
     78 	DepsErrors []*PackageError `json:",omitempty"` // errors loading dependencies
     79 
     80 	// Test information
     81 	TestGoFiles  []string `json:",omitempty"` // _test.go files in package
     82 	TestImports  []string `json:",omitempty"` // imports from TestGoFiles
     83 	XTestGoFiles []string `json:",omitempty"` // _test.go files outside package
     84 	XTestImports []string `json:",omitempty"` // imports from XTestGoFiles
     85 
     86 	// Unexported fields are not part of the public API.
     87 	build        *build.Package
     88 	pkgdir       string // overrides build.PkgDir
     89 	imports      []*Package
     90 	deps         []*Package
     91 	gofiles      []string // GoFiles+CgoFiles+TestGoFiles+XTestGoFiles files, absolute paths
     92 	sfiles       []string
     93 	allgofiles   []string             // gofiles + IgnoredGoFiles, absolute paths
     94 	target       string               // installed file for this package (may be executable)
     95 	fake         bool                 // synthesized package
     96 	external     bool                 // synthesized external test package
     97 	forceLibrary bool                 // this package is a library (even if named "main")
     98 	cmdline      bool                 // defined by files listed on command line
     99 	local        bool                 // imported via local path (./ or ../)
    100 	localPrefix  string               // interpret ./ and ../ imports relative to this prefix
    101 	exeName      string               // desired name for temporary executable
    102 	coverMode    string               // preprocess Go source files with the coverage tool in this mode
    103 	coverVars    map[string]*CoverVar // variables created by coverage analysis
    104 	omitDWARF    bool                 // tell linker not to write DWARF information
    105 	buildID      string               // expected build ID for generated package
    106 	gobinSubdir  bool                 // install target would be subdir of GOBIN
    107 }
    108 
    109 // vendored returns the vendor-resolved version of imports,
    110 // which should be p.TestImports or p.XTestImports, NOT p.Imports.
    111 // The imports in p.TestImports and p.XTestImports are not recursively
    112 // loaded during the initial load of p, so they list the imports found in
    113 // the source file, but most processing should be over the vendor-resolved
    114 // import paths. We do this resolution lazily both to avoid file system work
    115 // and because the eventual real load of the test imports (during 'go test')
    116 // can produce better error messages if it starts with the original paths.
    117 // The initial load of p loads all the non-test imports and rewrites
    118 // the vendored paths, so nothing should ever call p.vendored(p.Imports).
    119 func (p *Package) vendored(imports []string) []string {
    120 	if len(imports) > 0 && len(p.Imports) > 0 && &imports[0] == &p.Imports[0] {
    121 		panic("internal error: p.vendored(p.Imports) called")
    122 	}
    123 	seen := make(map[string]bool)
    124 	var all []string
    125 	for _, path := range imports {
    126 		path = vendoredImportPath(p, path)
    127 		if !seen[path] {
    128 			seen[path] = true
    129 			all = append(all, path)
    130 		}
    131 	}
    132 	sort.Strings(all)
    133 	return all
    134 }
    135 
    136 // CoverVar holds the name of the generated coverage variables targeting the named file.
    137 type CoverVar struct {
    138 	File string // local file name
    139 	Var  string // name of count struct
    140 }
    141 
    142 func (p *Package) copyBuild(pp *build.Package) {
    143 	p.build = pp
    144 
    145 	if pp.PkgTargetRoot != "" && buildPkgdir != "" {
    146 		old := pp.PkgTargetRoot
    147 		pp.PkgRoot = buildPkgdir
    148 		pp.PkgTargetRoot = buildPkgdir
    149 		pp.PkgObj = filepath.Join(buildPkgdir, strings.TrimPrefix(pp.PkgObj, old))
    150 	}
    151 
    152 	p.Dir = pp.Dir
    153 	p.ImportPath = pp.ImportPath
    154 	p.ImportComment = pp.ImportComment
    155 	p.Name = pp.Name
    156 	p.Doc = pp.Doc
    157 	p.Root = pp.Root
    158 	p.ConflictDir = pp.ConflictDir
    159 	p.BinaryOnly = pp.BinaryOnly
    160 
    161 	// TODO? Target
    162 	p.Goroot = pp.Goroot
    163 	p.Standard = p.Goroot && p.ImportPath != "" && isStandardImportPath(p.ImportPath)
    164 	p.GoFiles = pp.GoFiles
    165 	p.CgoFiles = pp.CgoFiles
    166 	p.IgnoredGoFiles = pp.IgnoredGoFiles
    167 	p.CFiles = pp.CFiles
    168 	p.CXXFiles = pp.CXXFiles
    169 	p.MFiles = pp.MFiles
    170 	p.HFiles = pp.HFiles
    171 	p.FFiles = pp.FFiles
    172 	p.SFiles = pp.SFiles
    173 	p.SwigFiles = pp.SwigFiles
    174 	p.SwigCXXFiles = pp.SwigCXXFiles
    175 	p.SysoFiles = pp.SysoFiles
    176 	p.CgoCFLAGS = pp.CgoCFLAGS
    177 	p.CgoCPPFLAGS = pp.CgoCPPFLAGS
    178 	p.CgoCXXFLAGS = pp.CgoCXXFLAGS
    179 	p.CgoLDFLAGS = pp.CgoLDFLAGS
    180 	p.CgoPkgConfig = pp.CgoPkgConfig
    181 	// We modify p.Imports in place, so make copy now.
    182 	p.Imports = make([]string, len(pp.Imports))
    183 	copy(p.Imports, pp.Imports)
    184 	p.TestGoFiles = pp.TestGoFiles
    185 	p.TestImports = pp.TestImports
    186 	p.XTestGoFiles = pp.XTestGoFiles
    187 	p.XTestImports = pp.XTestImports
    188 	if ignoreImports {
    189 		p.Imports = nil
    190 		p.TestImports = nil
    191 		p.XTestImports = nil
    192 	}
    193 }
    194 
    195 // isStandardImportPath reports whether $GOROOT/src/path should be considered
    196 // part of the standard distribution. For historical reasons we allow people to add
    197 // their own code to $GOROOT instead of using $GOPATH, but we assume that
    198 // code will start with a domain name (dot in the first element).
    199 func isStandardImportPath(path string) bool {
    200 	i := strings.Index(path, "/")
    201 	if i < 0 {
    202 		i = len(path)
    203 	}
    204 	elem := path[:i]
    205 	return !strings.Contains(elem, ".")
    206 }
    207 
    208 // A PackageError describes an error loading information about a package.
    209 type PackageError struct {
    210 	ImportStack   []string // shortest path from package named on command line to this one
    211 	Pos           string   // position of error
    212 	Err           string   // the error itself
    213 	isImportCycle bool     // the error is an import cycle
    214 	hard          bool     // whether the error is soft or hard; soft errors are ignored in some places
    215 }
    216 
    217 func (p *PackageError) Error() string {
    218 	// Import cycles deserve special treatment.
    219 	if p.isImportCycle {
    220 		return fmt.Sprintf("%s\npackage %s\n", p.Err, strings.Join(p.ImportStack, "\n\timports "))
    221 	}
    222 	if p.Pos != "" {
    223 		// Omit import stack. The full path to the file where the error
    224 		// is the most important thing.
    225 		return p.Pos + ": " + p.Err
    226 	}
    227 	if len(p.ImportStack) == 0 {
    228 		return p.Err
    229 	}
    230 	return "package " + strings.Join(p.ImportStack, "\n\timports ") + ": " + p.Err
    231 }
    232 
    233 // An importStack is a stack of import paths.
    234 type importStack []string
    235 
    236 func (s *importStack) push(p string) {
    237 	*s = append(*s, p)
    238 }
    239 
    240 func (s *importStack) pop() {
    241 	*s = (*s)[0 : len(*s)-1]
    242 }
    243 
    244 func (s *importStack) copy() []string {
    245 	return append([]string{}, *s...)
    246 }
    247 
    248 // shorterThan reports whether sp is shorter than t.
    249 // We use this to record the shortest import sequence
    250 // that leads to a particular package.
    251 func (sp *importStack) shorterThan(t []string) bool {
    252 	s := *sp
    253 	if len(s) != len(t) {
    254 		return len(s) < len(t)
    255 	}
    256 	// If they are the same length, settle ties using string ordering.
    257 	for i := range s {
    258 		if s[i] != t[i] {
    259 			return s[i] < t[i]
    260 		}
    261 	}
    262 	return false // they are equal
    263 }
    264 
    265 // packageCache is a lookup cache for loadPackage,
    266 // so that if we look up a package multiple times
    267 // we return the same pointer each time.
    268 var packageCache = map[string]*Package{}
    269 
    270 // reloadPackage is like loadPackage but makes sure
    271 // not to use the package cache.
    272 func reloadPackage(arg string, stk *importStack) *Package {
    273 	p := packageCache[arg]
    274 	if p != nil {
    275 		delete(packageCache, p.Dir)
    276 		delete(packageCache, p.ImportPath)
    277 	}
    278 	return loadPackage(arg, stk)
    279 }
    280 
    281 // dirToImportPath returns the pseudo-import path we use for a package
    282 // outside the Go path. It begins with _/ and then contains the full path
    283 // to the directory. If the package lives in c:\home\gopher\my\pkg then
    284 // the pseudo-import path is _/c_/home/gopher/my/pkg.
    285 // Using a pseudo-import path like this makes the ./ imports no longer
    286 // a special case, so that all the code to deal with ordinary imports works
    287 // automatically.
    288 func dirToImportPath(dir string) string {
    289 	return pathpkg.Join("_", strings.Map(makeImportValid, filepath.ToSlash(dir)))
    290 }
    291 
    292 func makeImportValid(r rune) rune {
    293 	// Should match Go spec, compilers, and ../../go/parser/parser.go:/isValidImport.
    294 	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
    295 	if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
    296 		return '_'
    297 	}
    298 	return r
    299 }
    300 
    301 // Mode flags for loadImport and download (in get.go).
    302 const (
    303 	// useVendor means that loadImport should do vendor expansion
    304 	// (provided the vendoring experiment is enabled).
    305 	// That is, useVendor means that the import path came from
    306 	// a source file and has not been vendor-expanded yet.
    307 	// Every import path should be loaded initially with useVendor,
    308 	// and then the expanded version (with the /vendor/ in it) gets
    309 	// recorded as the canonical import path. At that point, future loads
    310 	// of that package must not pass useVendor, because
    311 	// disallowVendor will reject direct use of paths containing /vendor/.
    312 	useVendor = 1 << iota
    313 
    314 	// getTestDeps is for download (part of "go get") and indicates
    315 	// that test dependencies should be fetched too.
    316 	getTestDeps
    317 )
    318 
    319 // loadImport scans the directory named by path, which must be an import path,
    320 // but possibly a local import path (an absolute file system path or one beginning
    321 // with ./ or ../).  A local relative path is interpreted relative to srcDir.
    322 // It returns a *Package describing the package found in that directory.
    323 func loadImport(path, srcDir string, parent *Package, stk *importStack, importPos []token.Position, mode int) *Package {
    324 	stk.push(path)
    325 	defer stk.pop()
    326 
    327 	// Determine canonical identifier for this package.
    328 	// For a local import the identifier is the pseudo-import path
    329 	// we create from the full directory to the package.
    330 	// Otherwise it is the usual import path.
    331 	// For vendored imports, it is the expanded form.
    332 	importPath := path
    333 	origPath := path
    334 	isLocal := build.IsLocalImport(path)
    335 	if isLocal {
    336 		importPath = dirToImportPath(filepath.Join(srcDir, path))
    337 	} else if mode&useVendor != 0 {
    338 		// We do our own vendor resolution, because we want to
    339 		// find out the key to use in packageCache without the
    340 		// overhead of repeated calls to buildContext.Import.
    341 		// The code is also needed in a few other places anyway.
    342 		path = vendoredImportPath(parent, path)
    343 		importPath = path
    344 	}
    345 
    346 	p := packageCache[importPath]
    347 	if p != nil {
    348 		p = reusePackage(p, stk)
    349 	} else {
    350 		p = new(Package)
    351 		p.local = isLocal
    352 		p.ImportPath = importPath
    353 		packageCache[importPath] = p
    354 
    355 		// Load package.
    356 		// Import always returns bp != nil, even if an error occurs,
    357 		// in order to return partial information.
    358 		//
    359 		// TODO: After Go 1, decide when to pass build.AllowBinary here.
    360 		// See issue 3268 for mistakes to avoid.
    361 		buildMode := build.ImportComment
    362 		if mode&useVendor == 0 || path != origPath {
    363 			// Not vendoring, or we already found the vendored path.
    364 			buildMode |= build.IgnoreVendor
    365 		}
    366 		bp, err := buildContext.Import(path, srcDir, buildMode)
    367 		bp.ImportPath = importPath
    368 		if gobin != "" {
    369 			bp.BinDir = gobin
    370 		}
    371 		if err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
    372 			!strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") {
    373 			err = fmt.Errorf("code in directory %s expects import %q", bp.Dir, bp.ImportComment)
    374 		}
    375 		p.load(stk, bp, err)
    376 		if p.Error != nil && p.Error.Pos == "" {
    377 			p = setErrorPos(p, importPos)
    378 		}
    379 
    380 		if origPath != cleanImport(origPath) {
    381 			p.Error = &PackageError{
    382 				ImportStack: stk.copy(),
    383 				Err:         fmt.Sprintf("non-canonical import path: %q should be %q", origPath, pathpkg.Clean(origPath)),
    384 			}
    385 			p.Incomplete = true
    386 		}
    387 	}
    388 
    389 	// Checked on every import because the rules depend on the code doing the importing.
    390 	if perr := disallowInternal(srcDir, p, stk); perr != p {
    391 		return setErrorPos(perr, importPos)
    392 	}
    393 	if mode&useVendor != 0 {
    394 		if perr := disallowVendor(srcDir, origPath, p, stk); perr != p {
    395 			return setErrorPos(perr, importPos)
    396 		}
    397 	}
    398 
    399 	if p.Name == "main" && parent != nil && parent.Dir != p.Dir {
    400 		perr := *p
    401 		perr.Error = &PackageError{
    402 			ImportStack: stk.copy(),
    403 			Err:         fmt.Sprintf("import %q is a program, not an importable package", path),
    404 		}
    405 		return setErrorPos(&perr, importPos)
    406 	}
    407 
    408 	if p.local && parent != nil && !parent.local {
    409 		perr := *p
    410 		perr.Error = &PackageError{
    411 			ImportStack: stk.copy(),
    412 			Err:         fmt.Sprintf("local import %q in non-local package", path),
    413 		}
    414 		return setErrorPos(&perr, importPos)
    415 	}
    416 
    417 	return p
    418 }
    419 
    420 func setErrorPos(p *Package, importPos []token.Position) *Package {
    421 	if len(importPos) > 0 {
    422 		pos := importPos[0]
    423 		pos.Filename = shortPath(pos.Filename)
    424 		p.Error.Pos = pos.String()
    425 	}
    426 	return p
    427 }
    428 
    429 func cleanImport(path string) string {
    430 	orig := path
    431 	path = pathpkg.Clean(path)
    432 	if strings.HasPrefix(orig, "./") && path != ".." && !strings.HasPrefix(path, "../") {
    433 		path = "./" + path
    434 	}
    435 	return path
    436 }
    437 
    438 var isDirCache = map[string]bool{}
    439 
    440 func isDir(path string) bool {
    441 	result, ok := isDirCache[path]
    442 	if ok {
    443 		return result
    444 	}
    445 
    446 	fi, err := os.Stat(path)
    447 	result = err == nil && fi.IsDir()
    448 	isDirCache[path] = result
    449 	return result
    450 }
    451 
    452 // vendoredImportPath returns the expansion of path when it appears in parent.
    453 // If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path,
    454 // x/vendor/path, vendor/path, or else stay path if none of those exist.
    455 // vendoredImportPath returns the expanded path or, if no expansion is found, the original.
    456 func vendoredImportPath(parent *Package, path string) (found string) {
    457 	if parent == nil || parent.Root == "" {
    458 		return path
    459 	}
    460 
    461 	dir := filepath.Clean(parent.Dir)
    462 	root := filepath.Join(parent.Root, "src")
    463 	if !hasFilePathPrefix(dir, root) || parent.ImportPath != "command-line-arguments" && filepath.Join(root, parent.ImportPath) != dir {
    464 		// Look for symlinks before reporting error.
    465 		dir = expandPath(dir)
    466 		root = expandPath(root)
    467 	}
    468 
    469 	if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || parent.ImportPath != "command-line-arguments" && !parent.local && filepath.Join(root, parent.ImportPath) != dir {
    470 		fatalf("unexpected directory layout:\n"+
    471 			"	import path: %s\n"+
    472 			"	root: %s\n"+
    473 			"	dir: %s\n"+
    474 			"	expand root: %s\n"+
    475 			"	expand dir: %s\n"+
    476 			"	separator: %s",
    477 			parent.ImportPath,
    478 			filepath.Join(parent.Root, "src"),
    479 			filepath.Clean(parent.Dir),
    480 			root,
    481 			dir,
    482 			string(filepath.Separator))
    483 	}
    484 
    485 	vpath := "vendor/" + path
    486 	for i := len(dir); i >= len(root); i-- {
    487 		if i < len(dir) && dir[i] != filepath.Separator {
    488 			continue
    489 		}
    490 		// Note: checking for the vendor directory before checking
    491 		// for the vendor/path directory helps us hit the
    492 		// isDir cache more often. It also helps us prepare a more useful
    493 		// list of places we looked, to report when an import is not found.
    494 		if !isDir(filepath.Join(dir[:i], "vendor")) {
    495 			continue
    496 		}
    497 		targ := filepath.Join(dir[:i], vpath)
    498 		if isDir(targ) && hasGoFiles(targ) {
    499 			importPath := parent.ImportPath
    500 			if importPath == "command-line-arguments" {
    501 				// If parent.ImportPath is 'command-line-arguments'.
    502 				// set to relative directory to root (also chopped root directory)
    503 				importPath = dir[len(root)+1:]
    504 			}
    505 			// We started with parent's dir c:\gopath\src\foo\bar\baz\quux\xyzzy.
    506 			// We know the import path for parent's dir.
    507 			// We chopped off some number of path elements and
    508 			// added vendor\path to produce c:\gopath\src\foo\bar\baz\vendor\path.
    509 			// Now we want to know the import path for that directory.
    510 			// Construct it by chopping the same number of path elements
    511 			// (actually the same number of bytes) from parent's import path
    512 			// and then append /vendor/path.
    513 			chopped := len(dir) - i
    514 			if chopped == len(importPath)+1 {
    515 				// We walked up from c:\gopath\src\foo\bar
    516 				// and found c:\gopath\src\vendor\path.
    517 				// We chopped \foo\bar (length 8) but the import path is "foo/bar" (length 7).
    518 				// Use "vendor/path" without any prefix.
    519 				return vpath
    520 			}
    521 			return importPath[:len(importPath)-chopped] + "/" + vpath
    522 		}
    523 	}
    524 	return path
    525 }
    526 
    527 // hasGoFiles reports whether dir contains any files with names ending in .go.
    528 // For a vendor check we must exclude directories that contain no .go files.
    529 // Otherwise it is not possible to vendor just a/b/c and still import the
    530 // non-vendored a/b. See golang.org/issue/13832.
    531 func hasGoFiles(dir string) bool {
    532 	fis, _ := ioutil.ReadDir(dir)
    533 	for _, fi := range fis {
    534 		if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".go") {
    535 			return true
    536 		}
    537 	}
    538 	return false
    539 }
    540 
    541 // reusePackage reuses package p to satisfy the import at the top
    542 // of the import stack stk. If this use causes an import loop,
    543 // reusePackage updates p's error information to record the loop.
    544 func reusePackage(p *Package, stk *importStack) *Package {
    545 	// We use p.imports==nil to detect a package that
    546 	// is in the midst of its own loadPackage call
    547 	// (all the recursion below happens before p.imports gets set).
    548 	if p.imports == nil {
    549 		if p.Error == nil {
    550 			p.Error = &PackageError{
    551 				ImportStack:   stk.copy(),
    552 				Err:           "import cycle not allowed",
    553 				isImportCycle: true,
    554 			}
    555 		}
    556 		p.Incomplete = true
    557 	}
    558 	// Don't rewrite the import stack in the error if we have an import cycle.
    559 	// If we do, we'll lose the path that describes the cycle.
    560 	if p.Error != nil && !p.Error.isImportCycle && stk.shorterThan(p.Error.ImportStack) {
    561 		p.Error.ImportStack = stk.copy()
    562 	}
    563 	return p
    564 }
    565 
    566 // disallowInternal checks that srcDir is allowed to import p.
    567 // If the import is allowed, disallowInternal returns the original package p.
    568 // If not, it returns a new package containing just an appropriate error.
    569 func disallowInternal(srcDir string, p *Package, stk *importStack) *Package {
    570 	// golang.org/s/go14internal:
    571 	// An import of a path containing the element internal
    572 	// is disallowed if the importing code is outside the tree
    573 	// rooted at the parent of the internal directory.
    574 
    575 	// There was an error loading the package; stop here.
    576 	if p.Error != nil {
    577 		return p
    578 	}
    579 
    580 	// The generated 'testmain' package is allowed to access testing/internal/...,
    581 	// as if it were generated into the testing directory tree
    582 	// (it's actually in a temporary directory outside any Go tree).
    583 	// This cleans up a former kludge in passing functionality to the testing package.
    584 	if strings.HasPrefix(p.ImportPath, "testing/internal") && len(*stk) >= 2 && (*stk)[len(*stk)-2] == "testmain" {
    585 		return p
    586 	}
    587 
    588 	// We can't check standard packages with gccgo.
    589 	if buildContext.Compiler == "gccgo" && p.Standard {
    590 		return p
    591 	}
    592 
    593 	// The stack includes p.ImportPath.
    594 	// If that's the only thing on the stack, we started
    595 	// with a name given on the command line, not an
    596 	// import. Anything listed on the command line is fine.
    597 	if len(*stk) == 1 {
    598 		return p
    599 	}
    600 
    601 	// Check for "internal" element: three cases depending on begin of string and/or end of string.
    602 	i, ok := findInternal(p.ImportPath)
    603 	if !ok {
    604 		return p
    605 	}
    606 
    607 	// Internal is present.
    608 	// Map import path back to directory corresponding to parent of internal.
    609 	if i > 0 {
    610 		i-- // rewind over slash in ".../internal"
    611 	}
    612 	parent := p.Dir[:i+len(p.Dir)-len(p.ImportPath)]
    613 	if hasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
    614 		return p
    615 	}
    616 
    617 	// Look for symlinks before reporting error.
    618 	srcDir = expandPath(srcDir)
    619 	parent = expandPath(parent)
    620 	if hasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
    621 		return p
    622 	}
    623 
    624 	// Internal is present, and srcDir is outside parent's tree. Not allowed.
    625 	perr := *p
    626 	perr.Error = &PackageError{
    627 		ImportStack: stk.copy(),
    628 		Err:         "use of internal package not allowed",
    629 	}
    630 	perr.Incomplete = true
    631 	return &perr
    632 }
    633 
    634 // findInternal looks for the final "internal" path element in the given import path.
    635 // If there isn't one, findInternal returns ok=false.
    636 // Otherwise, findInternal returns ok=true and the index of the "internal".
    637 func findInternal(path string) (index int, ok bool) {
    638 	// Three cases, depending on internal at start/end of string or not.
    639 	// The order matters: we must return the index of the final element,
    640 	// because the final one produces the most restrictive requirement
    641 	// on the importer.
    642 	switch {
    643 	case strings.HasSuffix(path, "/internal"):
    644 		return len(path) - len("internal"), true
    645 	case strings.Contains(path, "/internal/"):
    646 		return strings.LastIndex(path, "/internal/") + 1, true
    647 	case path == "internal", strings.HasPrefix(path, "internal/"):
    648 		return 0, true
    649 	}
    650 	return 0, false
    651 }
    652 
    653 // disallowVendor checks that srcDir is allowed to import p as path.
    654 // If the import is allowed, disallowVendor returns the original package p.
    655 // If not, it returns a new package containing just an appropriate error.
    656 func disallowVendor(srcDir, path string, p *Package, stk *importStack) *Package {
    657 	// The stack includes p.ImportPath.
    658 	// If that's the only thing on the stack, we started
    659 	// with a name given on the command line, not an
    660 	// import. Anything listed on the command line is fine.
    661 	if len(*stk) == 1 {
    662 		return p
    663 	}
    664 
    665 	if perr := disallowVendorVisibility(srcDir, p, stk); perr != p {
    666 		return perr
    667 	}
    668 
    669 	// Paths like x/vendor/y must be imported as y, never as x/vendor/y.
    670 	if i, ok := findVendor(path); ok {
    671 		perr := *p
    672 		perr.Error = &PackageError{
    673 			ImportStack: stk.copy(),
    674 			Err:         "must be imported as " + path[i+len("vendor/"):],
    675 		}
    676 		perr.Incomplete = true
    677 		return &perr
    678 	}
    679 
    680 	return p
    681 }
    682 
    683 // disallowVendorVisibility checks that srcDir is allowed to import p.
    684 // The rules are the same as for /internal/ except that a path ending in /vendor
    685 // is not subject to the rules, only subdirectories of vendor.
    686 // This allows people to have packages and commands named vendor,
    687 // for maximal compatibility with existing source trees.
    688 func disallowVendorVisibility(srcDir string, p *Package, stk *importStack) *Package {
    689 	// The stack includes p.ImportPath.
    690 	// If that's the only thing on the stack, we started
    691 	// with a name given on the command line, not an
    692 	// import. Anything listed on the command line is fine.
    693 	if len(*stk) == 1 {
    694 		return p
    695 	}
    696 
    697 	// Check for "vendor" element.
    698 	i, ok := findVendor(p.ImportPath)
    699 	if !ok {
    700 		return p
    701 	}
    702 
    703 	// Vendor is present.
    704 	// Map import path back to directory corresponding to parent of vendor.
    705 	if i > 0 {
    706 		i-- // rewind over slash in ".../vendor"
    707 	}
    708 	truncateTo := i + len(p.Dir) - len(p.ImportPath)
    709 	if truncateTo < 0 || len(p.Dir) < truncateTo {
    710 		return p
    711 	}
    712 	parent := p.Dir[:truncateTo]
    713 	if hasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
    714 		return p
    715 	}
    716 
    717 	// Look for symlinks before reporting error.
    718 	srcDir = expandPath(srcDir)
    719 	parent = expandPath(parent)
    720 	if hasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) {
    721 		return p
    722 	}
    723 
    724 	// Vendor is present, and srcDir is outside parent's tree. Not allowed.
    725 	perr := *p
    726 	perr.Error = &PackageError{
    727 		ImportStack: stk.copy(),
    728 		Err:         "use of vendored package not allowed",
    729 	}
    730 	perr.Incomplete = true
    731 	return &perr
    732 }
    733 
    734 // findVendor looks for the last non-terminating "vendor" path element in the given import path.
    735 // If there isn't one, findVendor returns ok=false.
    736 // Otherwise, findVendor returns ok=true and the index of the "vendor".
    737 //
    738 // Note that terminating "vendor" elements don't count: "x/vendor" is its own package,
    739 // not the vendored copy of an import "" (the empty import path).
    740 // This will allow people to have packages or commands named vendor.
    741 // This may help reduce breakage, or it may just be confusing. We'll see.
    742 func findVendor(path string) (index int, ok bool) {
    743 	// Two cases, depending on internal at start of string or not.
    744 	// The order matters: we must return the index of the final element,
    745 	// because the final one is where the effective import path starts.
    746 	switch {
    747 	case strings.Contains(path, "/vendor/"):
    748 		return strings.LastIndex(path, "/vendor/") + 1, true
    749 	case strings.HasPrefix(path, "vendor/"):
    750 		return 0, true
    751 	}
    752 	return 0, false
    753 }
    754 
    755 type targetDir int
    756 
    757 const (
    758 	toRoot    targetDir = iota // to bin dir inside package root (default)
    759 	toTool                     // GOROOT/pkg/tool
    760 	stalePath                  // the old import path; fail to build
    761 )
    762 
    763 // goTools is a map of Go program import path to install target directory.
    764 var goTools = map[string]targetDir{
    765 	"cmd/addr2line": toTool,
    766 	"cmd/api":       toTool,
    767 	"cmd/asm":       toTool,
    768 	"cmd/compile":   toTool,
    769 	"cmd/cgo":       toTool,
    770 	"cmd/cover":     toTool,
    771 	"cmd/dist":      toTool,
    772 	"cmd/doc":       toTool,
    773 	"cmd/fix":       toTool,
    774 	"cmd/link":      toTool,
    775 	"cmd/newlink":   toTool,
    776 	"cmd/nm":        toTool,
    777 	"cmd/objdump":   toTool,
    778 	"cmd/pack":      toTool,
    779 	"cmd/pprof":     toTool,
    780 	"cmd/trace":     toTool,
    781 	"cmd/vet":       toTool,
    782 	"code.google.com/p/go.tools/cmd/cover": stalePath,
    783 	"code.google.com/p/go.tools/cmd/godoc": stalePath,
    784 	"code.google.com/p/go.tools/cmd/vet":   stalePath,
    785 }
    786 
    787 // expandScanner expands a scanner.List error into all the errors in the list.
    788 // The default Error method only shows the first error.
    789 func expandScanner(err error) error {
    790 	// Look for parser errors.
    791 	if err, ok := err.(scanner.ErrorList); ok {
    792 		// Prepare error with \n before each message.
    793 		// When printed in something like context: %v
    794 		// this will put the leading file positions each on
    795 		// its own line. It will also show all the errors
    796 		// instead of just the first, as err.Error does.
    797 		var buf bytes.Buffer
    798 		for _, e := range err {
    799 			e.Pos.Filename = shortPath(e.Pos.Filename)
    800 			buf.WriteString("\n")
    801 			buf.WriteString(e.Error())
    802 		}
    803 		return errors.New(buf.String())
    804 	}
    805 	return err
    806 }
    807 
    808 var raceExclude = map[string]bool{
    809 	"runtime/race": true,
    810 	"runtime/msan": true,
    811 	"runtime/cgo":  true,
    812 	"cmd/cgo":      true,
    813 	"syscall":      true,
    814 	"errors":       true,
    815 }
    816 
    817 var cgoExclude = map[string]bool{
    818 	"runtime/cgo": true,
    819 }
    820 
    821 var cgoSyscallExclude = map[string]bool{
    822 	"runtime/cgo":  true,
    823 	"runtime/race": true,
    824 	"runtime/msan": true,
    825 }
    826 
    827 // load populates p using information from bp, err, which should
    828 // be the result of calling build.Context.Import.
    829 func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package {
    830 	p.copyBuild(bp)
    831 
    832 	// The localPrefix is the path we interpret ./ imports relative to.
    833 	// Synthesized main packages sometimes override this.
    834 	p.localPrefix = dirToImportPath(p.Dir)
    835 
    836 	if err != nil {
    837 		p.Incomplete = true
    838 		err = expandScanner(err)
    839 		p.Error = &PackageError{
    840 			ImportStack: stk.copy(),
    841 			Err:         err.Error(),
    842 		}
    843 		return p
    844 	}
    845 
    846 	useBindir := p.Name == "main"
    847 	if !p.Standard {
    848 		switch buildBuildmode {
    849 		case "c-archive", "c-shared", "plugin":
    850 			useBindir = false
    851 		}
    852 	}
    853 
    854 	if useBindir {
    855 		// Report an error when the old code.google.com/p/go.tools paths are used.
    856 		if goTools[p.ImportPath] == stalePath {
    857 			newPath := strings.Replace(p.ImportPath, "code.google.com/p/go.", "golang.org/x/", 1)
    858 			e := fmt.Sprintf("the %v command has moved; use %v instead.", p.ImportPath, newPath)
    859 			p.Error = &PackageError{Err: e}
    860 			return p
    861 		}
    862 		_, elem := filepath.Split(p.Dir)
    863 		full := buildContext.GOOS + "_" + buildContext.GOARCH + "/" + elem
    864 		if buildContext.GOOS != toolGOOS || buildContext.GOARCH != toolGOARCH {
    865 			// Install cross-compiled binaries to subdirectories of bin.
    866 			elem = full
    867 		}
    868 		if p.build.BinDir != "" {
    869 			// Install to GOBIN or bin of GOPATH entry.
    870 			p.target = filepath.Join(p.build.BinDir, elem)
    871 			if !p.Goroot && strings.Contains(elem, "/") && gobin != "" {
    872 				// Do not create $GOBIN/goos_goarch/elem.
    873 				p.target = ""
    874 				p.gobinSubdir = true
    875 			}
    876 		}
    877 		if goTools[p.ImportPath] == toTool {
    878 			// This is for 'go tool'.
    879 			// Override all the usual logic and force it into the tool directory.
    880 			p.target = filepath.Join(gorootPkg, "tool", full)
    881 		}
    882 		if p.target != "" && buildContext.GOOS == "windows" {
    883 			p.target += ".exe"
    884 		}
    885 	} else if p.local {
    886 		// Local import turned into absolute path.
    887 		// No permanent install target.
    888 		p.target = ""
    889 	} else {
    890 		p.target = p.build.PkgObj
    891 		if buildLinkshared {
    892 			shlibnamefile := p.target[:len(p.target)-2] + ".shlibname"
    893 			shlib, err := ioutil.ReadFile(shlibnamefile)
    894 			if err == nil {
    895 				libname := strings.TrimSpace(string(shlib))
    896 				if buildContext.Compiler == "gccgo" {
    897 					p.Shlib = filepath.Join(p.build.PkgTargetRoot, "shlibs", libname)
    898 				} else {
    899 					p.Shlib = filepath.Join(p.build.PkgTargetRoot, libname)
    900 
    901 				}
    902 			} else if !os.IsNotExist(err) {
    903 				fatalf("unexpected error reading %s: %v", shlibnamefile, err)
    904 			}
    905 		}
    906 	}
    907 
    908 	importPaths := p.Imports
    909 	// Packages that use cgo import runtime/cgo implicitly.
    910 	// Packages that use cgo also import syscall implicitly,
    911 	// to wrap errno.
    912 	// Exclude certain packages to avoid circular dependencies.
    913 	if len(p.CgoFiles) > 0 && (!p.Standard || !cgoExclude[p.ImportPath]) {
    914 		importPaths = append(importPaths, "runtime/cgo")
    915 	}
    916 	if len(p.CgoFiles) > 0 && (!p.Standard || !cgoSyscallExclude[p.ImportPath]) {
    917 		importPaths = append(importPaths, "syscall")
    918 	}
    919 
    920 	if buildContext.CgoEnabled && p.Name == "main" && !p.Goroot {
    921 		// Currently build modes c-shared, pie (on systems that do not
    922 		// support PIE with internal linking mode), plugin, and
    923 		// -linkshared force external linking mode, as of course does
    924 		// -ldflags=-linkmode=external. External linking mode forces
    925 		// an import of runtime/cgo.
    926 		pieCgo := buildBuildmode == "pie" && (buildContext.GOOS != "linux" || buildContext.GOARCH != "amd64")
    927 		linkmodeExternal := false
    928 		for i, a := range buildLdflags {
    929 			if a == "-linkmode=external" {
    930 				linkmodeExternal = true
    931 			}
    932 			if a == "-linkmode" && i+1 < len(buildLdflags) && buildLdflags[i+1] == "external" {
    933 				linkmodeExternal = true
    934 			}
    935 		}
    936 		if buildBuildmode == "c-shared" || buildBuildmode == "plugin" || pieCgo || buildLinkshared || linkmodeExternal {
    937 			importPaths = append(importPaths, "runtime/cgo")
    938 		}
    939 	}
    940 
    941 	// Everything depends on runtime, except runtime, its internal
    942 	// subpackages, and unsafe.
    943 	if !p.Standard || (p.ImportPath != "runtime" && !strings.HasPrefix(p.ImportPath, "runtime/internal/") && p.ImportPath != "unsafe") {
    944 		importPaths = append(importPaths, "runtime")
    945 		// When race detection enabled everything depends on runtime/race.
    946 		// Exclude certain packages to avoid circular dependencies.
    947 		if buildRace && (!p.Standard || !raceExclude[p.ImportPath]) {
    948 			importPaths = append(importPaths, "runtime/race")
    949 		}
    950 		// MSan uses runtime/msan.
    951 		if buildMSan && (!p.Standard || !raceExclude[p.ImportPath]) {
    952 			importPaths = append(importPaths, "runtime/msan")
    953 		}
    954 		// On ARM with GOARM=5, everything depends on math for the link.
    955 		if p.Name == "main" && goarch == "arm" {
    956 			importPaths = append(importPaths, "math")
    957 		}
    958 		// In coverage atomic mode everything depends on sync/atomic.
    959 		if testCoverMode == "atomic" && (!p.Standard || (p.ImportPath != "runtime/cgo" && p.ImportPath != "runtime/race" && p.ImportPath != "sync/atomic")) {
    960 			importPaths = append(importPaths, "sync/atomic")
    961 		}
    962 	}
    963 
    964 	// Runtime and its internal packages depend on runtime/internal/sys,
    965 	// so that they pick up the generated zversion.go file.
    966 	// This can be an issue particularly for runtime/internal/atomic;
    967 	// see issue 13655.
    968 	if p.Standard && (p.ImportPath == "runtime" || strings.HasPrefix(p.ImportPath, "runtime/internal/")) && p.ImportPath != "runtime/internal/sys" {
    969 		importPaths = append(importPaths, "runtime/internal/sys")
    970 	}
    971 
    972 	// Build list of full paths to all Go files in the package,
    973 	// for use by commands like go fmt.
    974 	p.gofiles = stringList(p.GoFiles, p.CgoFiles, p.TestGoFiles, p.XTestGoFiles)
    975 	for i := range p.gofiles {
    976 		p.gofiles[i] = filepath.Join(p.Dir, p.gofiles[i])
    977 	}
    978 	sort.Strings(p.gofiles)
    979 
    980 	p.sfiles = stringList(p.SFiles)
    981 	for i := range p.sfiles {
    982 		p.sfiles[i] = filepath.Join(p.Dir, p.sfiles[i])
    983 	}
    984 	sort.Strings(p.sfiles)
    985 
    986 	p.allgofiles = stringList(p.IgnoredGoFiles)
    987 	for i := range p.allgofiles {
    988 		p.allgofiles[i] = filepath.Join(p.Dir, p.allgofiles[i])
    989 	}
    990 	p.allgofiles = append(p.allgofiles, p.gofiles...)
    991 	sort.Strings(p.allgofiles)
    992 
    993 	// Check for case-insensitive collision of input files.
    994 	// To avoid problems on case-insensitive files, we reject any package
    995 	// where two different input files have equal names under a case-insensitive
    996 	// comparison.
    997 	f1, f2 := foldDup(stringList(
    998 		p.GoFiles,
    999 		p.CgoFiles,
   1000 		p.IgnoredGoFiles,
   1001 		p.CFiles,
   1002 		p.CXXFiles,
   1003 		p.MFiles,
   1004 		p.HFiles,
   1005 		p.FFiles,
   1006 		p.SFiles,
   1007 		p.SysoFiles,
   1008 		p.SwigFiles,
   1009 		p.SwigCXXFiles,
   1010 		p.TestGoFiles,
   1011 		p.XTestGoFiles,
   1012 	))
   1013 	if f1 != "" {
   1014 		p.Error = &PackageError{
   1015 			ImportStack: stk.copy(),
   1016 			Err:         fmt.Sprintf("case-insensitive file name collision: %q and %q", f1, f2),
   1017 		}
   1018 		return p
   1019 	}
   1020 
   1021 	// Build list of imported packages and full dependency list.
   1022 	imports := make([]*Package, 0, len(p.Imports))
   1023 	deps := make(map[string]*Package)
   1024 	save := func(path string, p1 *Package) {
   1025 		// The same import path could produce an error or not,
   1026 		// depending on what tries to import it.
   1027 		// Prefer to record entries with errors, so we can report them.
   1028 		p0 := deps[path]
   1029 		if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) {
   1030 			deps[path] = p1
   1031 		}
   1032 	}
   1033 
   1034 	for i, path := range importPaths {
   1035 		if path == "C" {
   1036 			continue
   1037 		}
   1038 		p1 := loadImport(path, p.Dir, p, stk, p.build.ImportPos[path], useVendor)
   1039 		if p.Standard && p.Error == nil && !p1.Standard && p1.Error == nil {
   1040 			p.Error = &PackageError{
   1041 				ImportStack: stk.copy(),
   1042 				Err:         fmt.Sprintf("non-standard import %q in standard package %q", path, p.ImportPath),
   1043 			}
   1044 			pos := p.build.ImportPos[path]
   1045 			if len(pos) > 0 {
   1046 				p.Error.Pos = pos[0].String()
   1047 			}
   1048 		}
   1049 
   1050 		path = p1.ImportPath
   1051 		importPaths[i] = path
   1052 		if i < len(p.Imports) {
   1053 			p.Imports[i] = path
   1054 		}
   1055 
   1056 		save(path, p1)
   1057 		imports = append(imports, p1)
   1058 		for _, dep := range p1.deps {
   1059 			save(dep.ImportPath, dep)
   1060 		}
   1061 		if p1.Incomplete {
   1062 			p.Incomplete = true
   1063 		}
   1064 	}
   1065 	p.imports = imports
   1066 
   1067 	p.Deps = make([]string, 0, len(deps))
   1068 	for dep := range deps {
   1069 		p.Deps = append(p.Deps, dep)
   1070 	}
   1071 	sort.Strings(p.Deps)
   1072 	for _, dep := range p.Deps {
   1073 		p1 := deps[dep]
   1074 		if p1 == nil {
   1075 			panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath)
   1076 		}
   1077 		p.deps = append(p.deps, p1)
   1078 		if p1.Error != nil {
   1079 			p.DepsErrors = append(p.DepsErrors, p1.Error)
   1080 		}
   1081 	}
   1082 
   1083 	// unsafe is a fake package.
   1084 	if p.Standard && (p.ImportPath == "unsafe" || buildContext.Compiler == "gccgo") {
   1085 		p.target = ""
   1086 	}
   1087 	p.Target = p.target
   1088 
   1089 	// If cgo is not enabled, ignore cgo supporting sources
   1090 	// just as we ignore go files containing import "C".
   1091 	if !buildContext.CgoEnabled {
   1092 		p.CFiles = nil
   1093 		p.CXXFiles = nil
   1094 		p.MFiles = nil
   1095 		p.SwigFiles = nil
   1096 		p.SwigCXXFiles = nil
   1097 		// Note that SFiles are okay (they go to the Go assembler)
   1098 		// and HFiles are okay (they might be used by the SFiles).
   1099 		// Also Sysofiles are okay (they might not contain object
   1100 		// code; see issue #16050).
   1101 	}
   1102 
   1103 	// The gc toolchain only permits C source files with cgo.
   1104 	if len(p.CFiles) > 0 && !p.usesCgo() && !p.usesSwig() && buildContext.Compiler == "gc" {
   1105 		p.Error = &PackageError{
   1106 			ImportStack: stk.copy(),
   1107 			Err:         fmt.Sprintf("C source files not allowed when not using cgo or SWIG: %s", strings.Join(p.CFiles, " ")),
   1108 		}
   1109 		return p
   1110 	}
   1111 
   1112 	// In the absence of errors lower in the dependency tree,
   1113 	// check for case-insensitive collisions of import paths.
   1114 	if len(p.DepsErrors) == 0 {
   1115 		dep1, dep2 := foldDup(p.Deps)
   1116 		if dep1 != "" {
   1117 			p.Error = &PackageError{
   1118 				ImportStack: stk.copy(),
   1119 				Err:         fmt.Sprintf("case-insensitive import collision: %q and %q", dep1, dep2),
   1120 			}
   1121 			return p
   1122 		}
   1123 	}
   1124 
   1125 	if p.BinaryOnly {
   1126 		// For binary-only package, use build ID from supplied package binary.
   1127 		buildID, err := readBuildID(p)
   1128 		if err == nil {
   1129 			p.buildID = buildID
   1130 		}
   1131 	} else {
   1132 		computeBuildID(p)
   1133 	}
   1134 	return p
   1135 }
   1136 
   1137 // usesSwig reports whether the package needs to run SWIG.
   1138 func (p *Package) usesSwig() bool {
   1139 	return len(p.SwigFiles) > 0 || len(p.SwigCXXFiles) > 0
   1140 }
   1141 
   1142 // usesCgo reports whether the package needs to run cgo
   1143 func (p *Package) usesCgo() bool {
   1144 	return len(p.CgoFiles) > 0
   1145 }
   1146 
   1147 // packageList returns the list of packages in the dag rooted at roots
   1148 // as visited in a depth-first post-order traversal.
   1149 func packageList(roots []*Package) []*Package {
   1150 	seen := map[*Package]bool{}
   1151 	all := []*Package{}
   1152 	var walk func(*Package)
   1153 	walk = func(p *Package) {
   1154 		if seen[p] {
   1155 			return
   1156 		}
   1157 		seen[p] = true
   1158 		for _, p1 := range p.imports {
   1159 			walk(p1)
   1160 		}
   1161 		all = append(all, p)
   1162 	}
   1163 	for _, root := range roots {
   1164 		walk(root)
   1165 	}
   1166 	return all
   1167 }
   1168 
   1169 // computeStale computes the Stale flag in the package dag that starts
   1170 // at the named pkgs (command-line arguments).
   1171 func computeStale(pkgs ...*Package) {
   1172 	for _, p := range packageList(pkgs) {
   1173 		p.Stale, p.StaleReason = isStale(p)
   1174 	}
   1175 }
   1176 
   1177 // The runtime version string takes one of two forms:
   1178 // "go1.X[.Y]" for Go releases, and "devel +hash" at tip.
   1179 // Determine whether we are in a released copy by
   1180 // inspecting the version.
   1181 var isGoRelease = strings.HasPrefix(runtime.Version(), "go1")
   1182 
   1183 // isStale and computeBuildID
   1184 //
   1185 // Theory of Operation
   1186 //
   1187 // There is an installed copy of the package (or binary).
   1188 // Can we reuse the installed copy, or do we need to build a new one?
   1189 //
   1190 // We can use the installed copy if it matches what we'd get
   1191 // by building a new one. The hard part is predicting that without
   1192 // actually running a build.
   1193 //
   1194 // To start, we must know the set of inputs to the build process that can
   1195 // affect the generated output. At a minimum, that includes the source
   1196 // files for the package and also any compiled packages imported by those
   1197 // source files. The *Package has these, and we use them. One might also
   1198 // argue for including in the input set: the build tags, whether the race
   1199 // detector is in use, the target operating system and architecture, the
   1200 // compiler and linker binaries being used, the additional flags being
   1201 // passed to those, the cgo binary being used, the additional flags cgo
   1202 // passes to the host C compiler, the host C compiler being used, the set
   1203 // of host C include files and installed C libraries, and so on.
   1204 // We include some but not all of this information.
   1205 //
   1206 // Once we have decided on a set of inputs, we must next decide how to
   1207 // tell whether the content of that set has changed since the last build
   1208 // of p. If there have been no changes, then we assume a new build would
   1209 // produce the same result and reuse the installed package or binary.
   1210 // But if there have been changes, then we assume a new build might not
   1211 // produce the same result, so we rebuild.
   1212 //
   1213 // There are two common ways to decide whether the content of the set has
   1214 // changed: modification times and content hashes. We use a mixture of both.
   1215 //
   1216 // The use of modification times (mtimes) was pioneered by make:
   1217 // assuming that a file's mtime is an accurate record of when that file was last written,
   1218 // and assuming that the modification time of an installed package or
   1219 // binary is the time that it was built, if the mtimes of the inputs
   1220 // predate the mtime of the installed object, then the build of that
   1221 // object saw those versions of the files, and therefore a rebuild using
   1222 // those same versions would produce the same object. In contrast, if any
   1223 // mtime of an input is newer than the mtime of the installed object, a
   1224 // change has occurred since the build, and the build should be redone.
   1225 //
   1226 // Modification times are attractive because the logic is easy to
   1227 // understand and the file system maintains the mtimes automatically
   1228 // (less work for us). Unfortunately, there are a variety of ways in
   1229 // which the mtime approach fails to detect a change and reuses a stale
   1230 // object file incorrectly. (Making the opposite mistake, rebuilding
   1231 // unnecessarily, is only a performance problem and not a correctness
   1232 // problem, so we ignore that one.)
   1233 //
   1234 // As a warmup, one problem is that to be perfectly precise, we need to
   1235 // compare the input mtimes against the time at the beginning of the
   1236 // build, but the object file time is the time at the end of the build.
   1237 // If an input file changes after being read but before the object is
   1238 // written, the next build will see an object newer than the input and
   1239 // will incorrectly decide that the object is up to date. We make no
   1240 // attempt to detect or solve this problem.
   1241 //
   1242 // Another problem is that due to file system imprecision, an input and
   1243 // output that are actually ordered in time have the same mtime.
   1244 // This typically happens on file systems with 1-second (or, worse,
   1245 // 2-second) mtime granularity and with automated scripts that write an
   1246 // input and then immediately run a build, or vice versa. If an input and
   1247 // an output have the same mtime, the conservative behavior is to treat
   1248 // the output as out-of-date and rebuild. This can cause one or more
   1249 // spurious rebuilds, but only for 1 second, until the object finally has
   1250 // an mtime later than the input.
   1251 //
   1252 // Another problem is that binary distributions often set the mtime on
   1253 // all files to the same time. If the distribution includes both inputs
   1254 // and cached build outputs, the conservative solution to the previous
   1255 // problem will cause unnecessary rebuilds. Worse, in such a binary
   1256 // distribution, those rebuilds might not even have permission to update
   1257 // the cached build output. To avoid these write errors, if an input and
   1258 // output have the same mtime, we assume the output is up-to-date.
   1259 // This is the opposite of what the previous problem would have us do,
   1260 // but binary distributions are more common than instances of the
   1261 // previous problem.
   1262 //
   1263 // A variant of the last problem is that some binary distributions do not
   1264 // set the mtime on all files to the same time. Instead they let the file
   1265 // system record mtimes as the distribution is unpacked. If the outputs
   1266 // are unpacked before the inputs, they'll be older and a build will try
   1267 // to rebuild them. That rebuild might hit the same write errors as in
   1268 // the last scenario. We don't make any attempt to solve this, and we
   1269 // haven't had many reports of it. Perhaps the only time this happens is
   1270 // when people manually unpack the distribution, and most of the time
   1271 // that's done as the same user who will be using it, so an initial
   1272 // rebuild on first use succeeds quietly.
   1273 //
   1274 // More generally, people and programs change mtimes on files. The last
   1275 // few problems were specific examples of this, but it's a general problem.
   1276 // For example, instead of a binary distribution, copying a home
   1277 // directory from one directory or machine to another might copy files
   1278 // but not preserve mtimes. If the inputs are new than the outputs on the
   1279 // first machine but copied first, they end up older than the outputs on
   1280 // the second machine.
   1281 //
   1282 // Because many other build systems have the same sensitivity to mtimes,
   1283 // most programs manipulating source code take pains not to break the
   1284 // mtime assumptions. For example, Git does not set the mtime of files
   1285 // during a checkout operation, even when checking out an old version of
   1286 // the code. This decision was made specifically to work well with
   1287 // mtime-based build systems.
   1288 //
   1289 // The killer problem, though, for mtime-based build systems is that the
   1290 // build only has access to the mtimes of the inputs that still exist.
   1291 // If it is possible to remove an input without changing any other inputs,
   1292 // a later build will think the object is up-to-date when it is not.
   1293 // This happens for Go because a package is made up of all source
   1294 // files in a directory. If a source file is removed, there is no newer
   1295 // mtime available recording that fact. The mtime on the directory could
   1296 // be used, but it also changes when unrelated files are added to or
   1297 // removed from the directory, so including the directory mtime would
   1298 // cause unnecessary rebuilds, possibly many. It would also exacerbate
   1299 // the problems mentioned earlier, since even programs that are careful
   1300 // to maintain mtimes on files rarely maintain mtimes on directories.
   1301 //
   1302 // A variant of the last problem is when the inputs change for other
   1303 // reasons. For example, Go 1.4 and Go 1.5 both install $GOPATH/src/mypkg
   1304 // into the same target, $GOPATH/pkg/$GOOS_$GOARCH/mypkg.a.
   1305 // If Go 1.4 has built mypkg into mypkg.a, a build using Go 1.5 must
   1306 // rebuild mypkg.a, but from mtimes alone mypkg.a looks up-to-date.
   1307 // If Go 1.5 has just been installed, perhaps the compiler will have a
   1308 // newer mtime; since the compiler is considered an input, that would
   1309 // trigger a rebuild. But only once, and only the last Go 1.4 build of
   1310 // mypkg.a happened before Go 1.5 was installed. If a user has the two
   1311 // versions installed in different locations and flips back and forth,
   1312 // mtimes alone cannot tell what to do. Changing the toolchain is
   1313 // changing the set of inputs, without affecting any mtimes.
   1314 //
   1315 // To detect the set of inputs changing, we turn away from mtimes and to
   1316 // an explicit data comparison. Specifically, we build a list of the
   1317 // inputs to the build, compute its SHA1 hash, and record that as the
   1318 // ``build ID'' in the generated object. At the next build, we can
   1319 // recompute the build ID and compare it to the one in the generated
   1320 // object. If they differ, the list of inputs has changed, so the object
   1321 // is out of date and must be rebuilt.
   1322 //
   1323 // Because this build ID is computed before the build begins, the
   1324 // comparison does not have the race that mtime comparison does.
   1325 //
   1326 // Making the build sensitive to changes in other state is
   1327 // straightforward: include the state in the build ID hash, and if it
   1328 // changes, so does the build ID, triggering a rebuild.
   1329 //
   1330 // To detect changes in toolchain, we include the toolchain version in
   1331 // the build ID hash for package runtime, and then we include the build
   1332 // IDs of all imported packages in the build ID for p.
   1333 //
   1334 // It is natural to think about including build tags in the build ID, but
   1335 // the naive approach of just dumping the tags into the hash would cause
   1336 // spurious rebuilds. For example, 'go install' and 'go install -tags neverusedtag'
   1337 // produce the same binaries (assuming neverusedtag is never used).
   1338 // A more precise approach would be to include only tags that have an
   1339 // effect on the build. But the effect of a tag on the build is to
   1340 // include or exclude a file from the compilation, and that file list is
   1341 // already in the build ID hash. So the build ID is already tag-sensitive
   1342 // in a perfectly precise way. So we do NOT explicitly add build tags to
   1343 // the build ID hash.
   1344 //
   1345 // We do not include as part of the build ID the operating system,
   1346 // architecture, or whether the race detector is enabled, even though all
   1347 // three have an effect on the output, because that information is used
   1348 // to decide the install location. Binaries for linux and binaries for
   1349 // darwin are written to different directory trees; including that
   1350 // information in the build ID is unnecessary (although it would be
   1351 // harmless).
   1352 //
   1353 // TODO(rsc): Investigate the cost of putting source file content into
   1354 // the build ID hash as a replacement for the use of mtimes. Using the
   1355 // file content would avoid all the mtime problems, but it does require
   1356 // reading all the source files, something we avoid today (we read the
   1357 // beginning to find the build tags and the imports, but we stop as soon
   1358 // as we see the import block is over). If the package is stale, the compiler
   1359 // is going to read the files anyway. But if the package is up-to-date, the
   1360 // read is overhead.
   1361 //
   1362 // TODO(rsc): Investigate the complexity of making the build more
   1363 // precise about when individual results are needed. To be fully precise,
   1364 // there are two results of a compilation: the entire .a file used by the link
   1365 // and the subpiece used by later compilations (__.PKGDEF only).
   1366 // If a rebuild is needed but produces the previous __.PKGDEF, then
   1367 // no more recompilation due to the rebuilt package is needed, only
   1368 // relinking. To date, there is nothing in the Go command to express this.
   1369 //
   1370 // Special Cases
   1371 //
   1372 // When the go command makes the wrong build decision and does not
   1373 // rebuild something it should, users fall back to adding the -a flag.
   1374 // Any common use of the -a flag should be considered prima facie evidence
   1375 // that isStale is returning an incorrect false result in some important case.
   1376 // Bugs reported in the behavior of -a itself should prompt the question
   1377 // ``Why is -a being used at all? What bug does that indicate?''
   1378 //
   1379 // There is a long history of changes to isStale to try to make -a into a
   1380 // suitable workaround for bugs in the mtime-based decisions.
   1381 // It is worth recording that history to inform (and, as much as possible, deter) future changes.
   1382 //
   1383 // (1) Before the build IDs were introduced, building with alternate tags
   1384 // would happily reuse installed objects built without those tags.
   1385 // For example, "go build -tags netgo myprog.go" would use the installed
   1386 // copy of package net, even if that copy had been built without netgo.
   1387 // (The netgo tag controls whether package net uses cgo or pure Go for
   1388 // functionality such as name resolution.)
   1389 // Using the installed non-netgo package defeats the purpose.
   1390 //
   1391 // Users worked around this with "go build -tags netgo -a myprog.go".
   1392 //
   1393 // Build IDs have made that workaround unnecessary:
   1394 // "go build -tags netgo myprog.go"
   1395 // cannot use a non-netgo copy of package net.
   1396 //
   1397 // (2) Before the build IDs were introduced, building with different toolchains,
   1398 // especially changing between toolchains, tried to reuse objects stored in
   1399 // $GOPATH/pkg, resulting in link-time errors about object file mismatches.
   1400 //
   1401 // Users worked around this with "go install -a ./...".
   1402 //
   1403 // Build IDs have made that workaround unnecessary:
   1404 // "go install ./..." will rebuild any objects it finds that were built against
   1405 // a different toolchain.
   1406 //
   1407 // (3) The common use of "go install -a ./..." led to reports of problems
   1408 // when the -a forced the rebuild of the standard library, which for some
   1409 // users was not writable. Because we didn't understand that the real
   1410 // problem was the bug -a was working around, we changed -a not to
   1411 // apply to the standard library.
   1412 //
   1413 // (4) The common use of "go build -tags netgo -a myprog.go" broke
   1414 // when we changed -a not to apply to the standard library, because
   1415 // if go build doesn't rebuild package net, it uses the non-netgo version.
   1416 //
   1417 // Users worked around this with "go build -tags netgo -installsuffix barf myprog.go".
   1418 // The -installsuffix here is making the go command look for packages
   1419 // in pkg/$GOOS_$GOARCH_barf instead of pkg/$GOOS_$GOARCH.
   1420 // Since the former presumably doesn't exist, go build decides to rebuild
   1421 // everything, including the standard library. Since go build doesn't
   1422 // install anything it builds, nothing is ever written to pkg/$GOOS_$GOARCH_barf,
   1423 // so repeated invocations continue to work.
   1424 //
   1425 // If the use of -a wasn't a red flag, the use of -installsuffix to point to
   1426 // a non-existent directory in a command that installs nothing should
   1427 // have been.
   1428 //
   1429 // (5) Now that (1) and (2) no longer need -a, we have removed the kludge
   1430 // introduced in (3): once again, -a means ``rebuild everything,'' not
   1431 // ``rebuild everything except the standard library.'' Only Go 1.4 had
   1432 // the restricted meaning.
   1433 //
   1434 // In addition to these cases trying to trigger rebuilds, there are
   1435 // special cases trying NOT to trigger rebuilds. The main one is that for
   1436 // a variety of reasons (see above), the install process for a Go release
   1437 // cannot be relied upon to set the mtimes such that the go command will
   1438 // think the standard library is up to date. So the mtime evidence is
   1439 // ignored for the standard library if we find ourselves in a release
   1440 // version of Go. Build ID-based staleness checks still apply to the
   1441 // standard library, even in release versions. This makes
   1442 // 'go build -tags netgo' work, among other things.
   1443 
   1444 // isStale reports whether package p needs to be rebuilt,
   1445 // along with the reason why.
   1446 func isStale(p *Package) (bool, string) {
   1447 	if p.Standard && (p.ImportPath == "unsafe" || buildContext.Compiler == "gccgo") {
   1448 		// fake, builtin package
   1449 		return false, "builtin package"
   1450 	}
   1451 	if p.Error != nil {
   1452 		return true, "errors loading package"
   1453 	}
   1454 	if p.Stale {
   1455 		return true, p.StaleReason
   1456 	}
   1457 
   1458 	// If this is a package with no source code, it cannot be rebuilt.
   1459 	// If the binary is missing, we mark the package stale so that
   1460 	// if a rebuild is needed, that rebuild attempt will produce a useful error.
   1461 	// (Some commands, such as 'go list', do not attempt to rebuild.)
   1462 	if p.BinaryOnly {
   1463 		if p.target == "" {
   1464 			// Fail if a build is attempted.
   1465 			return true, "no source code for package, but no install target"
   1466 		}
   1467 		if _, err := os.Stat(p.target); err != nil {
   1468 			// Fail if a build is attempted.
   1469 			return true, "no source code for package, but cannot access install target: " + err.Error()
   1470 		}
   1471 		return false, "no source code for package"
   1472 	}
   1473 
   1474 	// If the -a flag is given, rebuild everything.
   1475 	if buildA {
   1476 		return true, "build -a flag in use"
   1477 	}
   1478 
   1479 	// If there's no install target, we have to rebuild.
   1480 	if p.target == "" {
   1481 		return true, "no install target"
   1482 	}
   1483 
   1484 	// Package is stale if completely unbuilt.
   1485 	fi, err := os.Stat(p.target)
   1486 	if err != nil {
   1487 		return true, "cannot stat install target"
   1488 	}
   1489 
   1490 	// Package is stale if the expected build ID differs from the
   1491 	// recorded build ID. This catches changes like a source file
   1492 	// being removed from a package directory. See issue 3895.
   1493 	// It also catches changes in build tags that affect the set of
   1494 	// files being compiled. See issue 9369.
   1495 	// It also catches changes in toolchain, like when flipping between
   1496 	// two versions of Go compiling a single GOPATH.
   1497 	// See issue 8290 and issue 10702.
   1498 	targetBuildID, err := readBuildID(p)
   1499 	if err == nil && targetBuildID != p.buildID {
   1500 		return true, "build ID mismatch"
   1501 	}
   1502 
   1503 	// Package is stale if a dependency is.
   1504 	for _, p1 := range p.deps {
   1505 		if p1.Stale {
   1506 			return true, "stale dependency"
   1507 		}
   1508 	}
   1509 
   1510 	// The checks above are content-based staleness.
   1511 	// We assume they are always accurate.
   1512 	//
   1513 	// The checks below are mtime-based staleness.
   1514 	// We hope they are accurate, but we know that they fail in the case of
   1515 	// prebuilt Go installations that don't preserve the build mtimes
   1516 	// (for example, if the pkg/ mtimes are before the src/ mtimes).
   1517 	// See the large comment above isStale for details.
   1518 
   1519 	// If we are running a release copy of Go and didn't find a content-based
   1520 	// reason to rebuild the standard packages, do not rebuild them.
   1521 	// They may not be writable anyway, but they are certainly not changing.
   1522 	// This makes 'go build' skip the standard packages when
   1523 	// using an official release, even when the mtimes have been changed.
   1524 	// See issue 3036, issue 3149, issue 4106, issue 8290.
   1525 	// (If a change to a release tree must be made by hand, the way to force the
   1526 	// install is to run make.bash, which will remove the old package archives
   1527 	// before rebuilding.)
   1528 	if p.Standard && isGoRelease {
   1529 		return false, "standard package in Go release distribution"
   1530 	}
   1531 
   1532 	// Time-based staleness.
   1533 
   1534 	built := fi.ModTime()
   1535 
   1536 	olderThan := func(file string) bool {
   1537 		fi, err := os.Stat(file)
   1538 		return err != nil || fi.ModTime().After(built)
   1539 	}
   1540 
   1541 	// Package is stale if a dependency is, or if a dependency is newer.
   1542 	for _, p1 := range p.deps {
   1543 		if p1.target != "" && olderThan(p1.target) {
   1544 			return true, "newer dependency"
   1545 		}
   1546 	}
   1547 
   1548 	// As a courtesy to developers installing new versions of the compiler
   1549 	// frequently, define that packages are stale if they are
   1550 	// older than the compiler, and commands if they are older than
   1551 	// the linker. This heuristic will not work if the binaries are
   1552 	// back-dated, as some binary distributions may do, but it does handle
   1553 	// a very common case.
   1554 	// See issue 3036.
   1555 	// Exclude $GOROOT, under the assumption that people working on
   1556 	// the compiler may want to control when everything gets rebuilt,
   1557 	// and people updating the Go repository will run make.bash or all.bash
   1558 	// and get a full rebuild anyway.
   1559 	// Excluding $GOROOT used to also fix issue 4106, but that's now
   1560 	// taken care of above (at least when the installed Go is a released version).
   1561 	if p.Root != goroot {
   1562 		if olderThan(buildToolchain.compiler()) {
   1563 			return true, "newer compiler"
   1564 		}
   1565 		if p.build.IsCommand() && olderThan(buildToolchain.linker()) {
   1566 			return true, "newer linker"
   1567 		}
   1568 	}
   1569 
   1570 	// Note: Until Go 1.5, we had an additional shortcut here.
   1571 	// We built a list of the workspace roots ($GOROOT, each $GOPATH)
   1572 	// containing targets directly named on the command line,
   1573 	// and if p were not in any of those, it would be treated as up-to-date
   1574 	// as long as it is built. The goal was to avoid rebuilding a system-installed
   1575 	// $GOROOT, unless something from $GOROOT were explicitly named
   1576 	// on the command line (like go install math).
   1577 	// That's now handled by the isGoRelease clause above.
   1578 	// The other effect of the shortcut was to isolate different entries in
   1579 	// $GOPATH from each other. This had the unfortunate effect that
   1580 	// if you had (say), GOPATH listing two entries, one for commands
   1581 	// and one for libraries, and you did a 'git pull' in the library one
   1582 	// and then tried 'go install commands/...', it would build the new libraries
   1583 	// during the first build (because they wouldn't have been installed at all)
   1584 	// but then subsequent builds would not rebuild the libraries, even if the
   1585 	// mtimes indicate they are stale, because the different GOPATH entries
   1586 	// were treated differently. This behavior was confusing when using
   1587 	// non-trivial GOPATHs, which were particularly common with some
   1588 	// code management conventions, like the original godep.
   1589 	// Since the $GOROOT case (the original motivation) is handled separately,
   1590 	// we no longer put a barrier between the different $GOPATH entries.
   1591 	//
   1592 	// One implication of this is that if there is a system directory for
   1593 	// non-standard Go packages that is included in $GOPATH, the mtimes
   1594 	// on those compiled packages must be no earlier than the mtimes
   1595 	// on the source files. Since most distributions use the same mtime
   1596 	// for all files in a tree, they will be unaffected. People using plain
   1597 	// tar x to extract system-installed packages will need to adjust mtimes,
   1598 	// but it's better to force them to get the mtimes right than to ignore
   1599 	// the mtimes and thereby do the wrong thing in common use cases.
   1600 	//
   1601 	// So there is no GOPATH vs GOPATH shortcut here anymore.
   1602 	//
   1603 	// If something needs to come back here, we could try writing a dummy
   1604 	// file with a random name to the $GOPATH/pkg directory (and removing it)
   1605 	// to test for write access, and then skip GOPATH roots we don't have write
   1606 	// access to. But hopefully we can just use the mtimes always.
   1607 
   1608 	srcs := stringList(p.GoFiles, p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.CgoFiles, p.SysoFiles, p.SwigFiles, p.SwigCXXFiles)
   1609 	for _, src := range srcs {
   1610 		if olderThan(filepath.Join(p.Dir, src)) {
   1611 			return true, "newer source file"
   1612 		}
   1613 	}
   1614 
   1615 	return false, ""
   1616 }
   1617 
   1618 // computeBuildID computes the build ID for p, leaving it in p.buildID.
   1619 // Build ID is a hash of the information we want to detect changes in.
   1620 // See the long comment in isStale for details.
   1621 func computeBuildID(p *Package) {
   1622 	h := sha1.New()
   1623 
   1624 	// Include the list of files compiled as part of the package.
   1625 	// This lets us detect removed files. See issue 3895.
   1626 	inputFiles := stringList(
   1627 		p.GoFiles,
   1628 		p.CgoFiles,
   1629 		p.CFiles,
   1630 		p.CXXFiles,
   1631 		p.MFiles,
   1632 		p.HFiles,
   1633 		p.SFiles,
   1634 		p.SysoFiles,
   1635 		p.SwigFiles,
   1636 		p.SwigCXXFiles,
   1637 	)
   1638 	for _, file := range inputFiles {
   1639 		fmt.Fprintf(h, "file %s\n", file)
   1640 	}
   1641 
   1642 	// Include the content of runtime/internal/sys/zversion.go in the hash
   1643 	// for package runtime. This will give package runtime a
   1644 	// different build ID in each Go release.
   1645 	if p.Standard && p.ImportPath == "runtime/internal/sys" && buildContext.Compiler != "gccgo" {
   1646 		data, err := ioutil.ReadFile(filepath.Join(p.Dir, "zversion.go"))
   1647 		if err != nil {
   1648 			fatalf("go: %s", err)
   1649 		}
   1650 		fmt.Fprintf(h, "zversion %q\n", string(data))
   1651 	}
   1652 
   1653 	// Include the build IDs of any dependencies in the hash.
   1654 	// This, combined with the runtime/zversion content,
   1655 	// will cause packages to have different build IDs when
   1656 	// compiled with different Go releases.
   1657 	// This helps the go command know to recompile when
   1658 	// people use the same GOPATH but switch between
   1659 	// different Go releases. See issue 10702.
   1660 	// This is also a better fix for issue 8290.
   1661 	for _, p1 := range p.deps {
   1662 		fmt.Fprintf(h, "dep %s %s\n", p1.ImportPath, p1.buildID)
   1663 	}
   1664 
   1665 	p.buildID = fmt.Sprintf("%x", h.Sum(nil))
   1666 }
   1667 
   1668 var cwd, _ = os.Getwd()
   1669 
   1670 var cmdCache = map[string]*Package{}
   1671 
   1672 // loadPackage is like loadImport but is used for command-line arguments,
   1673 // not for paths found in import statements. In addition to ordinary import paths,
   1674 // loadPackage accepts pseudo-paths beginning with cmd/ to denote commands
   1675 // in the Go command directory, as well as paths to those directories.
   1676 func loadPackage(arg string, stk *importStack) *Package {
   1677 	if build.IsLocalImport(arg) {
   1678 		dir := arg
   1679 		if !filepath.IsAbs(dir) {
   1680 			if abs, err := filepath.Abs(dir); err == nil {
   1681 				// interpret relative to current directory
   1682 				dir = abs
   1683 			}
   1684 		}
   1685 		if sub, ok := hasSubdir(gorootSrc, dir); ok && strings.HasPrefix(sub, "cmd/") && !strings.Contains(sub[4:], "/") {
   1686 			arg = sub
   1687 		}
   1688 	}
   1689 	if strings.HasPrefix(arg, "cmd/") && !strings.Contains(arg[4:], "/") {
   1690 		if p := cmdCache[arg]; p != nil {
   1691 			return p
   1692 		}
   1693 		stk.push(arg)
   1694 		defer stk.pop()
   1695 
   1696 		bp, err := buildContext.ImportDir(filepath.Join(gorootSrc, arg), 0)
   1697 		bp.ImportPath = arg
   1698 		bp.Goroot = true
   1699 		bp.BinDir = gorootBin
   1700 		if gobin != "" {
   1701 			bp.BinDir = gobin
   1702 		}
   1703 		bp.Root = goroot
   1704 		bp.SrcRoot = gorootSrc
   1705 		p := new(Package)
   1706 		cmdCache[arg] = p
   1707 		p.load(stk, bp, err)
   1708 		if p.Error == nil && p.Name != "main" {
   1709 			p.Error = &PackageError{
   1710 				ImportStack: stk.copy(),
   1711 				Err:         fmt.Sprintf("expected package main but found package %s in %s", p.Name, p.Dir),
   1712 			}
   1713 		}
   1714 		return p
   1715 	}
   1716 
   1717 	// Wasn't a command; must be a package.
   1718 	// If it is a local import path but names a standard package,
   1719 	// we treat it as if the user specified the standard package.
   1720 	// This lets you run go test ./ioutil in package io and be
   1721 	// referring to io/ioutil rather than a hypothetical import of
   1722 	// "./ioutil".
   1723 	if build.IsLocalImport(arg) {
   1724 		bp, _ := buildContext.ImportDir(filepath.Join(cwd, arg), build.FindOnly)
   1725 		if bp.ImportPath != "" && bp.ImportPath != "." {
   1726 			arg = bp.ImportPath
   1727 		}
   1728 	}
   1729 
   1730 	return loadImport(arg, cwd, nil, stk, nil, 0)
   1731 }
   1732 
   1733 // packages returns the packages named by the
   1734 // command line arguments 'args'.  If a named package
   1735 // cannot be loaded at all (for example, if the directory does not exist),
   1736 // then packages prints an error and does not include that
   1737 // package in the results. However, if errors occur trying
   1738 // to load dependencies of a named package, the named
   1739 // package is still returned, with p.Incomplete = true
   1740 // and details in p.DepsErrors.
   1741 func packages(args []string) []*Package {
   1742 	var pkgs []*Package
   1743 	for _, pkg := range packagesAndErrors(args) {
   1744 		if pkg.Error != nil {
   1745 			errorf("can't load package: %s", pkg.Error)
   1746 			continue
   1747 		}
   1748 		pkgs = append(pkgs, pkg)
   1749 	}
   1750 	return pkgs
   1751 }
   1752 
   1753 // packagesAndErrors is like 'packages' but returns a
   1754 // *Package for every argument, even the ones that
   1755 // cannot be loaded at all.
   1756 // The packages that fail to load will have p.Error != nil.
   1757 func packagesAndErrors(args []string) []*Package {
   1758 	if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
   1759 		return []*Package{goFilesPackage(args)}
   1760 	}
   1761 
   1762 	args = importPaths(args)
   1763 	var (
   1764 		pkgs    []*Package
   1765 		stk     importStack
   1766 		seenArg = make(map[string]bool)
   1767 		seenPkg = make(map[*Package]bool)
   1768 	)
   1769 
   1770 	for _, arg := range args {
   1771 		if seenArg[arg] {
   1772 			continue
   1773 		}
   1774 		seenArg[arg] = true
   1775 		pkg := loadPackage(arg, &stk)
   1776 		if seenPkg[pkg] {
   1777 			continue
   1778 		}
   1779 		seenPkg[pkg] = true
   1780 		pkgs = append(pkgs, pkg)
   1781 	}
   1782 	computeStale(pkgs...)
   1783 
   1784 	return pkgs
   1785 }
   1786 
   1787 // packagesForBuild is like 'packages' but fails if any of
   1788 // the packages or their dependencies have errors
   1789 // (cannot be built).
   1790 func packagesForBuild(args []string) []*Package {
   1791 	pkgs := packagesAndErrors(args)
   1792 	printed := map[*PackageError]bool{}
   1793 	for _, pkg := range pkgs {
   1794 		if pkg.Error != nil {
   1795 			errorf("can't load package: %s", pkg.Error)
   1796 		}
   1797 		for _, err := range pkg.DepsErrors {
   1798 			// Since these are errors in dependencies,
   1799 			// the same error might show up multiple times,
   1800 			// once in each package that depends on it.
   1801 			// Only print each once.
   1802 			if !printed[err] {
   1803 				printed[err] = true
   1804 				errorf("%s", err)
   1805 			}
   1806 		}
   1807 	}
   1808 	exitIfErrors()
   1809 
   1810 	// Check for duplicate loads of the same package.
   1811 	// That should be impossible, but if it does happen then
   1812 	// we end up trying to build the same package twice,
   1813 	// usually in parallel overwriting the same files,
   1814 	// which doesn't work very well.
   1815 	seen := map[string]bool{}
   1816 	reported := map[string]bool{}
   1817 	for _, pkg := range packageList(pkgs) {
   1818 		if seen[pkg.ImportPath] && !reported[pkg.ImportPath] {
   1819 			reported[pkg.ImportPath] = true
   1820 			errorf("internal error: duplicate loads of %s", pkg.ImportPath)
   1821 		}
   1822 		seen[pkg.ImportPath] = true
   1823 	}
   1824 	exitIfErrors()
   1825 
   1826 	return pkgs
   1827 }
   1828 
   1829 // hasSubdir reports whether dir is a subdirectory of
   1830 // (possibly multiple levels below) root.
   1831 // If so, it sets rel to the path fragment that must be
   1832 // appended to root to reach dir.
   1833 func hasSubdir(root, dir string) (rel string, ok bool) {
   1834 	if p, err := filepath.EvalSymlinks(root); err == nil {
   1835 		root = p
   1836 	}
   1837 	if p, err := filepath.EvalSymlinks(dir); err == nil {
   1838 		dir = p
   1839 	}
   1840 	const sep = string(filepath.Separator)
   1841 	root = filepath.Clean(root)
   1842 	if !strings.HasSuffix(root, sep) {
   1843 		root += sep
   1844 	}
   1845 	dir = filepath.Clean(dir)
   1846 	if !strings.HasPrefix(dir, root) {
   1847 		return "", false
   1848 	}
   1849 	return filepath.ToSlash(dir[len(root):]), true
   1850 }
   1851 
   1852 var (
   1853 	errBuildIDToolchain = fmt.Errorf("build ID only supported in gc toolchain")
   1854 	errBuildIDMalformed = fmt.Errorf("malformed object file")
   1855 	errBuildIDUnknown   = fmt.Errorf("lost build ID")
   1856 )
   1857 
   1858 var (
   1859 	bangArch = []byte("!<arch>")
   1860 	pkgdef   = []byte("__.PKGDEF")
   1861 	goobject = []byte("go object ")
   1862 	buildid  = []byte("build id ")
   1863 )
   1864 
   1865 // readBuildID reads the build ID from an archive or binary.
   1866 // It only supports the gc toolchain.
   1867 // Other toolchain maintainers should adjust this function.
   1868 func readBuildID(p *Package) (id string, err error) {
   1869 	if buildToolchain != (gcToolchain{}) {
   1870 		return "", errBuildIDToolchain
   1871 	}
   1872 
   1873 	// For commands, read build ID directly from binary.
   1874 	if p.Name == "main" {
   1875 		return ReadBuildIDFromBinary(p.Target)
   1876 	}
   1877 
   1878 	// Otherwise, we expect to have an archive (.a) file,
   1879 	// and we can read the build ID from the Go export data.
   1880 	if !strings.HasSuffix(p.Target, ".a") {
   1881 		return "", &os.PathError{Op: "parse", Path: p.Target, Err: errBuildIDUnknown}
   1882 	}
   1883 
   1884 	// Read just enough of the target to fetch the build ID.
   1885 	// The archive is expected to look like:
   1886 	//
   1887 	//	!<arch>
   1888 	//	__.PKGDEF       0           0     0     644     7955      `
   1889 	//	go object darwin amd64 devel X:none
   1890 	//	build id "b41e5c45250e25c9fd5e9f9a1de7857ea0d41224"
   1891 	//
   1892 	// The variable-sized strings are GOOS, GOARCH, and the experiment list (X:none).
   1893 	// Reading the first 1024 bytes should be plenty.
   1894 	f, err := os.Open(p.Target)
   1895 	if err != nil {
   1896 		return "", err
   1897 	}
   1898 	data := make([]byte, 1024)
   1899 	n, err := io.ReadFull(f, data)
   1900 	f.Close()
   1901 
   1902 	if err != nil && n == 0 {
   1903 		return "", err
   1904 	}
   1905 
   1906 	bad := func() (string, error) {
   1907 		return "", &os.PathError{Op: "parse", Path: p.Target, Err: errBuildIDMalformed}
   1908 	}
   1909 
   1910 	// Archive header.
   1911 	for i := 0; ; i++ { // returns during i==3
   1912 		j := bytes.IndexByte(data, '\n')
   1913 		if j < 0 {
   1914 			return bad()
   1915 		}
   1916 		line := data[:j]
   1917 		data = data[j+1:]
   1918 		switch i {
   1919 		case 0:
   1920 			if !bytes.Equal(line, bangArch) {
   1921 				return bad()
   1922 			}
   1923 		case 1:
   1924 			if !bytes.HasPrefix(line, pkgdef) {
   1925 				return bad()
   1926 			}
   1927 		case 2:
   1928 			if !bytes.HasPrefix(line, goobject) {
   1929 				return bad()
   1930 			}
   1931 		case 3:
   1932 			if !bytes.HasPrefix(line, buildid) {
   1933 				// Found the object header, just doesn't have a build id line.
   1934 				// Treat as successful, with empty build id.
   1935 				return "", nil
   1936 			}
   1937 			id, err := strconv.Unquote(string(line[len(buildid):]))
   1938 			if err != nil {
   1939 				return bad()
   1940 			}
   1941 			return id, nil
   1942 		}
   1943 	}
   1944 }
   1945 
   1946 var (
   1947 	goBuildPrefix = []byte("\xff Go build ID: \"")
   1948 	goBuildEnd    = []byte("\"\n \xff")
   1949 
   1950 	elfPrefix = []byte("\x7fELF")
   1951 
   1952 	machoPrefixes = [][]byte{
   1953 		{0xfe, 0xed, 0xfa, 0xce},
   1954 		{0xfe, 0xed, 0xfa, 0xcf},
   1955 		{0xce, 0xfa, 0xed, 0xfe},
   1956 		{0xcf, 0xfa, 0xed, 0xfe},
   1957 	}
   1958 )
   1959 
   1960 var BuildIDReadSize = 32 * 1024 // changed for testing
   1961 
   1962 // ReadBuildIDFromBinary reads the build ID from a binary.
   1963 //
   1964 // ELF binaries store the build ID in a proper PT_NOTE section.
   1965 //
   1966 // Other binary formats are not so flexible. For those, the linker
   1967 // stores the build ID as non-instruction bytes at the very beginning
   1968 // of the text segment, which should appear near the beginning
   1969 // of the file. This is clumsy but fairly portable. Custom locations
   1970 // can be added for other binary types as needed, like we did for ELF.
   1971 func ReadBuildIDFromBinary(filename string) (id string, err error) {
   1972 	if filename == "" {
   1973 		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDUnknown}
   1974 	}
   1975 
   1976 	// Read the first 32 kB of the binary file.
   1977 	// That should be enough to find the build ID.
   1978 	// In ELF files, the build ID is in the leading headers,
   1979 	// which are typically less than 4 kB, not to mention 32 kB.
   1980 	// In Mach-O files, there's no limit, so we have to parse the file.
   1981 	// On other systems, we're trying to read enough that
   1982 	// we get the beginning of the text segment in the read.
   1983 	// The offset where the text segment begins in a hello
   1984 	// world compiled for each different object format today:
   1985 	//
   1986 	//	Plan 9: 0x20
   1987 	//	Windows: 0x600
   1988 	//
   1989 	f, err := os.Open(filename)
   1990 	if err != nil {
   1991 		return "", err
   1992 	}
   1993 	defer f.Close()
   1994 
   1995 	data := make([]byte, BuildIDReadSize)
   1996 	_, err = io.ReadFull(f, data)
   1997 	if err == io.ErrUnexpectedEOF {
   1998 		err = nil
   1999 	}
   2000 	if err != nil {
   2001 		return "", err
   2002 	}
   2003 
   2004 	if bytes.HasPrefix(data, elfPrefix) {
   2005 		return readELFGoBuildID(filename, f, data)
   2006 	}
   2007 	for _, m := range machoPrefixes {
   2008 		if bytes.HasPrefix(data, m) {
   2009 			return readMachoGoBuildID(filename, f, data)
   2010 		}
   2011 	}
   2012 
   2013 	return readRawGoBuildID(filename, data)
   2014 }
   2015 
   2016 // readRawGoBuildID finds the raw build ID stored in text segment data.
   2017 func readRawGoBuildID(filename string, data []byte) (id string, err error) {
   2018 	i := bytes.Index(data, goBuildPrefix)
   2019 	if i < 0 {
   2020 		// Missing. Treat as successful but build ID empty.
   2021 		return "", nil
   2022 	}
   2023 
   2024 	j := bytes.Index(data[i+len(goBuildPrefix):], goBuildEnd)
   2025 	if j < 0 {
   2026 		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDMalformed}
   2027 	}
   2028 
   2029 	quoted := data[i+len(goBuildPrefix)-1 : i+len(goBuildPrefix)+j+1]
   2030 	id, err = strconv.Unquote(string(quoted))
   2031 	if err != nil {
   2032 		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDMalformed}
   2033 	}
   2034 
   2035 	return id, nil
   2036 }
   2037