1*4882a593SmuzhiyunFrom 9ba507e076c744f4d394418e4a849e68cd426a4a Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Alex Kube <alexander.j.kube@gmail.com> 3*4882a593SmuzhiyunDate: Wed, 23 Oct 2019 21:18:56 +0430 4*4882a593SmuzhiyunSubject: [PATCH 7/9] cmd/go: make GOROOT precious by default 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUpstream-Status: Inappropriate [OE specific] 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunThe go build tool normally rebuilds whatever it detects is 9*4882a593Smuzhiyunstale. This can be a problem when GOROOT is intended to 10*4882a593Smuzhiyunbe read-only and the go runtime has been built as a shared 11*4882a593Smuzhiyunlibrary, since we don't want every application to be rebuilding 12*4882a593Smuzhiyunthe shared runtime - particularly in cross-build/packaging 13*4882a593Smuzhiyunsetups, since that would lead to 'abi mismatch' runtime errors. 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunThis patch prevents the install and linkshared actions from 16*4882a593Smuzhiyuninstalling to GOROOT unless overridden with the GOROOT_OVERRIDE 17*4882a593Smuzhiyunenvironment variable. 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunAdapted to Go 1.13 from patches originally submitted to 20*4882a593Smuzhiyunthe meta/recipes-devtools/go tree by 21*4882a593SmuzhiyunMatt Madison <matt@madison.systems>. 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunSigned-off-by: Alexander J Kube <alexander.j.kube@gmail.com> 24*4882a593Smuzhiyun--- 25*4882a593Smuzhiyun src/cmd/go/internal/work/action.go | 3 +++ 26*4882a593Smuzhiyun src/cmd/go/internal/work/build.go | 6 ++++++ 27*4882a593Smuzhiyun src/cmd/go/internal/work/exec.go | 25 +++++++++++++++++++++++++ 28*4882a593Smuzhiyun 3 files changed, 34 insertions(+) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun--- a/src/cmd/go/internal/work/action.go 31*4882a593Smuzhiyun+++ b/src/cmd/go/internal/work/action.go 32*4882a593Smuzhiyun@@ -670,6 +670,9 @@ func (b *Builder) addTransitiveLinkDeps( 33*4882a593Smuzhiyun if p1 == nil || p1.Shlib == "" || haveShlib[filepath.Base(p1.Shlib)] { 34*4882a593Smuzhiyun continue 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun+ if goRootPrecious && (p1.Standard || p1.Goroot) { 37*4882a593Smuzhiyun+ continue 38*4882a593Smuzhiyun+ } 39*4882a593Smuzhiyun haveShlib[filepath.Base(p1.Shlib)] = true 40*4882a593Smuzhiyun // TODO(rsc): The use of ModeInstall here is suspect, but if we only do ModeBuild, 41*4882a593Smuzhiyun // we'll end up building an overall library or executable that depends at runtime 42*4882a593Smuzhiyun--- a/src/cmd/go/internal/work/build.go 43*4882a593Smuzhiyun+++ b/src/cmd/go/internal/work/build.go 44*4882a593Smuzhiyun@@ -167,6 +167,8 @@ See also: go install, go get, go clean. 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun const concurrentGCBackendCompilationEnabledByDefault = true 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun+var goRootPrecious bool = true 49*4882a593Smuzhiyun+ 50*4882a593Smuzhiyun func init() { 51*4882a593Smuzhiyun // break init cycle 52*4882a593Smuzhiyun CmdBuild.Run = runBuild 53*4882a593Smuzhiyun@@ -179,6 +181,10 @@ func init() { 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun AddBuildFlags(CmdBuild, DefaultBuildFlags) 56*4882a593Smuzhiyun AddBuildFlags(CmdInstall, DefaultBuildFlags) 57*4882a593Smuzhiyun+ 58*4882a593Smuzhiyun+ if x := os.Getenv("GOROOT_OVERRIDE"); x != "" { 59*4882a593Smuzhiyun+ goRootPrecious = false 60*4882a593Smuzhiyun+ } 61*4882a593Smuzhiyun } 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun // Note that flags consulted by other parts of the code 64*4882a593Smuzhiyun--- a/src/cmd/go/internal/work/exec.go 65*4882a593Smuzhiyun+++ b/src/cmd/go/internal/work/exec.go 66*4882a593Smuzhiyun@@ -468,6 +468,23 @@ func (b *Builder) build(a *Action) (err 67*4882a593Smuzhiyun return errors.New("binary-only packages are no longer supported") 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun+ if goRootPrecious && (a.Package.Standard || a.Package.Goroot) { 71*4882a593Smuzhiyun+ _, err := os.Stat(a.Package.Target) 72*4882a593Smuzhiyun+ if err == nil { 73*4882a593Smuzhiyun+ a.built = a.Package.Target 74*4882a593Smuzhiyun+ a.Target = a.Package.Target 75*4882a593Smuzhiyun+ a.buildID = b.fileHash(a.Package.Target) 76*4882a593Smuzhiyun+ a.Package.Stale = false 77*4882a593Smuzhiyun+ a.Package.StaleReason = "GOROOT-resident package" 78*4882a593Smuzhiyun+ return nil 79*4882a593Smuzhiyun+ } 80*4882a593Smuzhiyun+ a.Package.Stale = true 81*4882a593Smuzhiyun+ a.Package.StaleReason = "missing or invalid GOROOT-resident package" 82*4882a593Smuzhiyun+ if b.IsCmdList { 83*4882a593Smuzhiyun+ return nil 84*4882a593Smuzhiyun+ } 85*4882a593Smuzhiyun+ } 86*4882a593Smuzhiyun+ 87*4882a593Smuzhiyun if err := b.Mkdir(a.Objdir); err != nil { 88*4882a593Smuzhiyun return err 89*4882a593Smuzhiyun } 90*4882a593Smuzhiyun@@ -1520,6 +1537,14 @@ func BuildInstallFunc(b *Builder, a *Act 91*4882a593Smuzhiyun return err 92*4882a593Smuzhiyun } 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun+ if goRootPrecious && a.Package != nil { 95*4882a593Smuzhiyun+ p := a.Package 96*4882a593Smuzhiyun+ if p.Standard || p.Goroot { 97*4882a593Smuzhiyun+ err := fmt.Errorf("attempting to install package %s into read-only GOROOT", p.ImportPath) 98*4882a593Smuzhiyun+ return err 99*4882a593Smuzhiyun+ } 100*4882a593Smuzhiyun+ } 101*4882a593Smuzhiyun+ 102*4882a593Smuzhiyun if err := b.Mkdir(a.Objdir); err != nil { 103*4882a593Smuzhiyun return err 104*4882a593Smuzhiyun } 105