@@ -103,7 +103,8 @@ var (
103
103
104
104
// GoPathError is set when GOPATH is not set. it contains an
105
105
// explanation why GOPATH is unset.
106
- GoPathError string
106
+ GoPathError string
107
+ GOPATHChanged bool
107
108
)
108
109
109
110
func defaultContext () build.Context {
@@ -113,7 +114,7 @@ func defaultContext() build.Context {
113
114
114
115
// Override defaults computed in go/build with defaults
115
116
// from go environment configuration file, if known.
116
- ctxt .GOPATH = envOr ("GOPATH" , gopath (ctxt ))
117
+ ctxt .GOPATH , GOPATHChanged = EnvOrAndChanged ("GOPATH" , gopath (ctxt ))
117
118
ctxt .GOOS = Goos
118
119
ctxt .GOARCH = Goarch
119
120
@@ -267,8 +268,9 @@ func init() {
267
268
268
269
// An EnvVar is an environment variable Name=Value.
269
270
type EnvVar struct {
270
- Name string
271
- Value string
271
+ Name string
272
+ Value string
273
+ Changed bool
272
274
}
273
275
274
276
// OrigEnv is the original environment of the program at startup.
@@ -280,31 +282,32 @@ var OrigEnv []string
280
282
var CmdEnv []EnvVar
281
283
282
284
var envCache struct {
283
- once sync.Once
284
- m map [string ]string
285
+ once sync.Once
286
+ m map [string ]string
287
+ goroot map [string ]string
285
288
}
286
289
287
290
// EnvFile returns the name of the Go environment configuration file.
288
- func EnvFile () (string , error ) {
291
+ func EnvFile () (string , bool , error ) {
289
292
if file := os .Getenv ("GOENV" ); file != "" {
290
293
if file == "off" {
291
- return "" , fmt .Errorf ("GOENV=off" )
294
+ return "" , true , fmt .Errorf ("GOENV=off" )
292
295
}
293
- return file , nil
296
+ return file , true , nil
294
297
}
295
298
dir , err := os .UserConfigDir ()
296
299
if err != nil {
297
- return "" , err
300
+ return "" , false , err
298
301
}
299
302
if dir == "" {
300
- return "" , fmt .Errorf ("missing user-config dir" )
303
+ return "" , false , fmt .Errorf ("missing user-config dir" )
301
304
}
302
- return filepath .Join (dir , "go/env" ), nil
305
+ return filepath .Join (dir , "go/env" ), false , nil
303
306
}
304
307
305
308
func initEnvCache () {
306
- envCache .m = make (map [string ]string )
307
- if file , _ := EnvFile (); file != "" {
309
+ envCache .m , envCache . goroot = make ( map [ string ] string ), make (map [string ]string )
310
+ if file , _ , _ := EnvFile (); file != "" {
308
311
readEnvFile (file , "user" )
309
312
}
310
313
goroot := findGOROOT (envCache .m ["GOROOT" ])
@@ -355,6 +358,7 @@ func readEnvFile(file string, source string) {
355
358
if _ , ok := envCache .m [string (key )]; ok {
356
359
continue
357
360
}
361
+ envCache .goroot [string (key )] = string (val )
358
362
}
359
363
envCache .m [string (key )] = string (val )
360
364
}
@@ -404,54 +408,62 @@ var (
404
408
405
409
GOROOT_FINAL string
406
410
407
- GOBIN = Getenv ("GOBIN" )
408
- GOMODCACHE = envOr ("GOMODCACHE" , gopathDir ("pkg/mod" ))
411
+ GOBIN = Getenv ("GOBIN" )
412
+ GOMODCACHE , GOMODCACHEChanged = EnvOrAndChanged ("GOMODCACHE" , gopathDir ("pkg/mod" ))
409
413
410
414
// Used in envcmd.MkEnv and build ID computations.
411
- GOARM = envOr ("GOARM" , fmt .Sprint (buildcfg .GOARM ))
412
- GO386 = envOr ("GO386" , buildcfg .GO386 )
413
- GOAMD64 = envOr ("GOAMD64" , fmt .Sprintf ("%s%d" , "v" , buildcfg .GOAMD64 ))
414
- GOMIPS = envOr ("GOMIPS" , buildcfg .GOMIPS )
415
- GOMIPS64 = envOr ("GOMIPS64" , buildcfg .GOMIPS64 )
416
- GOPPC64 = envOr ("GOPPC64" , fmt .Sprintf ("%s%d" , "power" , buildcfg .GOPPC64 ))
417
- GORISCV64 = envOr ("GORISCV64" , fmt .Sprintf ("rva%du64" , buildcfg .GORISCV64 ))
418
- GOWASM = envOr ("GOWASM" , fmt .Sprint (buildcfg .GOWASM ))
419
-
420
- GOPROXY = envOr ("GOPROXY" , "" )
421
- GOSUMDB = envOr ("GOSUMDB" , "" )
422
- GOPRIVATE = Getenv ("GOPRIVATE" )
423
- GONOPROXY = envOr ("GONOPROXY" , GOPRIVATE )
424
- GONOSUMDB = envOr ("GONOSUMDB" , GOPRIVATE )
425
- GOINSECURE = Getenv ("GOINSECURE" )
426
- GOVCS = Getenv ("GOVCS" )
415
+ GOARM , goARMChanged = EnvOrAndChanged ("GOARM" , fmt .Sprint (buildcfg .GOARM ))
416
+ GO386 , go386Changed = EnvOrAndChanged ("GO386" , buildcfg .GO386 )
417
+ GOAMD64 , goAMD64Changed = EnvOrAndChanged ("GOAMD64" , fmt .Sprintf ("%s%d" , "v" , buildcfg .GOAMD64 ))
418
+ GOMIPS , goMIPSChanged = EnvOrAndChanged ("GOMIPS" , buildcfg .GOMIPS )
419
+ GOMIPS64 , goMIPS64Changed = EnvOrAndChanged ("GOMIPS64" , buildcfg .GOMIPS64 )
420
+ GOPPC64 , goPPC64Changed = EnvOrAndChanged ("GOPPC64" , fmt .Sprintf ("%s%d" , "power" , buildcfg .GOPPC64 ))
421
+ GORISCV64 , gORISCV64Changed = EnvOrAndChanged ("GORISCV64" , fmt .Sprintf ("rva%du64" , buildcfg .GORISCV64 ))
422
+ GOWASM , goWASMChanged = EnvOrAndChanged ("GOWASM" , fmt .Sprint (buildcfg .GOWASM ))
423
+
424
+ GOPROXY , GOPROXYChanged = EnvOrAndChanged ("GOPROXY" , "" )
425
+ GOSUMDB , GOSUMDBChanged = EnvOrAndChanged ("GOSUMDB" , "" )
426
+ GOPRIVATE = Getenv ("GOPRIVATE" )
427
+ GONOPROXY , GONOPROXYChanged = EnvOrAndChanged ("GONOPROXY" , GOPRIVATE )
428
+ GONOSUMDB , GONOSUMDBChanged = EnvOrAndChanged ("GONOSUMDB" , GOPRIVATE )
429
+ GOINSECURE = Getenv ("GOINSECURE" )
430
+ GOVCS = Getenv ("GOVCS" )
427
431
)
428
432
433
+ func EnvOrAndChanged (name , def string ) (string , bool ) {
434
+ val := Getenv (name )
435
+ if val != "" {
436
+ return val , envCache .goroot [name ] != val
437
+ }
438
+ return def , false
439
+ }
440
+
429
441
var SumdbDir = gopathDir ("pkg/sumdb" )
430
442
431
443
// GetArchEnv returns the name and setting of the
432
444
// GOARCH-specific architecture environment variable.
433
445
// If the current architecture has no GOARCH-specific variable,
434
446
// GetArchEnv returns empty key and value.
435
- func GetArchEnv () (key , val string ) {
447
+ func GetArchEnv () (key , val string , changed bool ) {
436
448
switch Goarch {
437
449
case "arm" :
438
- return "GOARM" , GOARM
450
+ return "GOARM" , GOARM , goARMChanged
439
451
case "386" :
440
- return "GO386" , GO386
452
+ return "GO386" , GO386 , go386Changed
441
453
case "amd64" :
442
- return "GOAMD64" , GOAMD64
454
+ return "GOAMD64" , GOAMD64 , goAMD64Changed
443
455
case "mips" , "mipsle" :
444
- return "GOMIPS" , GOMIPS
456
+ return "GOMIPS" , GOMIPS , goMIPSChanged
445
457
case "mips64" , "mips64le" :
446
- return "GOMIPS64" , GOMIPS64
458
+ return "GOMIPS64" , GOMIPS64 , goMIPS64Changed
447
459
case "ppc64" , "ppc64le" :
448
- return "GOPPC64" , GOPPC64
460
+ return "GOPPC64" , GOPPC64 , goPPC64Changed
449
461
case "riscv64" :
450
- return "GORISCV64" , GORISCV64
462
+ return "GORISCV64" , GORISCV64 , gORISCV64Changed
451
463
case "wasm" :
452
- return "GOWASM" , GOWASM
464
+ return "GOWASM" , GOWASM , goWASMChanged
453
465
}
454
- return "" , ""
466
+ return "" , "" , false
455
467
}
456
468
457
469
// envOr returns Getenv(key) if set, or else def.
0 commit comments