github.com/FenixAra/go@v0.0.0-20170127160404-96ea0918e670/src/cmd/go/pkg.go (about) 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 }