github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/cmd/go/not-internal/load/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 load loads packages. 6 package load 7 8 import ( 9 "bytes" 10 "encoding/json" 11 "errors" 12 "fmt" 13 "go/build" 14 "go/scanner" 15 "go/token" 16 "io/ioutil" 17 "os" 18 pathpkg "path" 19 "path/filepath" 20 "runtime" 21 "sort" 22 "strconv" 23 "strings" 24 "unicode" 25 "unicode/utf8" 26 27 "github.com/gagliardetto/golang-go/cmd/go/not-internal/base" 28 "github.com/gagliardetto/golang-go/cmd/go/not-internal/cfg" 29 "github.com/gagliardetto/golang-go/cmd/go/not-internal/modinfo" 30 "github.com/gagliardetto/golang-go/cmd/go/not-internal/par" 31 "github.com/gagliardetto/golang-go/cmd/go/not-internal/search" 32 "github.com/gagliardetto/golang-go/cmd/go/not-internal/str" 33 ) 34 35 var ( 36 // module initialization hook; never nil, no-op if module use is disabled 37 ModInit func() 38 39 // module hooks; nil if module use is disabled 40 ModBinDir func() string // return effective bin directory 41 ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import 42 ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct 43 ModImportPaths func(args []string) []*search.Match // expand import paths 44 ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary 45 ModInfoProg func(info string, isgccgo bool) []byte // wrap module info in .go code for binary 46 ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files 47 ModDirImportPath func(string) string // return effective import path for directory 48 ) 49 50 var IgnoreImports bool // control whether we ignore imports in packages 51 52 // A Package describes a single package found in a directory. 53 type Package struct { 54 PackagePublic // visible in 'go list' 55 Internal PackageInternal // for use inside go command only 56 } 57 58 type PackagePublic struct { 59 // Note: These fields are part of the go command's public API. 60 // See list.go. It is okay to add fields, but not to change or 61 // remove existing ones. Keep in sync with list.go 62 Dir string `json:",omitempty"` // directory containing package sources 63 ImportPath string `json:",omitempty"` // import path of package in dir 64 ImportComment string `json:",omitempty"` // path in import comment on package statement 65 Name string `json:",omitempty"` // package name 66 Doc string `json:",omitempty"` // package documentation string 67 Target string `json:",omitempty"` // installed target for this package (may be executable) 68 Shlib string `json:",omitempty"` // the shared library that contains this package (only set when -linkshared) 69 Root string `json:",omitempty"` // Go root, Go path dir, or module root dir containing this package 70 ConflictDir string `json:",omitempty"` // Dir is hidden by this other directory 71 ForTest string `json:",omitempty"` // package is only for use in named test 72 Export string `json:",omitempty"` // file containing export data (set by go list -export) 73 Module *modinfo.ModulePublic `json:",omitempty"` // info about package's module, if any 74 Match []string `json:",omitempty"` // command-line patterns matching this package 75 Goroot bool `json:",omitempty"` // is this package found in the Go root? 76 Standard bool `json:",omitempty"` // is this package part of the standard Go library? 77 DepOnly bool `json:",omitempty"` // package is only as a dependency, not explicitly listed 78 BinaryOnly bool `json:",omitempty"` // package cannot be recompiled 79 Incomplete bool `json:",omitempty"` // was there an error loading this package or dependencies? 80 81 // Stale and StaleReason remain here *only* for the list command. 82 // They are only initialized in preparation for list execution. 83 // The regular build determines staleness on the fly during action execution. 84 Stale bool `json:",omitempty"` // would 'go install' do anything for this package? 85 StaleReason string `json:",omitempty"` // why is Stale true? 86 87 // Source files 88 // If you add to this list you MUST add to p.AllFiles (below) too. 89 // Otherwise file name security lists will not apply to any new additions. 90 GoFiles []string `json:",omitempty"` // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles) 91 CgoFiles []string `json:",omitempty"` // .go source files that import "C" 92 CompiledGoFiles []string `json:",omitempty"` // .go output from running cgo on CgoFiles 93 IgnoredGoFiles []string `json:",omitempty"` // .go source files ignored due to build constraints 94 CFiles []string `json:",omitempty"` // .c source files 95 CXXFiles []string `json:",omitempty"` // .cc, .cpp and .cxx source files 96 MFiles []string `json:",omitempty"` // .m source files 97 HFiles []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files 98 FFiles []string `json:",omitempty"` // .f, .F, .for and .f90 Fortran source files 99 SFiles []string `json:",omitempty"` // .s source files 100 SwigFiles []string `json:",omitempty"` // .swig files 101 SwigCXXFiles []string `json:",omitempty"` // .swigcxx files 102 SysoFiles []string `json:",omitempty"` // .syso system object files added to package 103 104 // Cgo directives 105 CgoCFLAGS []string `json:",omitempty"` // cgo: flags for C compiler 106 CgoCPPFLAGS []string `json:",omitempty"` // cgo: flags for C preprocessor 107 CgoCXXFLAGS []string `json:",omitempty"` // cgo: flags for C++ compiler 108 CgoFFLAGS []string `json:",omitempty"` // cgo: flags for Fortran compiler 109 CgoLDFLAGS []string `json:",omitempty"` // cgo: flags for linker 110 CgoPkgConfig []string `json:",omitempty"` // cgo: pkg-config names 111 112 // Dependency information 113 Imports []string `json:",omitempty"` // import paths used by this package 114 ImportMap map[string]string `json:",omitempty"` // map from source import to ImportPath (identity entries omitted) 115 Deps []string `json:",omitempty"` // all (recursively) imported dependencies 116 117 // Error information 118 // Incomplete is above, packed into the other bools 119 Error *PackageError `json:",omitempty"` // error loading this package (not dependencies) 120 DepsErrors []*PackageError `json:",omitempty"` // errors loading dependencies 121 122 // Test information 123 // If you add to this list you MUST add to p.AllFiles (below) too. 124 // Otherwise file name security lists will not apply to any new additions. 125 TestGoFiles []string `json:",omitempty"` // _test.go files in package 126 TestImports []string `json:",omitempty"` // imports from TestGoFiles 127 XTestGoFiles []string `json:",omitempty"` // _test.go files outside package 128 XTestImports []string `json:",omitempty"` // imports from XTestGoFiles 129 } 130 131 // AllFiles returns the names of all the files considered for the package. 132 // This is used for sanity and security checks, so we include all files, 133 // even IgnoredGoFiles, because some subcommands consider them. 134 // The go/build package filtered others out (like foo_wrongGOARCH.s) 135 // and that's OK. 136 func (p *Package) AllFiles() []string { 137 return str.StringList( 138 p.GoFiles, 139 p.CgoFiles, 140 // no p.CompiledGoFiles, because they are from GoFiles or generated by us 141 p.IgnoredGoFiles, 142 p.CFiles, 143 p.CXXFiles, 144 p.MFiles, 145 p.HFiles, 146 p.FFiles, 147 p.SFiles, 148 p.SwigFiles, 149 p.SwigCXXFiles, 150 p.SysoFiles, 151 p.TestGoFiles, 152 p.XTestGoFiles, 153 ) 154 } 155 156 // Desc returns the package "description", for use in b.showOutput. 157 func (p *Package) Desc() string { 158 if p.ForTest != "" { 159 return p.ImportPath + " [" + p.ForTest + ".test]" 160 } 161 return p.ImportPath 162 } 163 164 type PackageInternal struct { 165 // Unexported fields are not part of the public API. 166 Build *build.Package 167 Imports []*Package // this package's direct imports 168 CompiledImports []string // additional Imports necessary when using CompiledGoFiles (all from standard library) 169 RawImports []string // this package's original imports as they appear in the text of the program 170 ForceLibrary bool // this package is a library (even if named "main") 171 CmdlineFiles bool // package built from files listed on command line 172 CmdlinePkg bool // package listed on command line 173 CmdlinePkgLiteral bool // package listed as literal on command line (not via wildcard) 174 Local bool // imported via local path (./ or ../) 175 LocalPrefix string // interpret ./ and ../ imports relative to this prefix 176 ExeName string // desired name for temporary executable 177 CoverMode string // preprocess Go source files with the coverage tool in this mode 178 CoverVars map[string]*CoverVar // variables created by coverage analysis 179 OmitDebug bool // tell linker not to write debug information 180 GobinSubdir bool // install target would be subdir of GOBIN 181 BuildInfo string // add this info to package main 182 TestmainGo *[]byte // content for _testmain.go 183 184 Asmflags []string // -asmflags for this package 185 Gcflags []string // -gcflags for this package 186 Ldflags []string // -ldflags for this package 187 Gccgoflags []string // -gccgoflags for this package 188 } 189 190 type NoGoError struct { 191 Package *Package 192 } 193 194 func (e *NoGoError) Error() string { 195 // Count files beginning with _ and ., which we will pretend don't exist at all. 196 dummy := 0 197 for _, name := range e.Package.IgnoredGoFiles { 198 if strings.HasPrefix(name, "_") || strings.HasPrefix(name, ".") { 199 dummy++ 200 } 201 } 202 203 if len(e.Package.IgnoredGoFiles) > dummy { 204 // Go files exist, but they were ignored due to build constraints. 205 return "build constraints exclude all Go files in " + e.Package.Dir 206 } 207 if len(e.Package.TestGoFiles)+len(e.Package.XTestGoFiles) > 0 { 208 // Test Go files exist, but we're not interested in them. 209 // The double-negative is unfortunate but we want e.Package.Dir 210 // to appear at the end of error message. 211 return "no non-test Go files in " + e.Package.Dir 212 } 213 return "no Go files in " + e.Package.Dir 214 } 215 216 // Resolve returns the resolved version of imports, 217 // which should be p.TestImports or p.XTestImports, NOT p.Imports. 218 // The imports in p.TestImports and p.XTestImports are not recursively 219 // loaded during the initial load of p, so they list the imports found in 220 // the source file, but most processing should be over the vendor-resolved 221 // import paths. We do this resolution lazily both to avoid file system work 222 // and because the eventual real load of the test imports (during 'go test') 223 // can produce better error messages if it starts with the original paths. 224 // The initial load of p loads all the non-test imports and rewrites 225 // the vendored paths, so nothing should ever call p.vendored(p.Imports). 226 func (p *Package) Resolve(imports []string) []string { 227 if len(imports) > 0 && len(p.Imports) > 0 && &imports[0] == &p.Imports[0] { 228 panic("internal error: p.Resolve(p.Imports) called") 229 } 230 seen := make(map[string]bool) 231 var all []string 232 for _, path := range imports { 233 path = ResolveImportPath(p, path) 234 if !seen[path] { 235 seen[path] = true 236 all = append(all, path) 237 } 238 } 239 sort.Strings(all) 240 return all 241 } 242 243 // CoverVar holds the name of the generated coverage variables targeting the named file. 244 type CoverVar struct { 245 File string // local file name 246 Var string // name of count struct 247 } 248 249 func (p *Package) copyBuild(pp *build.Package) { 250 p.Internal.Build = pp 251 252 if pp.PkgTargetRoot != "" && cfg.BuildPkgdir != "" { 253 old := pp.PkgTargetRoot 254 pp.PkgRoot = cfg.BuildPkgdir 255 pp.PkgTargetRoot = cfg.BuildPkgdir 256 pp.PkgObj = filepath.Join(cfg.BuildPkgdir, strings.TrimPrefix(pp.PkgObj, old)) 257 } 258 259 p.Dir = pp.Dir 260 p.ImportPath = pp.ImportPath 261 p.ImportComment = pp.ImportComment 262 p.Name = pp.Name 263 p.Doc = pp.Doc 264 p.Root = pp.Root 265 p.ConflictDir = pp.ConflictDir 266 p.BinaryOnly = pp.BinaryOnly 267 268 // TODO? Target 269 p.Goroot = pp.Goroot 270 p.Standard = p.Goroot && p.ImportPath != "" && search.IsStandardImportPath(p.ImportPath) 271 p.GoFiles = pp.GoFiles 272 p.CgoFiles = pp.CgoFiles 273 p.IgnoredGoFiles = pp.IgnoredGoFiles 274 p.CFiles = pp.CFiles 275 p.CXXFiles = pp.CXXFiles 276 p.MFiles = pp.MFiles 277 p.HFiles = pp.HFiles 278 p.FFiles = pp.FFiles 279 p.SFiles = pp.SFiles 280 p.SwigFiles = pp.SwigFiles 281 p.SwigCXXFiles = pp.SwigCXXFiles 282 p.SysoFiles = pp.SysoFiles 283 p.CgoCFLAGS = pp.CgoCFLAGS 284 p.CgoCPPFLAGS = pp.CgoCPPFLAGS 285 p.CgoCXXFLAGS = pp.CgoCXXFLAGS 286 p.CgoFFLAGS = pp.CgoFFLAGS 287 p.CgoLDFLAGS = pp.CgoLDFLAGS 288 p.CgoPkgConfig = pp.CgoPkgConfig 289 // We modify p.Imports in place, so make copy now. 290 p.Imports = make([]string, len(pp.Imports)) 291 copy(p.Imports, pp.Imports) 292 p.Internal.RawImports = pp.Imports 293 p.TestGoFiles = pp.TestGoFiles 294 p.TestImports = pp.TestImports 295 p.XTestGoFiles = pp.XTestGoFiles 296 p.XTestImports = pp.XTestImports 297 if IgnoreImports { 298 p.Imports = nil 299 p.Internal.RawImports = nil 300 p.TestImports = nil 301 p.XTestImports = nil 302 } 303 } 304 305 // A PackageError describes an error loading information about a package. 306 type PackageError struct { 307 ImportStack []string // shortest path from package named on command line to this one 308 Pos string // position of error 309 Err error // the error itself 310 IsImportCycle bool // the error is an import cycle 311 Hard bool // whether the error is soft or hard; soft errors are ignored in some places 312 } 313 314 func (p *PackageError) Error() string { 315 // Import cycles deserve special treatment. 316 if p.IsImportCycle { 317 return fmt.Sprintf("%s\npackage %s\n", p.Err, strings.Join(p.ImportStack, "\n\timports ")) 318 } 319 if p.Pos != "" { 320 // Omit import stack. The full path to the file where the error 321 // is the most important thing. 322 return p.Pos + ": " + p.Err.Error() 323 } 324 325 // If the error is an ImportPathError, and the last path on the stack appears 326 // in the error message, omit that path from the stack to avoid repetition. 327 // If an ImportPathError wraps another ImportPathError that matches the 328 // last path on the stack, we don't omit the path. An error like 329 // "package A imports B: error loading C caused by B" would not be clearer 330 // if "imports B" were omitted. 331 stack := p.ImportStack 332 var ierr ImportPathError 333 if len(stack) > 0 && errors.As(p.Err, &ierr) && ierr.ImportPath() == stack[len(stack)-1] { 334 stack = stack[:len(stack)-1] 335 } 336 if len(stack) == 0 { 337 return p.Err.Error() 338 } 339 return "package " + strings.Join(stack, "\n\timports ") + ": " + p.Err.Error() 340 } 341 342 // PackageError implements MarshalJSON so that Err is marshaled as a string 343 // and non-essential fields are omitted. 344 func (p *PackageError) MarshalJSON() ([]byte, error) { 345 perr := struct { 346 ImportStack []string 347 Pos string 348 Err string 349 }{p.ImportStack, p.Pos, p.Err.Error()} 350 return json.Marshal(perr) 351 } 352 353 // ImportPathError is a type of error that prevents a package from being loaded 354 // for a given import path. When such a package is loaded, a *Package is 355 // returned with Err wrapping an ImportPathError: the error is attached to 356 // the imported package, not the importing package. 357 // 358 // The string returned by ImportPath must appear in the string returned by 359 // Error. Errors that wrap ImportPathError (such as PackageError) may omit 360 // the import path. 361 type ImportPathError interface { 362 error 363 ImportPath() string 364 } 365 366 type importError struct { 367 importPath string 368 err error // created with fmt.Errorf 369 } 370 371 var _ ImportPathError = (*importError)(nil) 372 373 func ImportErrorf(path, format string, args ...interface{}) ImportPathError { 374 err := &importError{importPath: path, err: fmt.Errorf(format, args...)} 375 if errStr := err.Error(); !strings.Contains(errStr, path) { 376 panic(fmt.Sprintf("path %q not in error %q", path, errStr)) 377 } 378 return err 379 } 380 381 func (e *importError) Error() string { 382 return e.err.Error() 383 } 384 385 func (e *importError) Unwrap() error { 386 // Don't return e.err directly, since we're only wrapping an error if %w 387 // was passed to ImportErrorf. 388 return errors.Unwrap(e.err) 389 } 390 391 func (e *importError) ImportPath() string { 392 return e.importPath 393 } 394 395 // An ImportStack is a stack of import paths, possibly with the suffix " (test)" appended. 396 // The import path of a test package is the import path of the corresponding 397 // non-test package with the suffix "_test" added. 398 type ImportStack []string 399 400 func (s *ImportStack) Push(p string) { 401 *s = append(*s, p) 402 } 403 404 func (s *ImportStack) Pop() { 405 *s = (*s)[0 : len(*s)-1] 406 } 407 408 func (s *ImportStack) Copy() []string { 409 return append([]string{}, *s...) 410 } 411 412 // shorterThan reports whether sp is shorter than t. 413 // We use this to record the shortest import sequence 414 // that leads to a particular package. 415 func (sp *ImportStack) shorterThan(t []string) bool { 416 s := *sp 417 if len(s) != len(t) { 418 return len(s) < len(t) 419 } 420 // If they are the same length, settle ties using string ordering. 421 for i := range s { 422 if s[i] != t[i] { 423 return s[i] < t[i] 424 } 425 } 426 return false // they are equal 427 } 428 429 // packageCache is a lookup cache for LoadImport, 430 // so that if we look up a package multiple times 431 // we return the same pointer each time. 432 var packageCache = map[string]*Package{} 433 434 // ClearPackageCache clears the in-memory package cache and the preload caches. 435 // It is only for use by GOPATH-based "go get". 436 // TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function. 437 func ClearPackageCache() { 438 for name := range packageCache { 439 delete(packageCache, name) 440 } 441 resolvedImportCache.Clear() 442 packageDataCache.Clear() 443 } 444 445 // ClearPackageCachePartial clears packages with the given import paths from the 446 // in-memory package cache and the preload caches. It is only for use by 447 // GOPATH-based "go get". 448 // TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function. 449 func ClearPackageCachePartial(args []string) { 450 shouldDelete := make(map[string]bool) 451 for _, arg := range args { 452 shouldDelete[arg] = true 453 if p := packageCache[arg]; p != nil { 454 delete(packageCache, arg) 455 } 456 } 457 resolvedImportCache.DeleteIf(func(key interface{}) bool { 458 return shouldDelete[key.(importSpec).path] 459 }) 460 packageDataCache.DeleteIf(func(key interface{}) bool { 461 return shouldDelete[key.(string)] 462 }) 463 } 464 465 // ReloadPackageNoFlags is like LoadImport but makes sure 466 // not to use the package cache. 467 // It is only for use by GOPATH-based "go get". 468 // TODO(rsc): When GOPATH-based "go get" is removed, delete this function. 469 func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { 470 p := packageCache[arg] 471 if p != nil { 472 delete(packageCache, arg) 473 resolvedImportCache.DeleteIf(func(key interface{}) bool { 474 return key.(importSpec).path == p.ImportPath 475 }) 476 packageDataCache.Delete(p.ImportPath) 477 } 478 return LoadImport(arg, base.Cwd, nil, stk, nil, 0) 479 } 480 481 // dirToImportPath returns the pseudo-import path we use for a package 482 // outside the Go path. It begins with _/ and then contains the full path 483 // to the directory. If the package lives in c:\home\gopher\my\pkg then 484 // the pseudo-import path is _/c_/home/gopher/my/pkg. 485 // Using a pseudo-import path like this makes the ./ imports no longer 486 // a special case, so that all the code to deal with ordinary imports works 487 // automatically. 488 func dirToImportPath(dir string) string { 489 return pathpkg.Join("_", strings.Map(makeImportValid, filepath.ToSlash(dir))) 490 } 491 492 func makeImportValid(r rune) rune { 493 // Should match Go spec, compilers, and ../../go/parser/parser.go:/isValidImport. 494 const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD" 495 if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) { 496 return '_' 497 } 498 return r 499 } 500 501 // Mode flags for loadImport and download (in get.go). 502 const ( 503 // ResolveImport means that loadImport should do import path expansion. 504 // That is, ResolveImport means that the import path came from 505 // a source file and has not been expanded yet to account for 506 // vendoring or possible module adjustment. 507 // Every import path should be loaded initially with ResolveImport, 508 // and then the expanded version (for example with the /vendor/ in it) 509 // gets recorded as the canonical import path. At that point, future loads 510 // of that package must not pass ResolveImport, because 511 // disallowVendor will reject direct use of paths containing /vendor/. 512 ResolveImport = 1 << iota 513 514 // ResolveModule is for download (part of "go get") and indicates 515 // that the module adjustment should be done, but not vendor adjustment. 516 ResolveModule 517 518 // GetTestDeps is for download (part of "go get") and indicates 519 // that test dependencies should be fetched too. 520 GetTestDeps 521 ) 522 523 // LoadImport scans the directory named by path, which must be an import path, 524 // but possibly a local import path (an absolute file system path or one beginning 525 // with ./ or ../). A local relative path is interpreted relative to srcDir. 526 // It returns a *Package describing the package found in that directory. 527 // LoadImport does not set tool flags and should only be used by 528 // this package, as part of a bigger load operation, and by GOPATH-based "go get". 529 // TODO(rsc): When GOPATH-based "go get" is removed, unexport this function. 530 func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { 531 return loadImport(nil, path, srcDir, parent, stk, importPos, mode) 532 } 533 534 func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { 535 if path == "" { 536 panic("LoadImport called with empty package path") 537 } 538 539 stk.Push(path) 540 defer stk.Pop() 541 542 var parentPath, parentRoot string 543 parentIsStd := false 544 if parent != nil { 545 parentPath = parent.ImportPath 546 parentRoot = parent.Root 547 parentIsStd = parent.Standard 548 } 549 bp, loaded, err := loadPackageData(path, parentPath, srcDir, parentRoot, parentIsStd, mode) 550 if loaded && pre != nil && !IgnoreImports { 551 pre.preloadImports(bp.Imports, bp) 552 } 553 if bp == nil { 554 return &Package{ 555 PackagePublic: PackagePublic{ 556 ImportPath: path, 557 Error: &PackageError{ 558 ImportStack: stk.Copy(), 559 Err: err, 560 }, 561 }, 562 } 563 } 564 565 importPath := bp.ImportPath 566 p := packageCache[importPath] 567 if p != nil { 568 p = reusePackage(p, stk) 569 } else { 570 p = new(Package) 571 p.Internal.Local = build.IsLocalImport(path) 572 p.ImportPath = importPath 573 packageCache[importPath] = p 574 575 // Load package. 576 // loadPackageData may return bp != nil even if an error occurs, 577 // in order to return partial information. 578 p.load(stk, bp, err) 579 if p.Error != nil && p.Error.Pos == "" { 580 p = setErrorPos(p, importPos) 581 } 582 583 if !cfg.ModulesEnabled && path != cleanImport(path) { 584 p.Error = &PackageError{ 585 ImportStack: stk.Copy(), 586 Err: fmt.Errorf("non-canonical import path: %q should be %q", path, pathpkg.Clean(path)), 587 } 588 p.Incomplete = true 589 } 590 } 591 592 // Checked on every import because the rules depend on the code doing the importing. 593 if perr := disallowInternal(srcDir, parent, parentPath, p, stk); perr != p { 594 return setErrorPos(perr, importPos) 595 } 596 if mode&ResolveImport != 0 { 597 if perr := disallowVendor(srcDir, path, p, stk); perr != p { 598 return setErrorPos(perr, importPos) 599 } 600 } 601 602 if p.Name == "main" && parent != nil && parent.Dir != p.Dir { 603 perr := *p 604 perr.Error = &PackageError{ 605 ImportStack: stk.Copy(), 606 Err: ImportErrorf(path, "import %q is a program, not an importable package", path), 607 } 608 return setErrorPos(&perr, importPos) 609 } 610 611 if p.Internal.Local && parent != nil && !parent.Internal.Local { 612 perr := *p 613 var err error 614 if path == "." { 615 err = ImportErrorf(path, "%s: cannot import current directory", path) 616 } else { 617 err = ImportErrorf(path, "local import %q in non-local package", path) 618 } 619 perr.Error = &PackageError{ 620 ImportStack: stk.Copy(), 621 Err: err, 622 } 623 return setErrorPos(&perr, importPos) 624 } 625 626 return p 627 } 628 629 func setErrorPos(p *Package, importPos []token.Position) *Package { 630 if len(importPos) > 0 { 631 pos := importPos[0] 632 pos.Filename = base.ShortPath(pos.Filename) 633 p.Error.Pos = pos.String() 634 } 635 return p 636 } 637 638 // loadPackageData loads information needed to construct a *Package. The result 639 // is cached, and later calls to loadPackageData for the same package will return 640 // the same data. 641 // 642 // loadPackageData returns a non-nil package even if err is non-nil unless 643 // the package path is malformed (for example, the path contains "mod/" or "@"). 644 // 645 // loadPackageData returns a boolean, loaded, which is true if this is the 646 // first time the package was loaded. Callers may preload imports in this case. 647 func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd bool, mode int) (bp *build.Package, loaded bool, err error) { 648 if path == "" { 649 panic("loadPackageData called with empty package path") 650 } 651 652 if strings.HasPrefix(path, "mod/") { 653 // Paths beginning with "mod/" might accidentally 654 // look in the module cache directory tree in $GOPATH/pkg/mod/. 655 // This prefix is owned by the Go core for possible use in the 656 // standard library (since it does not begin with a domain name), 657 // so it's OK to disallow entirely. 658 return nil, false, fmt.Errorf("disallowed import path %q", path) 659 } 660 661 if strings.Contains(path, "@") { 662 if cfg.ModulesEnabled { 663 return nil, false, errors.New("can only use path@version syntax with 'go get'") 664 } else { 665 return nil, false, errors.New("cannot use path@version syntax in GOPATH mode") 666 } 667 } 668 669 // Determine canonical package path and directory. 670 // For a local import the identifier is the pseudo-import path 671 // we create from the full directory to the package. 672 // Otherwise it is the usual import path. 673 // For vendored imports, it is the expanded form. 674 // 675 // Note that when modules are enabled, local import paths are normally 676 // canonicalized by modload.ImportPaths before now. However, if there's an 677 // error resolving a local path, it will be returned untransformed 678 // so that 'go list -e' reports something useful. 679 importKey := importSpec{ 680 path: path, 681 parentPath: parentPath, 682 parentDir: parentDir, 683 parentRoot: parentRoot, 684 parentIsStd: parentIsStd, 685 mode: mode, 686 } 687 r := resolvedImportCache.Do(importKey, func() interface{} { 688 var r resolvedImport 689 if build.IsLocalImport(path) { 690 r.dir = filepath.Join(parentDir, path) 691 r.path = dirToImportPath(r.dir) 692 } else if cfg.ModulesEnabled { 693 r.dir, r.path, r.err = ModLookup(parentPath, parentIsStd, path) 694 } else if mode&ResolveImport != 0 { 695 // We do our own path resolution, because we want to 696 // find out the key to use in packageCache without the 697 // overhead of repeated calls to buildContext.Import. 698 // The code is also needed in a few other places anyway. 699 r.path = resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd) 700 } else if mode&ResolveModule != 0 { 701 r.path = moduleImportPath(path, parentPath, parentDir, parentRoot) 702 } 703 if r.path == "" { 704 r.path = path 705 } 706 return r 707 }).(resolvedImport) 708 // Invariant: r.path is set to the resolved import path. If the path cannot 709 // be resolved, r.path is set to path, the source import path. 710 // r.path is never empty. 711 712 // Load the package from its directory. If we already found the package's 713 // directory when resolving its import path, use that. 714 data := packageDataCache.Do(r.path, func() interface{} { 715 loaded = true 716 var data packageData 717 if r.dir != "" { 718 var buildMode build.ImportMode 719 if !cfg.ModulesEnabled { 720 buildMode = build.ImportComment 721 } 722 data.p, data.err = cfg.BuildContext.ImportDir(r.dir, buildMode) 723 if data.p.Root == "" && cfg.ModulesEnabled { 724 if info := ModPackageModuleInfo(path); info != nil { 725 data.p.Root = info.Dir 726 } 727 } 728 } else if r.err != nil { 729 data.p = new(build.Package) 730 data.err = r.err 731 } else if cfg.ModulesEnabled && path != "unsafe" { 732 data.p = new(build.Package) 733 data.err = fmt.Errorf("unknown import path %q: internal error: module loader did not resolve import", r.path) 734 } else { 735 buildMode := build.ImportComment 736 if mode&ResolveImport == 0 || r.path != path { 737 // Not vendoring, or we already found the vendored path. 738 buildMode |= build.IgnoreVendor 739 } 740 data.p, data.err = cfg.BuildContext.Import(r.path, parentDir, buildMode) 741 } 742 data.p.ImportPath = r.path 743 744 // Set data.p.BinDir in cases where go/build.Context.Import 745 // may give us a path we don't want. 746 if !data.p.Goroot { 747 if cfg.GOBIN != "" { 748 data.p.BinDir = cfg.GOBIN 749 } else if cfg.ModulesEnabled { 750 data.p.BinDir = ModBinDir() 751 } 752 } 753 754 if !cfg.ModulesEnabled && data.err == nil && 755 data.p.ImportComment != "" && data.p.ImportComment != path && 756 !strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") { 757 data.err = fmt.Errorf("code in directory %s expects import %q", data.p.Dir, data.p.ImportComment) 758 } 759 return data 760 }).(packageData) 761 762 return data.p, loaded, data.err 763 } 764 765 // importSpec describes an import declaration in source code. It is used as a 766 // cache key for resolvedImportCache. 767 type importSpec struct { 768 path string 769 parentPath, parentDir, parentRoot string 770 parentIsStd bool 771 mode int 772 } 773 774 // resolvedImport holds a canonical identifier for a package. It may also contain 775 // a path to the package's directory and an error if one occurred. resolvedImport 776 // is the value type in resolvedImportCache. 777 type resolvedImport struct { 778 path, dir string 779 err error 780 } 781 782 // packageData holds information loaded from a package. It is the value type 783 // in packageDataCache. 784 type packageData struct { 785 p *build.Package 786 err error 787 } 788 789 // resolvedImportCache maps import strings (importSpec) to canonical package names 790 // (resolvedImport). 791 var resolvedImportCache par.Cache 792 793 // packageDataCache maps canonical package names (string) to package metadata 794 // (packageData). 795 var packageDataCache par.Cache 796 797 // preloadWorkerCount is the number of concurrent goroutines that can load 798 // packages. Experimentally, there are diminishing returns with more than 799 // 4 workers. This was measured on the following machines. 800 // 801 // * MacBookPro with a 4-core Intel Core i7 CPU 802 // * Linux workstation with 6-core Intel Xeon CPU 803 // * Linux workstation with 24-core Intel Xeon CPU 804 // 805 // It is very likely (though not confirmed) that this workload is limited 806 // by memory bandwidth. We don't have a good way to determine the number of 807 // workers that would saturate the bus though, so runtime.GOMAXPROCS 808 // seems like a reasonable default. 809 var preloadWorkerCount = runtime.GOMAXPROCS(0) 810 811 // preload holds state for managing concurrent preloading of package data. 812 // 813 // A preload should be created with newPreload before loading a large 814 // package graph. flush must be called when package loading is complete 815 // to ensure preload goroutines are no longer active. This is necessary 816 // because of global mutable state that cannot safely be read and written 817 // concurrently. In particular, packageDataCache may be cleared by "go get" 818 // in GOPATH mode, and modload.loaded (accessed via ModLookup) may be 819 // modified by modload.ImportPaths (ModImportPaths). 820 type preload struct { 821 cancel chan struct{} 822 sema chan struct{} 823 } 824 825 // newPreload creates a new preloader. flush must be called later to avoid 826 // accessing global state while it is being modified. 827 func newPreload() *preload { 828 pre := &preload{ 829 cancel: make(chan struct{}), 830 sema: make(chan struct{}, preloadWorkerCount), 831 } 832 return pre 833 } 834 835 // preloadMatches loads data for package paths matched by patterns. 836 // When preloadMatches returns, some packages may not be loaded yet, but 837 // loadPackageData and loadImport are always safe to call. 838 func (pre *preload) preloadMatches(matches []*search.Match) { 839 for _, m := range matches { 840 for _, pkg := range m.Pkgs { 841 select { 842 case <-pre.cancel: 843 return 844 case pre.sema <- struct{}{}: 845 go func(pkg string) { 846 mode := 0 // don't use vendoring or module import resolution 847 bp, loaded, err := loadPackageData(pkg, "", base.Cwd, "", false, mode) 848 <-pre.sema 849 if bp != nil && loaded && err == nil && !IgnoreImports { 850 pre.preloadImports(bp.Imports, bp) 851 } 852 }(pkg) 853 } 854 } 855 } 856 } 857 858 // preloadImports queues a list of imports for preloading. 859 // When preloadImports returns, some packages may not be loaded yet, 860 // but loadPackageData and loadImport are always safe to call. 861 func (pre *preload) preloadImports(imports []string, parent *build.Package) { 862 parentIsStd := parent.Goroot && parent.ImportPath != "" && search.IsStandardImportPath(parent.ImportPath) 863 for _, path := range imports { 864 if path == "C" || path == "unsafe" { 865 continue 866 } 867 select { 868 case <-pre.cancel: 869 return 870 case pre.sema <- struct{}{}: 871 go func(path string) { 872 bp, loaded, err := loadPackageData(path, parent.ImportPath, parent.Dir, parent.Root, parentIsStd, ResolveImport) 873 <-pre.sema 874 if bp != nil && loaded && err == nil && !IgnoreImports { 875 pre.preloadImports(bp.Imports, bp) 876 } 877 }(path) 878 } 879 } 880 } 881 882 // flush stops pending preload operations. flush blocks until preload calls to 883 // loadPackageData have completed. The preloader will not make any new calls 884 // to loadPackageData. 885 func (pre *preload) flush() { 886 close(pre.cancel) 887 for i := 0; i < preloadWorkerCount; i++ { 888 pre.sema <- struct{}{} 889 } 890 } 891 892 func cleanImport(path string) string { 893 orig := path 894 path = pathpkg.Clean(path) 895 if strings.HasPrefix(orig, "./") && path != ".." && !strings.HasPrefix(path, "../") { 896 path = "./" + path 897 } 898 return path 899 } 900 901 var isDirCache par.Cache 902 903 func isDir(path string) bool { 904 return isDirCache.Do(path, func() interface{} { 905 fi, err := os.Stat(path) 906 return err == nil && fi.IsDir() 907 }).(bool) 908 } 909 910 // ResolveImportPath returns the true meaning of path when it appears in parent. 911 // There are two different resolutions applied. 912 // First, there is Go 1.5 vendoring (golang.org/s/go15vendor). 913 // If vendor expansion doesn't trigger, then the path is also subject to 914 // Go 1.11 module legacy conversion (golang.org/issue/25069). 915 func ResolveImportPath(parent *Package, path string) (found string) { 916 var parentPath, parentDir, parentRoot string 917 parentIsStd := false 918 if parent != nil { 919 parentPath = parent.ImportPath 920 parentDir = parent.Dir 921 parentRoot = parent.Root 922 parentIsStd = parent.Standard 923 } 924 return resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd) 925 } 926 927 func resolveImportPath(path, parentPath, parentDir, parentRoot string, parentIsStd bool) (found string) { 928 if cfg.ModulesEnabled { 929 if _, p, e := ModLookup(parentPath, parentIsStd, path); e == nil { 930 return p 931 } 932 return path 933 } 934 found = vendoredImportPath(path, parentPath, parentDir, parentRoot) 935 if found != path { 936 return found 937 } 938 return moduleImportPath(path, parentPath, parentDir, parentRoot) 939 } 940 941 // dirAndRoot returns the source directory and workspace root 942 // for the package p, guaranteeing that root is a path prefix of dir. 943 func dirAndRoot(path string, dir, root string) (string, string) { 944 origDir, origRoot := dir, root 945 dir = filepath.Clean(dir) 946 root = filepath.Join(root, "src") 947 if !str.HasFilePathPrefix(dir, root) || path != "command-line-arguments" && filepath.Join(root, path) != dir { 948 // Look for symlinks before reporting error. 949 dir = expandPath(dir) 950 root = expandPath(root) 951 } 952 953 if !str.HasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || path != "command-line-arguments" && !build.IsLocalImport(path) && filepath.Join(root, path) != dir { 954 base.Fatalf("unexpected directory layout:\n"+ 955 " import path: %s\n"+ 956 " root: %s\n"+ 957 " dir: %s\n"+ 958 " expand root: %s\n"+ 959 " expand dir: %s\n"+ 960 " separator: %s", 961 path, 962 filepath.Join(origRoot, "src"), 963 filepath.Clean(origDir), 964 origRoot, 965 origDir, 966 string(filepath.Separator)) 967 } 968 969 return dir, root 970 } 971 972 // vendoredImportPath returns the vendor-expansion of path when it appears in parent. 973 // If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path, 974 // x/vendor/path, vendor/path, or else stay path if none of those exist. 975 // vendoredImportPath returns the expanded path or, if no expansion is found, the original. 976 func vendoredImportPath(path, parentPath, parentDir, parentRoot string) (found string) { 977 if parentRoot == "" { 978 return path 979 } 980 981 dir, root := dirAndRoot(parentPath, parentDir, parentRoot) 982 983 vpath := "vendor/" + path 984 for i := len(dir); i >= len(root); i-- { 985 if i < len(dir) && dir[i] != filepath.Separator { 986 continue 987 } 988 // Note: checking for the vendor directory before checking 989 // for the vendor/path directory helps us hit the 990 // isDir cache more often. It also helps us prepare a more useful 991 // list of places we looked, to report when an import is not found. 992 if !isDir(filepath.Join(dir[:i], "vendor")) { 993 continue 994 } 995 targ := filepath.Join(dir[:i], vpath) 996 if isDir(targ) && hasGoFiles(targ) { 997 importPath := parentPath 998 if importPath == "command-line-arguments" { 999 // If parent.ImportPath is 'command-line-arguments'. 1000 // set to relative directory to root (also chopped root directory) 1001 importPath = dir[len(root)+1:] 1002 } 1003 // We started with parent's dir c:\gopath\src\foo\bar\baz\quux\xyzzy. 1004 // We know the import path for parent's dir. 1005 // We chopped off some number of path elements and 1006 // added vendor\path to produce c:\gopath\src\foo\bar\baz\vendor\path. 1007 // Now we want to know the import path for that directory. 1008 // Construct it by chopping the same number of path elements 1009 // (actually the same number of bytes) from parent's import path 1010 // and then append /vendor/path. 1011 chopped := len(dir) - i 1012 if chopped == len(importPath)+1 { 1013 // We walked up from c:\gopath\src\foo\bar 1014 // and found c:\gopath\src\vendor\path. 1015 // We chopped \foo\bar (length 8) but the import path is "foo/bar" (length 7). 1016 // Use "vendor/path" without any prefix. 1017 return vpath 1018 } 1019 return importPath[:len(importPath)-chopped] + "/" + vpath 1020 } 1021 } 1022 return path 1023 } 1024 1025 var ( 1026 modulePrefix = []byte("\nmodule ") 1027 goModPathCache par.Cache 1028 ) 1029 1030 // goModPath returns the module path in the go.mod in dir, if any. 1031 func goModPath(dir string) (path string) { 1032 return goModPathCache.Do(dir, func() interface{} { 1033 data, err := ioutil.ReadFile(filepath.Join(dir, "go.mod")) 1034 if err != nil { 1035 return "" 1036 } 1037 var i int 1038 if bytes.HasPrefix(data, modulePrefix[1:]) { 1039 i = 0 1040 } else { 1041 i = bytes.Index(data, modulePrefix) 1042 if i < 0 { 1043 return "" 1044 } 1045 i++ 1046 } 1047 line := data[i:] 1048 1049 // Cut line at \n, drop trailing \r if present. 1050 if j := bytes.IndexByte(line, '\n'); j >= 0 { 1051 line = line[:j] 1052 } 1053 if line[len(line)-1] == '\r' { 1054 line = line[:len(line)-1] 1055 } 1056 line = line[len("module "):] 1057 1058 // If quoted, unquote. 1059 path = strings.TrimSpace(string(line)) 1060 if path != "" && path[0] == '"' { 1061 s, err := strconv.Unquote(path) 1062 if err != nil { 1063 return "" 1064 } 1065 path = s 1066 } 1067 return path 1068 }).(string) 1069 } 1070 1071 // findVersionElement returns the slice indices of the final version element /vN in path. 1072 // If there is no such element, it returns -1, -1. 1073 func findVersionElement(path string) (i, j int) { 1074 j = len(path) 1075 for i = len(path) - 1; i >= 0; i-- { 1076 if path[i] == '/' { 1077 if isVersionElement(path[i+1 : j]) { 1078 return i, j 1079 } 1080 j = i 1081 } 1082 } 1083 return -1, -1 1084 } 1085 1086 // isVersionElement reports whether s is a well-formed path version element: 1087 // v2, v3, v10, etc, but not v0, v05, v1. 1088 func isVersionElement(s string) bool { 1089 if len(s) < 2 || s[0] != 'v' || s[1] == '0' || s[1] == '1' && len(s) == 2 { 1090 return false 1091 } 1092 for i := 1; i < len(s); i++ { 1093 if s[i] < '0' || '9' < s[i] { 1094 return false 1095 } 1096 } 1097 return true 1098 } 1099 1100 // moduleImportPath translates import paths found in go modules 1101 // back down to paths that can be resolved in ordinary builds. 1102 // 1103 // Define “new” code as code with a go.mod file in the same directory 1104 // or a parent directory. If an import in new code says x/y/v2/z but 1105 // x/y/v2/z does not exist and x/y/go.mod says “module x/y/v2”, 1106 // then go build will read the import as x/y/z instead. 1107 // See golang.org/issue/25069. 1108 func moduleImportPath(path, parentPath, parentDir, parentRoot string) (found string) { 1109 if parentRoot == "" { 1110 return path 1111 } 1112 1113 // If there are no vN elements in path, leave it alone. 1114 // (The code below would do the same, but only after 1115 // some other file system accesses that we can avoid 1116 // here by returning early.) 1117 if i, _ := findVersionElement(path); i < 0 { 1118 return path 1119 } 1120 1121 dir, root := dirAndRoot(parentPath, parentDir, parentRoot) 1122 1123 // Consider dir and parents, up to and including root. 1124 for i := len(dir); i >= len(root); i-- { 1125 if i < len(dir) && dir[i] != filepath.Separator { 1126 continue 1127 } 1128 if goModPath(dir[:i]) != "" { 1129 goto HaveGoMod 1130 } 1131 } 1132 // This code is not in a tree with a go.mod, 1133 // so apply no changes to the path. 1134 return path 1135 1136 HaveGoMod: 1137 // This import is in a tree with a go.mod. 1138 // Allow it to refer to code in GOPATH/src/x/y/z as x/y/v2/z 1139 // if GOPATH/src/x/y/go.mod says module "x/y/v2", 1140 1141 // If x/y/v2/z exists, use it unmodified. 1142 if bp, _ := cfg.BuildContext.Import(path, "", build.IgnoreVendor); bp.Dir != "" { 1143 return path 1144 } 1145 1146 // Otherwise look for a go.mod supplying a version element. 1147 // Some version-like elements may appear in paths but not 1148 // be module versions; we skip over those to look for module 1149 // versions. For example the module m/v2 might have a 1150 // package m/v2/api/v1/foo. 1151 limit := len(path) 1152 for limit > 0 { 1153 i, j := findVersionElement(path[:limit]) 1154 if i < 0 { 1155 return path 1156 } 1157 if bp, _ := cfg.BuildContext.Import(path[:i], "", build.IgnoreVendor); bp.Dir != "" { 1158 if mpath := goModPath(bp.Dir); mpath != "" { 1159 // Found a valid go.mod file, so we're stopping the search. 1160 // If the path is m/v2/p and we found m/go.mod that says 1161 // "module m/v2", then we return "m/p". 1162 if mpath == path[:j] { 1163 return path[:i] + path[j:] 1164 } 1165 // Otherwise just return the original path. 1166 // We didn't find anything worth rewriting, 1167 // and the go.mod indicates that we should 1168 // not consider parent directories. 1169 return path 1170 } 1171 } 1172 limit = i 1173 } 1174 return path 1175 } 1176 1177 // hasGoFiles reports whether dir contains any files with names ending in .go. 1178 // For a vendor check we must exclude directories that contain no .go files. 1179 // Otherwise it is not possible to vendor just a/b/c and still import the 1180 // non-vendored a/b. See golang.org/issue/13832. 1181 func hasGoFiles(dir string) bool { 1182 fis, _ := ioutil.ReadDir(dir) 1183 for _, fi := range fis { 1184 if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".go") { 1185 return true 1186 } 1187 } 1188 return false 1189 } 1190 1191 // reusePackage reuses package p to satisfy the import at the top 1192 // of the import stack stk. If this use causes an import loop, 1193 // reusePackage updates p's error information to record the loop. 1194 func reusePackage(p *Package, stk *ImportStack) *Package { 1195 // We use p.Internal.Imports==nil to detect a package that 1196 // is in the midst of its own loadPackage call 1197 // (all the recursion below happens before p.Internal.Imports gets set). 1198 if p.Internal.Imports == nil { 1199 if p.Error == nil { 1200 p.Error = &PackageError{ 1201 ImportStack: stk.Copy(), 1202 Err: errors.New("import cycle not allowed"), 1203 IsImportCycle: true, 1204 } 1205 } 1206 p.Incomplete = true 1207 } 1208 // Don't rewrite the import stack in the error if we have an import cycle. 1209 // If we do, we'll lose the path that describes the cycle. 1210 if p.Error != nil && !p.Error.IsImportCycle && stk.shorterThan(p.Error.ImportStack) { 1211 p.Error.ImportStack = stk.Copy() 1212 } 1213 return p 1214 } 1215 1216 // disallowInternal checks that srcDir (containing package importerPath, if non-empty) 1217 // is allowed to import p. 1218 // If the import is allowed, disallowInternal returns the original package p. 1219 // If not, it returns a new package containing just an appropriate error. 1220 func disallowInternal(srcDir string, importer *Package, importerPath string, p *Package, stk *ImportStack) *Package { 1221 // golang.org/s/go14internal: 1222 // An import of a path containing the element “internal” 1223 // is disallowed if the importing code is outside the tree 1224 // rooted at the parent of the “internal” directory. 1225 1226 // There was an error loading the package; stop here. 1227 if p.Error != nil { 1228 return p 1229 } 1230 1231 // The generated 'testmain' package is allowed to access testing/internal/..., 1232 // as if it were generated into the testing directory tree 1233 // (it's actually in a temporary directory outside any Go tree). 1234 // This cleans up a former kludge in passing functionality to the testing package. 1235 if strings.HasPrefix(p.ImportPath, "testing/internal") && len(*stk) >= 2 && (*stk)[len(*stk)-2] == "testmain" { 1236 return p 1237 } 1238 1239 // We can't check standard packages with gccgo. 1240 if cfg.BuildContext.Compiler == "gccgo" && p.Standard { 1241 return p 1242 } 1243 1244 // The sort package depends on internal/reflectlite, but during bootstrap 1245 // the path rewriting causes the normal internal checks to fail. 1246 // Instead, just ignore the internal rules during bootstrap. 1247 if p.Standard && strings.HasPrefix(importerPath, "bootstrap/") { 1248 return p 1249 } 1250 1251 // The stack includes p.ImportPath. 1252 // If that's the only thing on the stack, we started 1253 // with a name given on the command line, not an 1254 // import. Anything listed on the command line is fine. 1255 if len(*stk) == 1 { 1256 return p 1257 } 1258 1259 // Check for "internal" element: three cases depending on begin of string and/or end of string. 1260 i, ok := findInternal(p.ImportPath) 1261 if !ok { 1262 return p 1263 } 1264 1265 // Internal is present. 1266 // Map import path back to directory corresponding to parent of internal. 1267 if i > 0 { 1268 i-- // rewind over slash in ".../internal" 1269 } 1270 1271 if p.Module == nil { 1272 parent := p.Dir[:i+len(p.Dir)-len(p.ImportPath)] 1273 1274 if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) { 1275 return p 1276 } 1277 1278 // Look for symlinks before reporting error. 1279 srcDir = expandPath(srcDir) 1280 parent = expandPath(parent) 1281 if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) { 1282 return p 1283 } 1284 } else { 1285 // p is in a module, so make it available based on the importer's import path instead 1286 // of the file path (https://golang.org/issue/23970). 1287 if importer.Internal.CmdlineFiles { 1288 // The importer is a list of command-line files. 1289 // Pretend that the import path is the import path of the 1290 // directory containing them. 1291 // If the directory is outside the main module, this will resolve to ".", 1292 // which is not a prefix of any valid module. 1293 importerPath = ModDirImportPath(importer.Dir) 1294 } 1295 parentOfInternal := p.ImportPath[:i] 1296 if str.HasPathPrefix(importerPath, parentOfInternal) { 1297 return p 1298 } 1299 } 1300 1301 // Internal is present, and srcDir is outside parent's tree. Not allowed. 1302 perr := *p 1303 perr.Error = &PackageError{ 1304 ImportStack: stk.Copy(), 1305 Err: ImportErrorf(p.ImportPath, "use of internal package "+p.ImportPath+" not allowed"), 1306 } 1307 perr.Incomplete = true 1308 return &perr 1309 } 1310 1311 // findInternal looks for the final "internal" path element in the given import path. 1312 // If there isn't one, findInternal returns ok=false. 1313 // Otherwise, findInternal returns ok=true and the index of the "internal". 1314 func findInternal(path string) (index int, ok bool) { 1315 // Three cases, depending on internal at start/end of string or not. 1316 // The order matters: we must return the index of the final element, 1317 // because the final one produces the most restrictive requirement 1318 // on the importer. 1319 switch { 1320 case strings.HasSuffix(path, "/internal"): 1321 return len(path) - len("internal"), true 1322 case strings.Contains(path, "/internal/"): 1323 return strings.LastIndex(path, "/internal/") + 1, true 1324 case path == "internal", strings.HasPrefix(path, "github.com/gagliardetto/golang-go/not-internal/"): 1325 return 0, true 1326 } 1327 return 0, false 1328 } 1329 1330 // disallowVendor checks that srcDir is allowed to import p as path. 1331 // If the import is allowed, disallowVendor returns the original package p. 1332 // If not, it returns a new package containing just an appropriate error. 1333 func disallowVendor(srcDir string, path string, p *Package, stk *ImportStack) *Package { 1334 // The stack includes p.ImportPath. 1335 // If that's the only thing on the stack, we started 1336 // with a name given on the command line, not an 1337 // import. Anything listed on the command line is fine. 1338 if len(*stk) == 1 { 1339 return p 1340 } 1341 1342 if perr := disallowVendorVisibility(srcDir, p, stk); perr != p { 1343 return perr 1344 } 1345 1346 // Paths like x/vendor/y must be imported as y, never as x/vendor/y. 1347 if i, ok := FindVendor(path); ok { 1348 perr := *p 1349 perr.Error = &PackageError{ 1350 ImportStack: stk.Copy(), 1351 Err: ImportErrorf(path, "%s must be imported as %s", path, path[i+len("vendor/"):]), 1352 } 1353 perr.Incomplete = true 1354 return &perr 1355 } 1356 1357 return p 1358 } 1359 1360 // disallowVendorVisibility checks that srcDir is allowed to import p. 1361 // The rules are the same as for /internal/ except that a path ending in /vendor 1362 // is not subject to the rules, only subdirectories of vendor. 1363 // This allows people to have packages and commands named vendor, 1364 // for maximal compatibility with existing source trees. 1365 func disallowVendorVisibility(srcDir string, p *Package, stk *ImportStack) *Package { 1366 // The stack includes p.ImportPath. 1367 // If that's the only thing on the stack, we started 1368 // with a name given on the command line, not an 1369 // import. Anything listed on the command line is fine. 1370 if len(*stk) == 1 { 1371 return p 1372 } 1373 1374 // Check for "vendor" element. 1375 i, ok := FindVendor(p.ImportPath) 1376 if !ok { 1377 return p 1378 } 1379 1380 // Vendor is present. 1381 // Map import path back to directory corresponding to parent of vendor. 1382 if i > 0 { 1383 i-- // rewind over slash in ".../vendor" 1384 } 1385 truncateTo := i + len(p.Dir) - len(p.ImportPath) 1386 if truncateTo < 0 || len(p.Dir) < truncateTo { 1387 return p 1388 } 1389 parent := p.Dir[:truncateTo] 1390 if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) { 1391 return p 1392 } 1393 1394 // Look for symlinks before reporting error. 1395 srcDir = expandPath(srcDir) 1396 parent = expandPath(parent) 1397 if str.HasFilePathPrefix(filepath.Clean(srcDir), filepath.Clean(parent)) { 1398 return p 1399 } 1400 1401 // Vendor is present, and srcDir is outside parent's tree. Not allowed. 1402 perr := *p 1403 perr.Error = &PackageError{ 1404 ImportStack: stk.Copy(), 1405 Err: errors.New("use of vendored package not allowed"), 1406 } 1407 perr.Incomplete = true 1408 return &perr 1409 } 1410 1411 // FindVendor looks for the last non-terminating "vendor" path element in the given import path. 1412 // If there isn't one, FindVendor returns ok=false. 1413 // Otherwise, FindVendor returns ok=true and the index of the "vendor". 1414 // 1415 // Note that terminating "vendor" elements don't count: "x/vendor" is its own package, 1416 // not the vendored copy of an import "" (the empty import path). 1417 // This will allow people to have packages or commands named vendor. 1418 // This may help reduce breakage, or it may just be confusing. We'll see. 1419 func FindVendor(path string) (index int, ok bool) { 1420 // Two cases, depending on internal at start of string or not. 1421 // The order matters: we must return the index of the final element, 1422 // because the final one is where the effective import path starts. 1423 switch { 1424 case strings.Contains(path, "/vendor/"): 1425 return strings.LastIndex(path, "/vendor/") + 1, true 1426 case strings.HasPrefix(path, "vendor/"): 1427 return 0, true 1428 } 1429 return 0, false 1430 } 1431 1432 type TargetDir int 1433 1434 const ( 1435 ToTool TargetDir = iota // to GOROOT/pkg/tool (default for cmd/*) 1436 ToBin // to bin dir inside package root (default for non-cmd/*) 1437 StalePath // an old import path; fail to build 1438 ) 1439 1440 // InstallTargetDir reports the target directory for installing the command p. 1441 func InstallTargetDir(p *Package) TargetDir { 1442 if strings.HasPrefix(p.ImportPath, "code.google.com/p/go.tools/cmd/") { 1443 return StalePath 1444 } 1445 if p.Goroot && strings.HasPrefix(p.ImportPath, "github.com/gagliardetto/golang-go/cmd/") && p.Name == "main" { 1446 switch p.ImportPath { 1447 case "github.com/gagliardetto/golang-go/cmd/go", "github.com/gagliardetto/golang-go/cmd/gofmt": 1448 return ToBin 1449 } 1450 return ToTool 1451 } 1452 return ToBin 1453 } 1454 1455 var cgoExclude = map[string]bool{ 1456 "runtime/cgo": true, 1457 } 1458 1459 var cgoSyscallExclude = map[string]bool{ 1460 "runtime/cgo": true, 1461 "runtime/race": true, 1462 "runtime/msan": true, 1463 } 1464 1465 var foldPath = make(map[string]string) 1466 1467 // exeFromImportPath returns an executable name 1468 // for a package using the import path. 1469 // 1470 // The executable name is the last element of the import path. 1471 // In module-aware mode, an additional rule is used on import paths 1472 // consisting of two or more path elements. If the last element is 1473 // a vN path element specifying the major version, then the 1474 // second last element of the import path is used instead. 1475 func (p *Package) exeFromImportPath() string { 1476 _, elem := pathpkg.Split(p.ImportPath) 1477 if cfg.ModulesEnabled { 1478 // If this is example.com/mycmd/v2, it's more useful to 1479 // install it as mycmd than as v2. See golang.org/issue/24667. 1480 if elem != p.ImportPath && isVersionElement(elem) { 1481 _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) 1482 } 1483 } 1484 return elem 1485 } 1486 1487 // exeFromFiles returns an executable name for a package 1488 // using the first element in GoFiles or CgoFiles collections without the prefix. 1489 // 1490 // Returns empty string in case of empty collection. 1491 func (p *Package) exeFromFiles() string { 1492 var src string 1493 if len(p.GoFiles) > 0 { 1494 src = p.GoFiles[0] 1495 } else if len(p.CgoFiles) > 0 { 1496 src = p.CgoFiles[0] 1497 } else { 1498 return "" 1499 } 1500 _, elem := filepath.Split(src) 1501 return elem[:len(elem)-len(".go")] 1502 } 1503 1504 // DefaultExecName returns the default executable name for a package 1505 func (p *Package) DefaultExecName() string { 1506 if p.Internal.CmdlineFiles { 1507 return p.exeFromFiles() 1508 } 1509 return p.exeFromImportPath() 1510 } 1511 1512 // load populates p using information from bp, err, which should 1513 // be the result of calling build.Context.Import. 1514 func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { 1515 p.copyBuild(bp) 1516 1517 // The localPrefix is the path we interpret ./ imports relative to. 1518 // Synthesized main packages sometimes override this. 1519 if p.Internal.Local { 1520 p.Internal.LocalPrefix = dirToImportPath(p.Dir) 1521 } 1522 1523 // setError sets p.Error if it hasn't already been set. We may proceed 1524 // after encountering some errors so that 'go list -e' has more complete 1525 // output. If there's more than one error, we should report the first. 1526 setError := func(err error) { 1527 if p.Error == nil { 1528 p.Error = &PackageError{ 1529 ImportStack: stk.Copy(), 1530 Err: err, 1531 } 1532 } 1533 } 1534 1535 if err != nil { 1536 if _, ok := err.(*build.NoGoError); ok { 1537 err = &NoGoError{Package: p} 1538 } 1539 p.Incomplete = true 1540 1541 setError(base.ExpandScanner(err)) 1542 if _, isScanErr := err.(scanner.ErrorList); !isScanErr { 1543 return 1544 } 1545 // Fall through if there was an error parsing a file. 'go list -e' should 1546 // still report imports and other metadata. 1547 } 1548 1549 useBindir := p.Name == "main" 1550 if !p.Standard { 1551 switch cfg.BuildBuildmode { 1552 case "c-archive", "c-shared", "plugin": 1553 useBindir = false 1554 } 1555 } 1556 1557 if useBindir { 1558 // Report an error when the old code.google.com/p/go.tools paths are used. 1559 if InstallTargetDir(p) == StalePath { 1560 newPath := strings.Replace(p.ImportPath, "code.google.com/p/go.", "golang.org/x/", 1) 1561 e := ImportErrorf(p.ImportPath, "the %v command has moved; use %v instead.", p.ImportPath, newPath) 1562 setError(e) 1563 return 1564 } 1565 elem := p.DefaultExecName() 1566 full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem 1567 if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH { 1568 // Install cross-compiled binaries to subdirectories of bin. 1569 elem = full 1570 } 1571 if p.Internal.Build.BinDir == "" && cfg.ModulesEnabled { 1572 p.Internal.Build.BinDir = ModBinDir() 1573 } 1574 if p.Internal.Build.BinDir != "" { 1575 // Install to GOBIN or bin of GOPATH entry. 1576 p.Target = filepath.Join(p.Internal.Build.BinDir, elem) 1577 if !p.Goroot && strings.Contains(elem, "/") && cfg.GOBIN != "" { 1578 // Do not create $GOBIN/goos_goarch/elem. 1579 p.Target = "" 1580 p.Internal.GobinSubdir = true 1581 } 1582 } 1583 if InstallTargetDir(p) == ToTool { 1584 // This is for 'go tool'. 1585 // Override all the usual logic and force it into the tool directory. 1586 if cfg.BuildToolchainName == "gccgo" { 1587 p.Target = filepath.Join(base.ToolDir, elem) 1588 } else { 1589 p.Target = filepath.Join(cfg.GOROOTpkg, "tool", full) 1590 } 1591 } 1592 if p.Target != "" && cfg.BuildContext.GOOS == "windows" { 1593 p.Target += ".exe" 1594 } 1595 } else if p.Internal.Local { 1596 // Local import turned into absolute path. 1597 // No permanent install target. 1598 p.Target = "" 1599 } else { 1600 p.Target = p.Internal.Build.PkgObj 1601 if cfg.BuildLinkshared && p.Target != "" { 1602 // TODO(bcmills): The reliance on p.Target implies that -linkshared does 1603 // not work for any package that lacks a Target — such as a non-main 1604 // package in module mode. We should probably fix that. 1605 shlibnamefile := p.Target[:len(p.Target)-2] + ".shlibname" 1606 shlib, err := ioutil.ReadFile(shlibnamefile) 1607 if err != nil && !os.IsNotExist(err) { 1608 base.Fatalf("reading shlibname: %v", err) 1609 } 1610 if err == nil { 1611 libname := strings.TrimSpace(string(shlib)) 1612 if cfg.BuildContext.Compiler == "gccgo" { 1613 p.Shlib = filepath.Join(p.Internal.Build.PkgTargetRoot, "shlibs", libname) 1614 } else { 1615 p.Shlib = filepath.Join(p.Internal.Build.PkgTargetRoot, libname) 1616 } 1617 } 1618 } 1619 } 1620 1621 // Build augmented import list to add implicit dependencies. 1622 // Be careful not to add imports twice, just to avoid confusion. 1623 importPaths := p.Imports 1624 addImport := func(path string, forCompiler bool) { 1625 for _, p := range importPaths { 1626 if path == p { 1627 return 1628 } 1629 } 1630 importPaths = append(importPaths, path) 1631 if forCompiler { 1632 p.Internal.CompiledImports = append(p.Internal.CompiledImports, path) 1633 } 1634 } 1635 1636 // Cgo translation adds imports of "unsafe", "runtime/cgo" and "syscall", 1637 // except for certain packages, to avoid circular dependencies. 1638 if p.UsesCgo() { 1639 addImport("unsafe", true) 1640 } 1641 if p.UsesCgo() && (!p.Standard || !cgoExclude[p.ImportPath]) && cfg.BuildContext.Compiler != "gccgo" { 1642 addImport("runtime/cgo", true) 1643 } 1644 if p.UsesCgo() && (!p.Standard || !cgoSyscallExclude[p.ImportPath]) { 1645 addImport("syscall", true) 1646 } 1647 1648 // SWIG adds imports of some standard packages. 1649 if p.UsesSwig() { 1650 addImport("unsafe", true) 1651 if cfg.BuildContext.Compiler != "gccgo" { 1652 addImport("runtime/cgo", true) 1653 } 1654 addImport("syscall", true) 1655 addImport("sync", true) 1656 1657 // TODO: The .swig and .swigcxx files can use 1658 // %go_import directives to import other packages. 1659 } 1660 1661 // The linker loads implicit dependencies. 1662 if p.Name == "main" && !p.Internal.ForceLibrary { 1663 for _, dep := range LinkerDeps(p) { 1664 addImport(dep, false) 1665 } 1666 } 1667 1668 // Check for case-insensitive collision of input files. 1669 // To avoid problems on case-insensitive files, we reject any package 1670 // where two different input files have equal names under a case-insensitive 1671 // comparison. 1672 inputs := p.AllFiles() 1673 f1, f2 := str.FoldDup(inputs) 1674 if f1 != "" { 1675 setError(fmt.Errorf("case-insensitive file name collision: %q and %q", f1, f2)) 1676 return 1677 } 1678 1679 // If first letter of input file is ASCII, it must be alphanumeric. 1680 // This avoids files turning into flags when invoking commands, 1681 // and other problems we haven't thought of yet. 1682 // Also, _cgo_ files must be generated by us, not supplied. 1683 // They are allowed to have //go:cgo_ldflag directives. 1684 // The directory scan ignores files beginning with _, 1685 // so we shouldn't see any _cgo_ files anyway, but just be safe. 1686 for _, file := range inputs { 1687 if !SafeArg(file) || strings.HasPrefix(file, "_cgo_") { 1688 setError(fmt.Errorf("invalid input file name %q", file)) 1689 return 1690 } 1691 } 1692 if name := pathpkg.Base(p.ImportPath); !SafeArg(name) { 1693 setError(fmt.Errorf("invalid input directory name %q", name)) 1694 return 1695 } 1696 if !SafeArg(p.ImportPath) { 1697 setError(ImportErrorf(p.ImportPath, "invalid import path %q", p.ImportPath)) 1698 return 1699 } 1700 1701 // Build list of imported packages and full dependency list. 1702 imports := make([]*Package, 0, len(p.Imports)) 1703 for i, path := range importPaths { 1704 if path == "C" { 1705 continue 1706 } 1707 p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) 1708 1709 path = p1.ImportPath 1710 importPaths[i] = path 1711 if i < len(p.Imports) { 1712 p.Imports[i] = path 1713 } 1714 1715 imports = append(imports, p1) 1716 if p1.Incomplete { 1717 p.Incomplete = true 1718 } 1719 } 1720 p.Internal.Imports = imports 1721 p.collectDeps() 1722 1723 // unsafe is a fake package. 1724 if p.Standard && (p.ImportPath == "unsafe" || cfg.BuildContext.Compiler == "gccgo") { 1725 p.Target = "" 1726 } 1727 1728 // If cgo is not enabled, ignore cgo supporting sources 1729 // just as we ignore go files containing import "C". 1730 if !cfg.BuildContext.CgoEnabled { 1731 p.CFiles = nil 1732 p.CXXFiles = nil 1733 p.MFiles = nil 1734 p.SwigFiles = nil 1735 p.SwigCXXFiles = nil 1736 // Note that SFiles are okay (they go to the Go assembler) 1737 // and HFiles are okay (they might be used by the SFiles). 1738 // Also Sysofiles are okay (they might not contain object 1739 // code; see issue #16050). 1740 } 1741 1742 // The gc toolchain only permits C source files with cgo or SWIG. 1743 if len(p.CFiles) > 0 && !p.UsesCgo() && !p.UsesSwig() && cfg.BuildContext.Compiler == "gc" { 1744 setError(fmt.Errorf("C source files not allowed when not using cgo or SWIG: %s", strings.Join(p.CFiles, " "))) 1745 return 1746 } 1747 1748 // C++, Objective-C, and Fortran source files are permitted only with cgo or SWIG, 1749 // regardless of toolchain. 1750 if len(p.CXXFiles) > 0 && !p.UsesCgo() && !p.UsesSwig() { 1751 setError(fmt.Errorf("C++ source files not allowed when not using cgo or SWIG: %s", strings.Join(p.CXXFiles, " "))) 1752 return 1753 } 1754 if len(p.MFiles) > 0 && !p.UsesCgo() && !p.UsesSwig() { 1755 setError(fmt.Errorf("Objective-C source files not allowed when not using cgo or SWIG: %s", strings.Join(p.MFiles, " "))) 1756 return 1757 } 1758 if len(p.FFiles) > 0 && !p.UsesCgo() && !p.UsesSwig() { 1759 setError(fmt.Errorf("Fortran source files not allowed when not using cgo or SWIG: %s", strings.Join(p.FFiles, " "))) 1760 return 1761 } 1762 1763 // Check for case-insensitive collisions of import paths. 1764 fold := str.ToFold(p.ImportPath) 1765 if other := foldPath[fold]; other == "" { 1766 foldPath[fold] = p.ImportPath 1767 } else if other != p.ImportPath { 1768 setError(ImportErrorf(p.ImportPath, "case-insensitive import collision: %q and %q", p.ImportPath, other)) 1769 return 1770 } 1771 1772 if cfg.ModulesEnabled && p.Error == nil { 1773 mainPath := p.ImportPath 1774 if p.Internal.CmdlineFiles { 1775 mainPath = "command-line-arguments" 1776 } 1777 p.Module = ModPackageModuleInfo(mainPath) 1778 if p.Name == "main" && len(p.DepsErrors) == 0 { 1779 p.Internal.BuildInfo = ModPackageBuildInfo(mainPath, p.Deps) 1780 } 1781 } 1782 } 1783 1784 // collectDeps populates p.Deps and p.DepsErrors by iterating over 1785 // p.Internal.Imports. 1786 // 1787 // TODO(jayconrod): collectDeps iterates over transitive imports for every 1788 // package. We should only need to visit direct imports. 1789 func (p *Package) collectDeps() { 1790 deps := make(map[string]*Package) 1791 var q []*Package 1792 q = append(q, p.Internal.Imports...) 1793 for i := 0; i < len(q); i++ { 1794 p1 := q[i] 1795 path := p1.ImportPath 1796 // The same import path could produce an error or not, 1797 // depending on what tries to import it. 1798 // Prefer to record entries with errors, so we can report them. 1799 p0 := deps[path] 1800 if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) { 1801 deps[path] = p1 1802 for _, p2 := range p1.Internal.Imports { 1803 if deps[p2.ImportPath] != p2 { 1804 q = append(q, p2) 1805 } 1806 } 1807 } 1808 } 1809 1810 p.Deps = make([]string, 0, len(deps)) 1811 for dep := range deps { 1812 p.Deps = append(p.Deps, dep) 1813 } 1814 sort.Strings(p.Deps) 1815 for _, dep := range p.Deps { 1816 p1 := deps[dep] 1817 if p1 == nil { 1818 panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath) 1819 } 1820 if p1.Error != nil { 1821 p.DepsErrors = append(p.DepsErrors, p1.Error) 1822 } 1823 } 1824 } 1825 1826 // SafeArg reports whether arg is a "safe" command-line argument, 1827 // meaning that when it appears in a command-line, it probably 1828 // doesn't have some special meaning other than its own name. 1829 // Obviously args beginning with - are not safe (they look like flags). 1830 // Less obviously, args beginning with @ are not safe (they look like 1831 // GNU binutils flagfile specifiers, sometimes called "response files"). 1832 // To be conservative, we reject almost any arg beginning with non-alphanumeric ASCII. 1833 // We accept leading . _ and / as likely in file system paths. 1834 // There is a copy of this function in cmd/compile/internal/gc/noder.go. 1835 func SafeArg(name string) bool { 1836 if name == "" { 1837 return false 1838 } 1839 c := name[0] 1840 return '0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || c == '.' || c == '_' || c == '/' || c >= utf8.RuneSelf 1841 } 1842 1843 // LinkerDeps returns the list of linker-induced dependencies for main package p. 1844 func LinkerDeps(p *Package) []string { 1845 // Everything links runtime. 1846 deps := []string{"runtime"} 1847 1848 // External linking mode forces an import of runtime/cgo. 1849 if externalLinkingForced(p) && cfg.BuildContext.Compiler != "gccgo" { 1850 deps = append(deps, "runtime/cgo") 1851 } 1852 // On ARM with GOARM=5, it forces an import of math, for soft floating point. 1853 if cfg.Goarch == "arm" { 1854 deps = append(deps, "math") 1855 } 1856 // Using the race detector forces an import of runtime/race. 1857 if cfg.BuildRace { 1858 deps = append(deps, "runtime/race") 1859 } 1860 // Using memory sanitizer forces an import of runtime/msan. 1861 if cfg.BuildMSan { 1862 deps = append(deps, "runtime/msan") 1863 } 1864 1865 return deps 1866 } 1867 1868 // externalLinkingForced reports whether external linking is being 1869 // forced even for programs that do not use cgo. 1870 func externalLinkingForced(p *Package) bool { 1871 // Some targets must use external linking even inside GOROOT. 1872 switch cfg.BuildContext.GOOS { 1873 case "android": 1874 return true 1875 case "darwin": 1876 switch cfg.BuildContext.GOARCH { 1877 case "arm", "arm64": 1878 return true 1879 } 1880 } 1881 1882 if !cfg.BuildContext.CgoEnabled { 1883 return false 1884 } 1885 // Currently build modes c-shared, pie (on systems that do not 1886 // support PIE with internal linking mode (currently all 1887 // systems: issue #18968)), plugin, and -linkshared force 1888 // external linking mode, as of course does 1889 // -ldflags=-linkmode=external. External linking mode forces 1890 // an import of runtime/cgo. 1891 pieCgo := cfg.BuildBuildmode == "pie" 1892 linkmodeExternal := false 1893 if p != nil { 1894 ldflags := BuildLdflags.For(p) 1895 for i, a := range ldflags { 1896 if a == "-linkmode=external" { 1897 linkmodeExternal = true 1898 } 1899 if a == "-linkmode" && i+1 < len(ldflags) && ldflags[i+1] == "external" { 1900 linkmodeExternal = true 1901 } 1902 } 1903 } 1904 1905 return cfg.BuildBuildmode == "c-shared" || cfg.BuildBuildmode == "plugin" || pieCgo || cfg.BuildLinkshared || linkmodeExternal 1906 } 1907 1908 // mkAbs rewrites list, which must be paths relative to p.Dir, 1909 // into a sorted list of absolute paths. It edits list in place but for 1910 // convenience also returns list back to its caller. 1911 func (p *Package) mkAbs(list []string) []string { 1912 for i, f := range list { 1913 list[i] = filepath.Join(p.Dir, f) 1914 } 1915 sort.Strings(list) 1916 return list 1917 } 1918 1919 // InternalGoFiles returns the list of Go files being built for the package, 1920 // using absolute paths. 1921 func (p *Package) InternalGoFiles() []string { 1922 return p.mkAbs(str.StringList(p.GoFiles, p.CgoFiles, p.TestGoFiles)) 1923 } 1924 1925 // InternalXGoFiles returns the list of Go files being built for the XTest package, 1926 // using absolute paths. 1927 func (p *Package) InternalXGoFiles() []string { 1928 return p.mkAbs(p.XTestGoFiles) 1929 } 1930 1931 // InternalGoFiles returns the list of all Go files possibly relevant for the package, 1932 // using absolute paths. "Possibly relevant" means that files are not excluded 1933 // due to build tags, but files with names beginning with . or _ are still excluded. 1934 func (p *Package) InternalAllGoFiles() []string { 1935 var extra []string 1936 for _, f := range p.IgnoredGoFiles { 1937 if f != "" && f[0] != '.' || f[0] != '_' { 1938 extra = append(extra, f) 1939 } 1940 } 1941 return p.mkAbs(str.StringList(extra, p.GoFiles, p.CgoFiles, p.TestGoFiles, p.XTestGoFiles)) 1942 } 1943 1944 // usesSwig reports whether the package needs to run SWIG. 1945 func (p *Package) UsesSwig() bool { 1946 return len(p.SwigFiles) > 0 || len(p.SwigCXXFiles) > 0 1947 } 1948 1949 // usesCgo reports whether the package needs to run cgo 1950 func (p *Package) UsesCgo() bool { 1951 return len(p.CgoFiles) > 0 1952 } 1953 1954 // PackageList returns the list of packages in the dag rooted at roots 1955 // as visited in a depth-first post-order traversal. 1956 func PackageList(roots []*Package) []*Package { 1957 seen := map[*Package]bool{} 1958 all := []*Package{} 1959 var walk func(*Package) 1960 walk = func(p *Package) { 1961 if seen[p] { 1962 return 1963 } 1964 seen[p] = true 1965 for _, p1 := range p.Internal.Imports { 1966 walk(p1) 1967 } 1968 all = append(all, p) 1969 } 1970 for _, root := range roots { 1971 walk(root) 1972 } 1973 return all 1974 } 1975 1976 // TestPackageList returns the list of packages in the dag rooted at roots 1977 // as visited in a depth-first post-order traversal, including the test 1978 // imports of the roots. This ignores errors in test packages. 1979 func TestPackageList(roots []*Package) []*Package { 1980 seen := map[*Package]bool{} 1981 all := []*Package{} 1982 var walk func(*Package) 1983 walk = func(p *Package) { 1984 if seen[p] { 1985 return 1986 } 1987 seen[p] = true 1988 for _, p1 := range p.Internal.Imports { 1989 walk(p1) 1990 } 1991 all = append(all, p) 1992 } 1993 walkTest := func(root *Package, path string) { 1994 var stk ImportStack 1995 p1 := LoadImport(path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) 1996 if p1.Error == nil { 1997 walk(p1) 1998 } 1999 } 2000 for _, root := range roots { 2001 walk(root) 2002 for _, path := range root.TestImports { 2003 walkTest(root, path) 2004 } 2005 for _, path := range root.XTestImports { 2006 walkTest(root, path) 2007 } 2008 } 2009 return all 2010 } 2011 2012 // LoadImportWithFlags loads the package with the given import path and 2013 // sets tool flags on that package. This function is useful loading implicit 2014 // dependencies (like sync/atomic for coverage). 2015 // TODO(jayconrod): delete this function and set flags automatically 2016 // in LoadImport instead. 2017 func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { 2018 p := LoadImport(path, srcDir, parent, stk, importPos, mode) 2019 setToolFlags(p) 2020 return p 2021 } 2022 2023 // Packages returns the packages named by the 2024 // command line arguments 'args'. If a named package 2025 // cannot be loaded at all (for example, if the directory does not exist), 2026 // then packages prints an error and does not include that 2027 // package in the results. However, if errors occur trying 2028 // to load dependencies of a named package, the named 2029 // package is still returned, with p.Incomplete = true 2030 // and details in p.DepsErrors. 2031 func Packages(args []string) []*Package { 2032 var pkgs []*Package 2033 for _, pkg := range PackagesAndErrors(args) { 2034 if pkg.Error != nil { 2035 base.Errorf("can't load package: %s", pkg.Error) 2036 continue 2037 } 2038 pkgs = append(pkgs, pkg) 2039 } 2040 return pkgs 2041 } 2042 2043 // PackagesAndErrors is like 'packages' but returns a 2044 // *Package for every argument, even the ones that 2045 // cannot be loaded at all. 2046 // The packages that fail to load will have p.Error != nil. 2047 func PackagesAndErrors(patterns []string) []*Package { 2048 for _, p := range patterns { 2049 // Listing is only supported with all patterns referring to either: 2050 // - Files that are part of the same directory. 2051 // - Explicit package paths or patterns. 2052 if strings.HasSuffix(p, ".go") { 2053 // We need to test whether the path is an actual Go file and not a 2054 // package path or pattern ending in '.go' (see golang.org/issue/34653). 2055 if fi, err := os.Stat(p); err == nil && !fi.IsDir() { 2056 return []*Package{GoFilesPackage(patterns)} 2057 } 2058 } 2059 } 2060 2061 matches := ImportPaths(patterns) 2062 var ( 2063 pkgs []*Package 2064 stk ImportStack 2065 seenPkg = make(map[*Package]bool) 2066 ) 2067 2068 pre := newPreload() 2069 defer pre.flush() 2070 pre.preloadMatches(matches) 2071 2072 for _, m := range matches { 2073 for _, pkg := range m.Pkgs { 2074 if pkg == "" { 2075 panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern)) 2076 } 2077 p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0) 2078 p.Match = append(p.Match, m.Pattern) 2079 p.Internal.CmdlinePkg = true 2080 if m.Literal { 2081 // Note: do not set = m.Literal unconditionally 2082 // because maybe we'll see p matching both 2083 // a literal and also a non-literal pattern. 2084 p.Internal.CmdlinePkgLiteral = true 2085 } 2086 if seenPkg[p] { 2087 continue 2088 } 2089 seenPkg[p] = true 2090 pkgs = append(pkgs, p) 2091 } 2092 } 2093 2094 // Now that CmdlinePkg is set correctly, 2095 // compute the effective flags for all loaded packages 2096 // (not just the ones matching the patterns but also 2097 // their dependencies). 2098 setToolFlags(pkgs...) 2099 2100 return pkgs 2101 } 2102 2103 func setToolFlags(pkgs ...*Package) { 2104 for _, p := range PackageList(pkgs) { 2105 p.Internal.Asmflags = BuildAsmflags.For(p) 2106 p.Internal.Gcflags = BuildGcflags.For(p) 2107 p.Internal.Ldflags = BuildLdflags.For(p) 2108 p.Internal.Gccgoflags = BuildGccgoflags.For(p) 2109 } 2110 } 2111 2112 func ImportPaths(args []string) []*search.Match { 2113 if ModInit(); cfg.ModulesEnabled { 2114 return ModImportPaths(args) 2115 } 2116 return search.ImportPaths(args) 2117 } 2118 2119 // PackagesForBuild is like Packages but exits 2120 // if any of the packages or their dependencies have errors 2121 // (cannot be built). 2122 func PackagesForBuild(args []string) []*Package { 2123 pkgs := PackagesAndErrors(args) 2124 printed := map[*PackageError]bool{} 2125 for _, pkg := range pkgs { 2126 if pkg.Error != nil { 2127 base.Errorf("can't load package: %s", pkg.Error) 2128 printed[pkg.Error] = true 2129 } 2130 for _, err := range pkg.DepsErrors { 2131 // Since these are errors in dependencies, 2132 // the same error might show up multiple times, 2133 // once in each package that depends on it. 2134 // Only print each once. 2135 if !printed[err] { 2136 printed[err] = true 2137 base.Errorf("%s", err) 2138 } 2139 } 2140 } 2141 base.ExitIfErrors() 2142 2143 // Check for duplicate loads of the same package. 2144 // That should be impossible, but if it does happen then 2145 // we end up trying to build the same package twice, 2146 // usually in parallel overwriting the same files, 2147 // which doesn't work very well. 2148 seen := map[string]bool{} 2149 reported := map[string]bool{} 2150 for _, pkg := range PackageList(pkgs) { 2151 if seen[pkg.ImportPath] && !reported[pkg.ImportPath] { 2152 reported[pkg.ImportPath] = true 2153 base.Errorf("internal error: duplicate loads of %s", pkg.ImportPath) 2154 } 2155 seen[pkg.ImportPath] = true 2156 } 2157 base.ExitIfErrors() 2158 2159 return pkgs 2160 } 2161 2162 // GoFilesPackage creates a package for building a collection of Go files 2163 // (typically named on the command line). The target is named p.a for 2164 // package p or named after the first Go file for package main. 2165 func GoFilesPackage(gofiles []string) *Package { 2166 ModInit() 2167 2168 for _, f := range gofiles { 2169 if !strings.HasSuffix(f, ".go") { 2170 pkg := new(Package) 2171 pkg.Internal.Local = true 2172 pkg.Internal.CmdlineFiles = true 2173 pkg.Name = f 2174 pkg.Error = &PackageError{ 2175 Err: fmt.Errorf("named files must be .go files: %s", pkg.Name), 2176 } 2177 return pkg 2178 } 2179 } 2180 2181 var stk ImportStack 2182 ctxt := cfg.BuildContext 2183 ctxt.UseAllFiles = true 2184 2185 // Synthesize fake "directory" that only shows the named files, 2186 // to make it look like this is a standard package or 2187 // command directory. So that local imports resolve 2188 // consistently, the files must all be in the same directory. 2189 var dirent []os.FileInfo 2190 var dir string 2191 for _, file := range gofiles { 2192 fi, err := os.Stat(file) 2193 if err != nil { 2194 base.Fatalf("%s", err) 2195 } 2196 if fi.IsDir() { 2197 base.Fatalf("%s is a directory, should be a Go file", file) 2198 } 2199 dir1, _ := filepath.Split(file) 2200 if dir1 == "" { 2201 dir1 = "./" 2202 } 2203 if dir == "" { 2204 dir = dir1 2205 } else if dir != dir1 { 2206 base.Fatalf("named files must all be in one directory; have %s and %s", dir, dir1) 2207 } 2208 dirent = append(dirent, fi) 2209 } 2210 ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } 2211 2212 if cfg.ModulesEnabled { 2213 ModImportFromFiles(gofiles) 2214 } 2215 2216 var err error 2217 if dir == "" { 2218 dir = base.Cwd 2219 } 2220 dir, err = filepath.Abs(dir) 2221 if err != nil { 2222 base.Fatalf("%s", err) 2223 } 2224 2225 bp, err := ctxt.ImportDir(dir, 0) 2226 pkg := new(Package) 2227 pkg.Internal.Local = true 2228 pkg.Internal.CmdlineFiles = true 2229 stk.Push("main") 2230 pkg.load(&stk, bp, err) 2231 stk.Pop() 2232 pkg.Internal.LocalPrefix = dirToImportPath(dir) 2233 pkg.ImportPath = "command-line-arguments" 2234 pkg.Target = "" 2235 pkg.Match = gofiles 2236 2237 if pkg.Name == "main" { 2238 exe := pkg.DefaultExecName() + cfg.ExeSuffix 2239 2240 if cfg.GOBIN != "" { 2241 pkg.Target = filepath.Join(cfg.GOBIN, exe) 2242 } else if cfg.ModulesEnabled { 2243 pkg.Target = filepath.Join(ModBinDir(), exe) 2244 } 2245 } 2246 2247 setToolFlags(pkg) 2248 2249 return pkg 2250 }