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 5package work 6 7import ( 8 "context" 9 "errors" 10 "flag" 11 "fmt" 12 "go/build" 13 "os" 14 "path/filepath" 15 "runtime" 16 "strconv" 17 "strings" 18 19 "cmd/go/internal/base" 20 "cmd/go/internal/cfg" 21 "cmd/go/internal/fsys" 22 "cmd/go/internal/load" 23 "cmd/go/internal/modload" 24 "cmd/go/internal/search" 25 "cmd/go/internal/trace" 26) 27 28var CmdBuild = &base.Command{ 29 UsageLine: "go build [-o output] [build flags] [packages]", 30 Short: "compile packages and dependencies", 31 Long: ` 32Build compiles the packages named by the import paths, 33along with their dependencies, but it does not install the results. 34 35If the arguments to build are a list of .go files from a single directory, 36build treats them as a list of source files specifying a single package. 37 38When compiling packages, build ignores files that end in '_test.go'. 39 40When compiling a single main package, build writes the resulting 41executable to an output file named after the last non-major-version 42component of the package import path. The '.exe' suffix is added 43when writing a Windows executable. 44So 'go build example/sam' writes 'sam' or 'sam.exe'. 45'go build example.com/foo/v2' writes 'foo' or 'foo.exe', not 'v2.exe'. 46 47When compiling a package from a list of .go files, the executable 48is named after the first source file. 49'go build ed.go rx.go' writes 'ed' or 'ed.exe'. 50 51When compiling multiple packages or a single non-main package, 52build compiles the packages but discards the resulting object, 53serving only as a check that the packages can be built. 54 55The -o flag forces build to write the resulting executable or object 56to the named output file or directory, instead of the default behavior described 57in the last two paragraphs. If the named output is an existing directory or 58ends with a slash or backslash, then any resulting executables 59will be written to that directory. 60 61The build flags are shared by the build, clean, get, install, list, run, 62and test commands: 63 64 -C dir 65 Change to dir before running the command. 66 Any files named on the command line are interpreted after 67 changing directories. 68 If used, this flag must be the first one in the command line. 69 -a 70 force rebuilding of packages that are already up-to-date. 71 -n 72 print the commands but do not run them. 73 -p n 74 the number of programs, such as build commands or 75 test binaries, that can be run in parallel. 76 The default is GOMAXPROCS, normally the number of CPUs available. 77 -race 78 enable data race detection. 79 Supported only on linux/amd64, freebsd/amd64, darwin/amd64, darwin/arm64, windows/amd64, 80 linux/ppc64le and linux/arm64 (only for 48-bit VMA). 81 -msan 82 enable interoperation with memory sanitizer. 83 Supported only on linux/amd64, linux/arm64, linux/loong64, freebsd/amd64 84 and only with Clang/LLVM as the host C compiler. 85 PIE build mode will be used on all platforms except linux/amd64. 86 -asan 87 enable interoperation with address sanitizer. 88 Supported only on linux/arm64, linux/amd64, linux/loong64. 89 Supported on linux/amd64 or linux/arm64 and only with GCC 7 and higher 90 or Clang/LLVM 9 and higher. 91 And supported on linux/loong64 only with Clang/LLVM 16 and higher. 92 -cover 93 enable code coverage instrumentation. 94 -covermode set,count,atomic 95 set the mode for coverage analysis. 96 The default is "set" unless -race is enabled, 97 in which case it is "atomic". 98 The values: 99 set: bool: does this statement run? 100 count: int: how many times does this statement run? 101 atomic: int: count, but correct in multithreaded tests; 102 significantly more expensive. 103 Sets -cover. 104 -coverpkg pattern1,pattern2,pattern3 105 For a build that targets package 'main' (e.g. building a Go 106 executable), apply coverage analysis to each package matching 107 the patterns. The default is to apply coverage analysis to 108 packages in the main Go module. See 'go help packages' for a 109 description of package patterns. Sets -cover. 110 -v 111 print the names of packages as they are compiled. 112 -work 113 print the name of the temporary work directory and 114 do not delete it when exiting. 115 -x 116 print the commands. 117 -asmflags '[pattern=]arg list' 118 arguments to pass on each go tool asm invocation. 119 -buildmode mode 120 build mode to use. See 'go help buildmode' for more. 121 -buildvcs 122 Whether to stamp binaries with version control information 123 ("true", "false", or "auto"). By default ("auto"), version control 124 information is stamped into a binary if the main package, the main module 125 containing it, and the current directory are all in the same repository. 126 Use -buildvcs=false to always omit version control information, or 127 -buildvcs=true to error out if version control information is available but 128 cannot be included due to a missing tool or ambiguous directory structure. 129 -compiler name 130 name of compiler to use, as in runtime.Compiler (gccgo or gc). 131 -gccgoflags '[pattern=]arg list' 132 arguments to pass on each gccgo compiler/linker invocation. 133 -gcflags '[pattern=]arg list' 134 arguments to pass on each go tool compile invocation. 135 -installsuffix suffix 136 a suffix to use in the name of the package installation directory, 137 in order to keep output separate from default builds. 138 If using the -race flag, the install suffix is automatically set to race 139 or, if set explicitly, has _race appended to it. Likewise for the -msan 140 and -asan flags. Using a -buildmode option that requires non-default compile 141 flags has a similar effect. 142 -ldflags '[pattern=]arg list' 143 arguments to pass on each go tool link invocation. 144 -linkshared 145 build code that will be linked against shared libraries previously 146 created with -buildmode=shared. 147 -mod mode 148 module download mode to use: readonly, vendor, or mod. 149 By default, if a vendor directory is present and the go version in go.mod 150 is 1.14 or higher, the go command acts as if -mod=vendor were set. 151 Otherwise, the go command acts as if -mod=readonly were set. 152 See https://golang.org/ref/mod#build-commands for details. 153 -modcacherw 154 leave newly-created directories in the module cache read-write 155 instead of making them read-only. 156 -modfile file 157 in module aware mode, read (and possibly write) an alternate go.mod 158 file instead of the one in the module root directory. A file named 159 "go.mod" must still be present in order to determine the module root 160 directory, but it is not accessed. When -modfile is specified, an 161 alternate go.sum file is also used: its path is derived from the 162 -modfile flag by trimming the ".mod" extension and appending ".sum". 163 -overlay file 164 read a JSON config file that provides an overlay for build operations. 165 The file is a JSON struct with a single field, named 'Replace', that 166 maps each disk file path (a string) to its backing file path, so that 167 a build will run as if the disk file path exists with the contents 168 given by the backing file paths, or as if the disk file path does not 169 exist if its backing file path is empty. Support for the -overlay flag 170 has some limitations: importantly, cgo files included from outside the 171 include path must be in the same directory as the Go package they are 172 included from, and overlays will not appear when binaries and tests are 173 run through go run and go test respectively. 174 -pgo file 175 specify the file path of a profile for profile-guided optimization (PGO). 176 When the special name "auto" is specified, for each main package in the 177 build, the go command selects a file named "default.pgo" in the package's 178 directory if that file exists, and applies it to the (transitive) 179 dependencies of the main package (other packages are not affected). 180 Special name "off" turns off PGO. The default is "auto". 181 -pkgdir dir 182 install and load all packages from dir instead of the usual locations. 183 For example, when building with a non-standard configuration, 184 use -pkgdir to keep generated packages in a separate location. 185 -tags tag,list 186 a comma-separated list of additional build tags to consider satisfied 187 during the build. For more information about build tags, see 188 'go help buildconstraint'. (Earlier versions of Go used a 189 space-separated list, and that form is deprecated but still recognized.) 190 -trimpath 191 remove all file system paths from the resulting executable. 192 Instead of absolute file system paths, the recorded file names 193 will begin either a module path@version (when using modules), 194 or a plain import path (when using the standard library, or GOPATH). 195 -toolexec 'cmd args' 196 a program to use to invoke toolchain programs like vet and asm. 197 For example, instead of running asm, the go command will run 198 'cmd args /path/to/asm <arguments for asm>'. 199 The TOOLEXEC_IMPORTPATH environment variable will be set, 200 matching 'go list -f {{.ImportPath}}' for the package being built. 201 202The -asmflags, -gccgoflags, -gcflags, and -ldflags flags accept a 203space-separated list of arguments to pass to an underlying tool 204during the build. To embed spaces in an element in the list, surround 205it with either single or double quotes. The argument list may be 206preceded by a package pattern and an equal sign, which restricts 207the use of that argument list to the building of packages matching 208that pattern (see 'go help packages' for a description of package 209patterns). Without a pattern, the argument list applies only to the 210packages named on the command line. The flags may be repeated 211with different patterns in order to specify different arguments for 212different sets of packages. If a package matches patterns given in 213multiple flags, the latest match on the command line wins. 214For example, 'go build -gcflags=-S fmt' prints the disassembly 215only for package fmt, while 'go build -gcflags=all=-S fmt' 216prints the disassembly for fmt and all its dependencies. 217 218For more about specifying packages, see 'go help packages'. 219For more about where packages and binaries are installed, 220run 'go help gopath'. 221For more about calling between Go and C/C++, run 'go help c'. 222 223Note: Build adheres to certain conventions such as those described 224by 'go help gopath'. Not all projects can follow these conventions, 225however. Installations that have their own conventions or that use 226a separate software build system may choose to use lower-level 227invocations such as 'go tool compile' and 'go tool link' to avoid 228some of the overheads and design decisions of the build tool. 229 230See also: go install, go get, go clean. 231 `, 232} 233 234const concurrentGCBackendCompilationEnabledByDefault = true 235 236func init() { 237 // break init cycle 238 CmdBuild.Run = runBuild 239 CmdInstall.Run = runInstall 240 241 CmdBuild.Flag.StringVar(&cfg.BuildO, "o", "", "output file or directory") 242 243 AddBuildFlags(CmdBuild, DefaultBuildFlags) 244 AddBuildFlags(CmdInstall, DefaultBuildFlags) 245 if cfg.Experiment != nil && cfg.Experiment.CoverageRedesign { 246 AddCoverFlags(CmdBuild, nil) 247 AddCoverFlags(CmdInstall, nil) 248 } 249} 250 251// Note that flags consulted by other parts of the code 252// (for example, buildV) are in cmd/go/internal/cfg. 253 254var ( 255 forcedAsmflags []string // internally-forced flags for cmd/asm 256 forcedGcflags []string // internally-forced flags for cmd/compile 257 forcedLdflags []string // internally-forced flags for cmd/link 258 forcedGccgoflags []string // internally-forced flags for gccgo 259) 260 261var BuildToolchain toolchain = noToolchain{} 262var ldBuildmode string 263 264// buildCompiler implements flag.Var. 265// It implements Set by updating both 266// BuildToolchain and buildContext.Compiler. 267type buildCompiler struct{} 268 269func (c buildCompiler) Set(value string) error { 270 switch value { 271 case "gc": 272 BuildToolchain = gcToolchain{} 273 case "gccgo": 274 BuildToolchain = gccgoToolchain{} 275 default: 276 return fmt.Errorf("unknown compiler %q", value) 277 } 278 cfg.BuildToolchainName = value 279 cfg.BuildContext.Compiler = value 280 return nil 281} 282 283func (c buildCompiler) String() string { 284 return cfg.BuildContext.Compiler 285} 286 287func init() { 288 switch build.Default.Compiler { 289 case "gc", "gccgo": 290 buildCompiler{}.Set(build.Default.Compiler) 291 } 292} 293 294type BuildFlagMask int 295 296const ( 297 DefaultBuildFlags BuildFlagMask = 0 298 OmitModFlag BuildFlagMask = 1 << iota 299 OmitModCommonFlags 300 OmitVFlag 301) 302 303// AddBuildFlags adds the flags common to the build, clean, get, 304// install, list, run, and test commands. 305func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) { 306 base.AddBuildFlagsNX(&cmd.Flag) 307 base.AddChdirFlag(&cmd.Flag) 308 cmd.Flag.BoolVar(&cfg.BuildA, "a", false, "") 309 cmd.Flag.IntVar(&cfg.BuildP, "p", cfg.BuildP, "") 310 if mask&OmitVFlag == 0 { 311 cmd.Flag.BoolVar(&cfg.BuildV, "v", false, "") 312 } 313 314 cmd.Flag.Var(&load.BuildAsmflags, "asmflags", "") 315 cmd.Flag.Var(buildCompiler{}, "compiler", "") 316 cmd.Flag.StringVar(&cfg.BuildBuildmode, "buildmode", "default", "") 317 cmd.Flag.Var(&load.BuildGcflags, "gcflags", "") 318 cmd.Flag.Var(&load.BuildGccgoflags, "gccgoflags", "") 319 if mask&OmitModFlag == 0 { 320 base.AddModFlag(&cmd.Flag) 321 } 322 if mask&OmitModCommonFlags == 0 { 323 base.AddModCommonFlags(&cmd.Flag) 324 } else { 325 // Add the overlay flag even when we don't add the rest of the mod common flags. 326 // This only affects 'go get' in GOPATH mode, but add the flag anyway for 327 // consistency. 328 cmd.Flag.StringVar(&fsys.OverlayFile, "overlay", "", "") 329 } 330 cmd.Flag.StringVar(&cfg.BuildContext.InstallSuffix, "installsuffix", "", "") 331 cmd.Flag.Var(&load.BuildLdflags, "ldflags", "") 332 cmd.Flag.BoolVar(&cfg.BuildLinkshared, "linkshared", false, "") 333 cmd.Flag.StringVar(&cfg.BuildPGO, "pgo", "auto", "") 334 cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "") 335 cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "") 336 cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "") 337 cmd.Flag.BoolVar(&cfg.BuildASan, "asan", false, "") 338 cmd.Flag.Var((*tagsFlag)(&cfg.BuildContext.BuildTags), "tags", "") 339 cmd.Flag.Var((*base.StringsFlag)(&cfg.BuildToolexec), "toolexec", "") 340 cmd.Flag.BoolVar(&cfg.BuildTrimpath, "trimpath", false, "") 341 cmd.Flag.BoolVar(&cfg.BuildWork, "work", false, "") 342 cmd.Flag.Var((*buildvcsFlag)(&cfg.BuildBuildvcs), "buildvcs", "") 343 344 // Undocumented, unstable debugging flags. 345 cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "") 346 cmd.Flag.StringVar(&cfg.DebugTrace, "debug-trace", "", "") 347 cmd.Flag.StringVar(&cfg.DebugRuntimeTrace, "debug-runtime-trace", "", "") 348} 349 350// AddCoverFlags adds coverage-related flags to "cmd". If the 351// CoverageRedesign experiment is enabled, we add -cover{mode,pkg} to 352// the build command and only -coverprofile to the test command. If 353// the CoverageRedesign experiment is disabled, -cover* flags are 354// added only to the test command. 355func AddCoverFlags(cmd *base.Command, coverProfileFlag *string) { 356 addCover := false 357 if cfg.Experiment != nil && cfg.Experiment.CoverageRedesign { 358 // New coverage enabled: both build and test commands get 359 // coverage flags. 360 addCover = true 361 } else { 362 // New coverage disabled: only test command gets cover flags. 363 addCover = coverProfileFlag != nil 364 } 365 if addCover { 366 cmd.Flag.BoolVar(&cfg.BuildCover, "cover", false, "") 367 cmd.Flag.Var(coverFlag{(*coverModeFlag)(&cfg.BuildCoverMode)}, "covermode", "") 368 cmd.Flag.Var(coverFlag{commaListFlag{&cfg.BuildCoverPkg}}, "coverpkg", "") 369 } 370 if coverProfileFlag != nil { 371 cmd.Flag.Var(coverFlag{V: stringFlag{coverProfileFlag}}, "coverprofile", "") 372 } 373} 374 375// tagsFlag is the implementation of the -tags flag. 376type tagsFlag []string 377 378func (v *tagsFlag) Set(s string) error { 379 // For compatibility with Go 1.12 and earlier, allow "-tags='a b c'" or even just "-tags='a'". 380 if strings.Contains(s, " ") || strings.Contains(s, "'") { 381 return (*base.StringsFlag)(v).Set(s) 382 } 383 384 // Split on commas, ignore empty strings. 385 *v = []string{} 386 for _, s := range strings.Split(s, ",") { 387 if s != "" { 388 *v = append(*v, s) 389 } 390 } 391 return nil 392} 393 394func (v *tagsFlag) String() string { 395 return "<TagsFlag>" 396} 397 398// buildvcsFlag is the implementation of the -buildvcs flag. 399type buildvcsFlag string 400 401func (f *buildvcsFlag) IsBoolFlag() bool { return true } // allow -buildvcs (without arguments) 402 403func (f *buildvcsFlag) Set(s string) error { 404 // https://go.dev/issue/51748: allow "-buildvcs=auto", 405 // in addition to the usual "true" and "false". 406 if s == "" || s == "auto" { 407 *f = "auto" 408 return nil 409 } 410 411 b, err := strconv.ParseBool(s) 412 if err != nil { 413 return errors.New("value is neither 'auto' nor a valid bool") 414 } 415 *f = (buildvcsFlag)(strconv.FormatBool(b)) // convert to canonical "true" or "false" 416 return nil 417} 418 419func (f *buildvcsFlag) String() string { return string(*f) } 420 421// fileExtSplit expects a filename and returns the name 422// and ext (without the dot). If the file has no 423// extension, ext will be empty. 424func fileExtSplit(file string) (name, ext string) { 425 dotExt := filepath.Ext(file) 426 name = file[:len(file)-len(dotExt)] 427 if dotExt != "" { 428 ext = dotExt[1:] 429 } 430 return 431} 432 433func pkgsMain(pkgs []*load.Package) (res []*load.Package) { 434 for _, p := range pkgs { 435 if p.Name == "main" { 436 res = append(res, p) 437 } 438 } 439 return res 440} 441 442func pkgsNotMain(pkgs []*load.Package) (res []*load.Package) { 443 for _, p := range pkgs { 444 if p.Name != "main" { 445 res = append(res, p) 446 } 447 } 448 return res 449} 450 451func oneMainPkg(pkgs []*load.Package) []*load.Package { 452 if len(pkgs) != 1 || pkgs[0].Name != "main" { 453 base.Fatalf("-buildmode=%s requires exactly one main package", cfg.BuildBuildmode) 454 } 455 return pkgs 456} 457 458var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs } 459 460func runBuild(ctx context.Context, cmd *base.Command, args []string) { 461 modload.InitWorkfile() 462 BuildInit() 463 b := NewBuilder("") 464 defer func() { 465 if err := b.Close(); err != nil { 466 base.Fatal(err) 467 } 468 }() 469 470 pkgs := load.PackagesAndErrors(ctx, load.PackageOpts{AutoVCS: true}, args) 471 load.CheckPackageErrors(pkgs) 472 473 explicitO := len(cfg.BuildO) > 0 474 475 if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" { 476 cfg.BuildO = pkgs[0].DefaultExecName() 477 cfg.BuildO += cfg.ExeSuffix 478 } 479 480 // sanity check some often mis-used options 481 switch cfg.BuildContext.Compiler { 482 case "gccgo": 483 if load.BuildGcflags.Present() { 484 fmt.Println("go build: when using gccgo toolchain, please pass compiler flags using -gccgoflags, not -gcflags") 485 } 486 if load.BuildLdflags.Present() { 487 fmt.Println("go build: when using gccgo toolchain, please pass linker flags using -gccgoflags, not -ldflags") 488 } 489 case "gc": 490 if load.BuildGccgoflags.Present() { 491 fmt.Println("go build: when using gc toolchain, please pass compile flags using -gcflags, and linker flags using -ldflags") 492 } 493 } 494 495 depMode := ModeBuild 496 497 pkgs = omitTestOnly(pkgsFilter(pkgs)) 498 499 // Special case -o /dev/null by not writing at all. 500 if base.IsNull(cfg.BuildO) { 501 cfg.BuildO = "" 502 } 503 504 if cfg.Experiment.CoverageRedesign && cfg.BuildCover { 505 load.PrepareForCoverageBuild(pkgs) 506 } 507 508 if cfg.BuildO != "" { 509 // If the -o name exists and is a directory or 510 // ends with a slash or backslash, then 511 // write all main packages to that directory. 512 // Otherwise require only a single package be built. 513 if fi, err := os.Stat(cfg.BuildO); (err == nil && fi.IsDir()) || 514 strings.HasSuffix(cfg.BuildO, "/") || 515 strings.HasSuffix(cfg.BuildO, string(os.PathSeparator)) { 516 if !explicitO { 517 base.Fatalf("go: build output %q already exists and is a directory", cfg.BuildO) 518 } 519 a := &Action{Mode: "go build"} 520 for _, p := range pkgs { 521 if p.Name != "main" { 522 continue 523 } 524 525 p.Target = filepath.Join(cfg.BuildO, p.DefaultExecName()) 526 p.Target += cfg.ExeSuffix 527 p.Stale = true 528 p.StaleReason = "build -o flag in use" 529 a.Deps = append(a.Deps, b.AutoAction(ModeInstall, depMode, p)) 530 } 531 if len(a.Deps) == 0 { 532 base.Fatalf("go: no main packages to build") 533 } 534 b.Do(ctx, a) 535 return 536 } 537 if len(pkgs) > 1 { 538 base.Fatalf("go: cannot write multiple packages to non-directory %s", cfg.BuildO) 539 } else if len(pkgs) == 0 { 540 base.Fatalf("no packages to build") 541 } 542 p := pkgs[0] 543 p.Target = cfg.BuildO 544 p.Stale = true // must build - not up to date 545 p.StaleReason = "build -o flag in use" 546 a := b.AutoAction(ModeInstall, depMode, p) 547 b.Do(ctx, a) 548 return 549 } 550 551 a := &Action{Mode: "go build"} 552 for _, p := range pkgs { 553 a.Deps = append(a.Deps, b.AutoAction(ModeBuild, depMode, p)) 554 } 555 if cfg.BuildBuildmode == "shared" { 556 a = b.buildmodeShared(ModeBuild, depMode, args, pkgs, a) 557 } 558 b.Do(ctx, a) 559} 560 561var CmdInstall = &base.Command{ 562 UsageLine: "go install [build flags] [packages]", 563 Short: "compile and install packages and dependencies", 564 Long: ` 565Install compiles and installs the packages named by the import paths. 566 567Executables are installed in the directory named by the GOBIN environment 568variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH 569environment variable is not set. Executables in $GOROOT 570are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN. 571 572If the arguments have version suffixes (like @latest or @v1.0.0), "go install" 573builds packages in module-aware mode, ignoring the go.mod file in the current 574directory or any parent directory, if there is one. This is useful for 575installing executables without affecting the dependencies of the main module. 576To eliminate ambiguity about which module versions are used in the build, the 577arguments must satisfy the following constraints: 578 579- Arguments must be package paths or package patterns (with "..." wildcards). 580They must not be standard packages (like fmt), meta-patterns (std, cmd, 581all), or relative or absolute file paths. 582 583- All arguments must have the same version suffix. Different queries are not 584allowed, even if they refer to the same version. 585 586- All arguments must refer to packages in the same module at the same version. 587 588- Package path arguments must refer to main packages. Pattern arguments 589will only match main packages. 590 591- No module is considered the "main" module. If the module containing 592packages named on the command line has a go.mod file, it must not contain 593directives (replace and exclude) that would cause it to be interpreted 594differently than if it were the main module. The module must not require 595a higher version of itself. 596 597- Vendor directories are not used in any module. (Vendor directories are not 598included in the module zip files downloaded by 'go install'.) 599 600If the arguments don't have version suffixes, "go install" may run in 601module-aware mode or GOPATH mode, depending on the GO111MODULE environment 602variable and the presence of a go.mod file. See 'go help modules' for details. 603If module-aware mode is enabled, "go install" runs in the context of the main 604module. 605 606When module-aware mode is disabled, non-main packages are installed in the 607directory $GOPATH/pkg/$GOOS_$GOARCH. When module-aware mode is enabled, 608non-main packages are built and cached but not installed. 609 610Before Go 1.20, the standard library was installed to 611$GOROOT/pkg/$GOOS_$GOARCH. 612Starting in Go 1.20, the standard library is built and cached but not installed. 613Setting GODEBUG=installgoroot=all restores the use of 614$GOROOT/pkg/$GOOS_$GOARCH. 615 616For more about build flags, see 'go help build'. 617 618For more about specifying packages, see 'go help packages'. 619 620See also: go build, go get, go clean. 621 `, 622} 623 624// libname returns the filename to use for the shared library when using 625// -buildmode=shared. The rules we use are: 626// Use arguments for special 'meta' packages: 627// 628// std --> libstd.so 629// std cmd --> libstd,cmd.so 630// 631// A single non-meta argument with trailing "/..." is special cased: 632// 633// foo/... --> libfoo.so 634// (A relative path like "./..." expands the "." first) 635// 636// Use import paths for other cases, changing '/' to '-': 637// 638// somelib --> libsubdir-somelib.so 639// ./ or ../ --> libsubdir-somelib.so 640// gopkg.in/tomb.v2 -> libgopkg.in-tomb.v2.so 641// a/... b/... ---> liba/c,b/d.so - all matching import paths 642// 643// Name parts are joined with ','. 644func libname(args []string, pkgs []*load.Package) (string, error) { 645 var libname string 646 appendName := func(arg string) { 647 if libname == "" { 648 libname = arg 649 } else { 650 libname += "," + arg 651 } 652 } 653 var haveNonMeta bool 654 for _, arg := range args { 655 if search.IsMetaPackage(arg) { 656 appendName(arg) 657 } else { 658 haveNonMeta = true 659 } 660 } 661 if len(libname) == 0 { // non-meta packages only. use import paths 662 if len(args) == 1 && strings.HasSuffix(args[0], "/...") { 663 // Special case of "foo/..." as mentioned above. 664 arg := strings.TrimSuffix(args[0], "/...") 665 if build.IsLocalImport(arg) { 666 cwd, _ := os.Getwd() 667 bp, _ := cfg.BuildContext.ImportDir(filepath.Join(cwd, arg), build.FindOnly) 668 if bp.ImportPath != "" && bp.ImportPath != "." { 669 arg = bp.ImportPath 670 } 671 } 672 appendName(strings.ReplaceAll(arg, "/", "-")) 673 } else { 674 for _, pkg := range pkgs { 675 appendName(strings.ReplaceAll(pkg.ImportPath, "/", "-")) 676 } 677 } 678 } else if haveNonMeta { // have both meta package and a non-meta one 679 return "", errors.New("mixing of meta and non-meta packages is not allowed") 680 } 681 // TODO(mwhudson): Needs to change for platforms that use different naming 682 // conventions... 683 return "lib" + libname + ".so", nil 684} 685 686func runInstall(ctx context.Context, cmd *base.Command, args []string) { 687 for _, arg := range args { 688 if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) { 689 installOutsideModule(ctx, args) 690 return 691 } 692 } 693 694 modload.InitWorkfile() 695 BuildInit() 696 pkgs := load.PackagesAndErrors(ctx, load.PackageOpts{AutoVCS: true}, args) 697 if cfg.ModulesEnabled && !modload.HasModRoot() { 698 haveErrors := false 699 allMissingErrors := true 700 for _, pkg := range pkgs { 701 if pkg.Error == nil { 702 continue 703 } 704 haveErrors = true 705 if missingErr := (*modload.ImportMissingError)(nil); !errors.As(pkg.Error, &missingErr) { 706 allMissingErrors = false 707 break 708 } 709 } 710 if haveErrors && allMissingErrors { 711 latestArgs := make([]string, len(args)) 712 for i := range args { 713 latestArgs[i] = args[i] + "@latest" 714 } 715 hint := strings.Join(latestArgs, " ") 716 base.Fatalf("go: 'go install' requires a version when current directory is not in a module\n\tTry 'go install %s' to install the latest version", hint) 717 } 718 } 719 load.CheckPackageErrors(pkgs) 720 721 if cfg.Experiment.CoverageRedesign && cfg.BuildCover { 722 load.PrepareForCoverageBuild(pkgs) 723 } 724 725 InstallPackages(ctx, args, pkgs) 726} 727 728// omitTestOnly returns pkgs with test-only packages removed. 729func omitTestOnly(pkgs []*load.Package) []*load.Package { 730 var list []*load.Package 731 for _, p := range pkgs { 732 if len(p.GoFiles)+len(p.CgoFiles) == 0 && !p.Internal.CmdlinePkgLiteral { 733 // Package has no source files, 734 // perhaps due to build tags or perhaps due to only having *_test.go files. 735 // Also, it is only being processed as the result of a wildcard match 736 // like ./..., not because it was listed as a literal path on the command line. 737 // Ignore it. 738 continue 739 } 740 list = append(list, p) 741 } 742 return list 743} 744 745func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Package) { 746 ctx, span := trace.StartSpan(ctx, "InstallPackages "+strings.Join(patterns, " ")) 747 defer span.Done() 748 749 if cfg.GOBIN != "" && !filepath.IsAbs(cfg.GOBIN) { 750 base.Fatalf("cannot install, GOBIN must be an absolute path") 751 } 752 753 pkgs = omitTestOnly(pkgsFilter(pkgs)) 754 for _, p := range pkgs { 755 if p.Target == "" { 756 switch { 757 case p.Name != "main" && p.Internal.Local && p.ConflictDir == "": 758 // Non-executables outside GOPATH need not have a target: 759 // we can use the cache to hold the built package archive for use in future builds. 760 // The ones inside GOPATH should have a target (in GOPATH/pkg) 761 // or else something is wrong and worth reporting (like a ConflictDir). 762 case p.Name != "main" && p.Module != nil: 763 // Non-executables have no target (except the cache) when building with modules. 764 case p.Name != "main" && p.Standard && p.Internal.Build.PkgObj == "": 765 // Most packages in std do not need an installed .a, because they can be 766 // rebuilt and used directly from the build cache. 767 // A few targets (notably those using cgo) still do need to be installed 768 // in case the user's environment lacks a C compiler. 769 case p.Internal.GobinSubdir: 770 base.Errorf("go: cannot install cross-compiled binaries when GOBIN is set") 771 case p.Internal.CmdlineFiles: 772 base.Errorf("go: no install location for .go files listed on command line (GOBIN not set)") 773 case p.ConflictDir != "": 774 base.Errorf("go: no install location for %s: hidden by %s", p.Dir, p.ConflictDir) 775 default: 776 base.Errorf("go: no install location for directory %s outside GOPATH\n"+ 777 "\tFor more details see: 'go help gopath'", p.Dir) 778 } 779 } 780 } 781 base.ExitIfErrors() 782 783 b := NewBuilder("") 784 defer func() { 785 if err := b.Close(); err != nil { 786 base.Fatal(err) 787 } 788 }() 789 790 depMode := ModeBuild 791 a := &Action{Mode: "go install"} 792 var tools []*Action 793 for _, p := range pkgs { 794 // If p is a tool, delay the installation until the end of the build. 795 // This avoids installing assemblers/compilers that are being executed 796 // by other steps in the build. 797 a1 := b.AutoAction(ModeInstall, depMode, p) 798 if load.InstallTargetDir(p) == load.ToTool { 799 a.Deps = append(a.Deps, a1.Deps...) 800 a1.Deps = append(a1.Deps, a) 801 tools = append(tools, a1) 802 continue 803 } 804 a.Deps = append(a.Deps, a1) 805 } 806 if len(tools) > 0 { 807 a = &Action{ 808 Mode: "go install (tools)", 809 Deps: tools, 810 } 811 } 812 813 if cfg.BuildBuildmode == "shared" { 814 // Note: If buildmode=shared then only non-main packages 815 // are present in the pkgs list, so all the special case code about 816 // tools above did not apply, and a is just a simple Action 817 // with a list of Deps, one per package named in pkgs, 818 // the same as in runBuild. 819 a = b.buildmodeShared(ModeInstall, ModeInstall, patterns, pkgs, a) 820 } 821 822 b.Do(ctx, a) 823 base.ExitIfErrors() 824 825 // Success. If this command is 'go install' with no arguments 826 // and the current directory (the implicit argument) is a command, 827 // remove any leftover command binary from a previous 'go build'. 828 // The binary is installed; it's not needed here anymore. 829 // And worse it might be a stale copy, which you don't want to find 830 // instead of the installed one if $PATH contains dot. 831 // One way to view this behavior is that it is as if 'go install' first 832 // runs 'go build' and the moves the generated file to the install dir. 833 // See issue 9645. 834 if len(patterns) == 0 && len(pkgs) == 1 && pkgs[0].Name == "main" { 835 // Compute file 'go build' would have created. 836 // If it exists and is an executable file, remove it. 837 targ := pkgs[0].DefaultExecName() 838 targ += cfg.ExeSuffix 839 if filepath.Join(pkgs[0].Dir, targ) != pkgs[0].Target { // maybe $GOBIN is the current directory 840 fi, err := os.Stat(targ) 841 if err == nil { 842 m := fi.Mode() 843 if m.IsRegular() { 844 if m&0111 != 0 || cfg.Goos == "windows" { // windows never sets executable bit 845 os.Remove(targ) 846 } 847 } 848 } 849 } 850 } 851} 852 853// installOutsideModule implements 'go install pkg@version'. It builds and 854// installs one or more main packages in module mode while ignoring any go.mod 855// in the current directory or parent directories. 856// 857// See golang.org/issue/40276 for details and rationale. 858func installOutsideModule(ctx context.Context, args []string) { 859 modload.ForceUseModules = true 860 modload.RootMode = modload.NoRoot 861 modload.AllowMissingModuleImports() 862 modload.Init() 863 BuildInit() 864 865 // Load packages. Ignore non-main packages. 866 // Print a warning if an argument contains "..." and matches no main packages. 867 // PackagesAndErrors already prints warnings for patterns that don't match any 868 // packages, so be careful not to double print. 869 // TODO(golang.org/issue/40276): don't report errors loading non-main packages 870 // matched by a pattern. 871 pkgOpts := load.PackageOpts{MainOnly: true} 872 pkgs, err := load.PackagesAndErrorsOutsideModule(ctx, pkgOpts, args) 873 if err != nil { 874 base.Fatal(err) 875 } 876 load.CheckPackageErrors(pkgs) 877 patterns := make([]string, len(args)) 878 for i, arg := range args { 879 patterns[i] = arg[:strings.Index(arg, "@")] 880 } 881 882 // Build and install the packages. 883 InstallPackages(ctx, patterns, pkgs) 884} 885 886// ExecCmd is the command to use to run user binaries. 887// Normally it is empty, meaning run the binaries directly. 888// If cross-compiling and running on a remote system or 889// simulator, it is typically go_GOOS_GOARCH_exec, with 890// the target GOOS and GOARCH substituted. 891// The -exec flag overrides these defaults. 892var ExecCmd []string 893 894// FindExecCmd derives the value of ExecCmd to use. 895// It returns that value and leaves ExecCmd set for direct use. 896func FindExecCmd() []string { 897 if ExecCmd != nil { 898 return ExecCmd 899 } 900 ExecCmd = []string{} // avoid work the second time 901 if cfg.Goos == runtime.GOOS && cfg.Goarch == runtime.GOARCH { 902 return ExecCmd 903 } 904 path, err := cfg.LookPath(fmt.Sprintf("go_%s_%s_exec", cfg.Goos, cfg.Goarch)) 905 if err == nil { 906 ExecCmd = []string{path} 907 } 908 return ExecCmd 909} 910 911// A coverFlag is a flag.Value that also implies -cover. 912type coverFlag struct{ V flag.Value } 913 914func (f coverFlag) String() string { return f.V.String() } 915 916func (f coverFlag) Set(value string) error { 917 if err := f.V.Set(value); err != nil { 918 return err 919 } 920 cfg.BuildCover = true 921 return nil 922} 923 924type coverModeFlag string 925 926func (f *coverModeFlag) String() string { return string(*f) } 927func (f *coverModeFlag) Set(value string) error { 928 switch value { 929 case "", "set", "count", "atomic": 930 *f = coverModeFlag(value) 931 cfg.BuildCoverMode = value 932 return nil 933 default: 934 return errors.New(`valid modes are "set", "count", or "atomic"`) 935 } 936} 937 938// A commaListFlag is a flag.Value representing a comma-separated list. 939type commaListFlag struct{ Vals *[]string } 940 941func (f commaListFlag) String() string { return strings.Join(*f.Vals, ",") } 942 943func (f commaListFlag) Set(value string) error { 944 if value == "" { 945 *f.Vals = nil 946 } else { 947 *f.Vals = strings.Split(value, ",") 948 } 949 return nil 950} 951 952// A stringFlag is a flag.Value representing a single string. 953type stringFlag struct{ val *string } 954 955func (f stringFlag) String() string { return *f.val } 956func (f stringFlag) Set(value string) error { 957 *f.val = value 958 return nil 959} 960