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