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