cmd/go: use local state object in work.runBuild and work.runInstall

This commit modifies `runBuild` and `runInstall` to construct a new
modload.State object using the new constructor instead of the current
global `modload.LoaderState` variable.

This commit is part of the overall effort to eliminate global
modloader state.

[git-generate]
cd src/cmd/go/internal/work
rf '
  add build.go:/func runBuild\(/-0 var moduleLoaderState *modload.State
  ex {
    import "cmd/go/internal/modload";
    modload.LoaderState -> moduleLoaderState
  }
  add runBuild://+0 moduleLoaderState := modload.NewState()
  add runInstall://+0 moduleLoaderState := modload.NewState()
  rm build.go:/var moduleLoaderState \*modload.State/
'

Change-Id: I1137e0b898a5bda8697dce8713f96f238ae8b76c
Reviewed-on: https://go-review.googlesource.com/c/go/+/711135
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Michael Matloob <matloob@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Ian Alexander 2025-10-09 22:08:58 -04:00
parent 643f80a11f
commit 12ec09f434

View file

@ -459,16 +459,17 @@ func oneMainPkg(pkgs []*load.Package) []*load.Package {
var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs } var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs }
func runBuild(ctx context.Context, cmd *base.Command, args []string) { func runBuild(ctx context.Context, cmd *base.Command, args []string) {
modload.InitWorkfile(modload.LoaderState) moduleLoaderState := modload.NewState()
BuildInit(modload.LoaderState) modload.InitWorkfile(moduleLoaderState)
b := NewBuilder("", modload.LoaderState.VendorDirOrEmpty) BuildInit(moduleLoaderState)
b := NewBuilder("", moduleLoaderState.VendorDirOrEmpty)
defer func() { defer func() {
if err := b.Close(); err != nil { if err := b.Close(); err != nil {
base.Fatal(err) base.Fatal(err)
} }
}() }()
pkgs := load.PackagesAndErrors(modload.LoaderState, ctx, load.PackageOpts{AutoVCS: true}, args) pkgs := load.PackagesAndErrors(moduleLoaderState, ctx, load.PackageOpts{AutoVCS: true}, args)
load.CheckPackageErrors(pkgs) load.CheckPackageErrors(pkgs)
explicitO := len(cfg.BuildO) > 0 explicitO := len(cfg.BuildO) > 0
@ -503,7 +504,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) {
} }
if cfg.BuildCover { if cfg.BuildCover {
load.PrepareForCoverageBuild(modload.LoaderState, pkgs) load.PrepareForCoverageBuild(moduleLoaderState, pkgs)
} }
if cfg.BuildO != "" { if cfg.BuildO != "" {
@ -527,7 +528,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) {
p.Target += cfg.ExeSuffix p.Target += cfg.ExeSuffix
p.Stale = true p.Stale = true
p.StaleReason = "build -o flag in use" p.StaleReason = "build -o flag in use"
a.Deps = append(a.Deps, b.AutoAction(modload.LoaderState, ModeInstall, depMode, p)) a.Deps = append(a.Deps, b.AutoAction(moduleLoaderState, ModeInstall, depMode, p))
} }
if len(a.Deps) == 0 { if len(a.Deps) == 0 {
base.Fatalf("go: no main packages to build") base.Fatalf("go: no main packages to build")
@ -544,17 +545,17 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) {
p.Target = cfg.BuildO p.Target = cfg.BuildO
p.Stale = true // must build - not up to date p.Stale = true // must build - not up to date
p.StaleReason = "build -o flag in use" p.StaleReason = "build -o flag in use"
a := b.AutoAction(modload.LoaderState, ModeInstall, depMode, p) a := b.AutoAction(moduleLoaderState, ModeInstall, depMode, p)
b.Do(ctx, a) b.Do(ctx, a)
return return
} }
a := &Action{Mode: "go build"} a := &Action{Mode: "go build"}
for _, p := range pkgs { for _, p := range pkgs {
a.Deps = append(a.Deps, b.AutoAction(modload.LoaderState, ModeBuild, depMode, p)) a.Deps = append(a.Deps, b.AutoAction(moduleLoaderState, ModeBuild, depMode, p))
} }
if cfg.BuildBuildmode == "shared" { if cfg.BuildBuildmode == "shared" {
a = b.buildmodeShared(modload.LoaderState, ModeBuild, depMode, args, pkgs, a) a = b.buildmodeShared(moduleLoaderState, ModeBuild, depMode, args, pkgs, a)
} }
b.Do(ctx, a) b.Do(ctx, a)
} }
@ -687,17 +688,18 @@ func libname(args []string, pkgs []*load.Package) (string, error) {
} }
func runInstall(ctx context.Context, cmd *base.Command, args []string) { func runInstall(ctx context.Context, cmd *base.Command, args []string) {
moduleLoaderState := modload.NewState()
for _, arg := range args { for _, arg := range args {
if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) { if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) {
installOutsideModule(modload.LoaderState, ctx, args) installOutsideModule(moduleLoaderState, ctx, args)
return return
} }
} }
modload.InitWorkfile(modload.LoaderState) modload.InitWorkfile(moduleLoaderState)
BuildInit(modload.LoaderState) BuildInit(moduleLoaderState)
pkgs := load.PackagesAndErrors(modload.LoaderState, ctx, load.PackageOpts{AutoVCS: true}, args) pkgs := load.PackagesAndErrors(moduleLoaderState, ctx, load.PackageOpts{AutoVCS: true}, args)
if cfg.ModulesEnabled && !modload.HasModRoot(modload.LoaderState) { if cfg.ModulesEnabled && !modload.HasModRoot(moduleLoaderState) {
haveErrors := false haveErrors := false
allMissingErrors := true allMissingErrors := true
for _, pkg := range pkgs { for _, pkg := range pkgs {
@ -722,10 +724,10 @@ func runInstall(ctx context.Context, cmd *base.Command, args []string) {
load.CheckPackageErrors(pkgs) load.CheckPackageErrors(pkgs)
if cfg.BuildCover { if cfg.BuildCover {
load.PrepareForCoverageBuild(modload.LoaderState, pkgs) load.PrepareForCoverageBuild(moduleLoaderState, pkgs)
} }
InstallPackages(modload.LoaderState, ctx, args, pkgs) InstallPackages(moduleLoaderState, ctx, args, pkgs)
} }
// omitTestOnly returns pkgs with test-only packages removed. // omitTestOnly returns pkgs with test-only packages removed.