Sfoglia il codice sorgente

implement USE_BAZEL_VERSION for m

This allows USE_BAZEL_VERSION to be set for m builds, which will use
Bazelisk for any Bazel invocations during those builds.

This should be used only for manual debugging, typically to either test
new Bazel features, verify Bazel compatibility with Android, or culprit
find new Bazel breakages.

Test: Manually run builds with USE_BAZEL_VERSION, toggled off and on to
ensure the build was rerun. Tested with a broken commit, a working
commit, and 'last_green' special term

Change-Id: I8b475dca5c8d4bd849ee3724a8c3aca9b631bcb8
Chris Parsons 1 anno fa
parent
commit
c83398ffb4
4 ha cambiato i file con 36 aggiunte e 10 eliminazioni
  1. 19 9
      bazel/bazel_proxy.go
  2. 6 0
      cmd/soong_build/main.go
  3. 10 0
      ui/build/config.go
  4. 1 1
      ui/build/soong.go

+ 19 - 9
bazel/bazel_proxy.go

@@ -26,10 +26,11 @@ import (
 	"time"
 	"time"
 )
 )
 
 
-// Logs fatal events of ProxyServer.
+// Logs events of ProxyServer.
 type ServerLogger interface {
 type ServerLogger interface {
 	Fatal(v ...interface{})
 	Fatal(v ...interface{})
 	Fatalf(format string, v ...interface{})
 	Fatalf(format string, v ...interface{})
+	Println(v ...interface{})
 }
 }
 
 
 // CmdRequest is a request to the Bazel Proxy server.
 // CmdRequest is a request to the Bazel Proxy server.
@@ -71,9 +72,10 @@ type ProxyClient struct {
 // The ProxyServer will only live as long as soong_ui does; the
 // The ProxyServer will only live as long as soong_ui does; the
 // underlying Bazel server will live past the duration of the build.
 // underlying Bazel server will live past the duration of the build.
 type ProxyServer struct {
 type ProxyServer struct {
-	logger       ServerLogger
-	outDir       string
-	workspaceDir string
+	logger          ServerLogger
+	outDir          string
+	workspaceDir    string
+	bazeliskVersion string
 	// The server goroutine will listen on this channel and stop handling requests
 	// The server goroutine will listen on this channel and stop handling requests
 	// once it is written to.
 	// once it is written to.
 	done chan struct{}
 	done chan struct{}
@@ -119,12 +121,17 @@ func (b *ProxyClient) IssueCommand(req CmdRequest) (CmdResponse, error) {
 }
 }
 
 
 // NewProxyServer is a constructor for a ProxyServer.
 // NewProxyServer is a constructor for a ProxyServer.
-func NewProxyServer(logger ServerLogger, outDir string, workspaceDir string) *ProxyServer {
+func NewProxyServer(logger ServerLogger, outDir string, workspaceDir string, bazeliskVersion string) *ProxyServer {
+	if len(bazeliskVersion) > 0 {
+		logger.Println("** Using Bazelisk for this build, due to env var USE_BAZEL_VERSION=" + bazeliskVersion + " **")
+	}
+
 	return &ProxyServer{
 	return &ProxyServer{
-		logger:       logger,
-		outDir:       outDir,
-		workspaceDir: workspaceDir,
-		done:         make(chan struct{}),
+		logger:          logger,
+		outDir:          outDir,
+		workspaceDir:    workspaceDir,
+		done:            make(chan struct{}),
+		bazeliskVersion: bazeliskVersion,
 	}
 	}
 }
 }
 
 
@@ -155,6 +162,9 @@ func (b *ProxyServer) handleRequest(conn net.Conn) error {
 		return fmt.Errorf("Error decoding request: %s", err)
 		return fmt.Errorf("Error decoding request: %s", err)
 	}
 	}
 
 
+	if len(b.bazeliskVersion) > 0 {
+		req.Env = append(req.Env, "USE_BAZEL_VERSION="+b.bazeliskVersion)
+	}
 	stdout, stderr, cmdErr := ExecBazel("./build/bazel/bin/bazel", b.workspaceDir, req)
 	stdout, stderr, cmdErr := ExecBazel("./build/bazel/bin/bazel", b.workspaceDir, req)
 	errorString := ""
 	errorString := ""
 	if cmdErr != nil {
 	if cmdErr != nil {

+ 6 - 0
cmd/soong_build/main.go

@@ -544,6 +544,12 @@ func main() {
 		}
 		}
 		writeMetrics(configuration, ctx.EventHandler, metricsDir)
 		writeMetrics(configuration, ctx.EventHandler, metricsDir)
 	}
 	}
+
+	// Register this environment variablesas being an implicit dependencies of
+	// soong_build. Changes to this environment variable will result in
+	// retriggering soong_build.
+	configuration.Getenv("USE_BAZEL_VERSION")
+
 	writeUsedEnvironmentFile(configuration)
 	writeUsedEnvironmentFile(configuration)
 
 
 	// Touch the output file so that it's the newest file created by soong_build.
 	// Touch the output file so that it's the newest file created by soong_build.

+ 10 - 0
ui/build/config.go

@@ -1712,6 +1712,16 @@ func (c *configImpl) IsPersistentBazelEnabled() bool {
 	return c.Environment().IsEnvTrue("USE_PERSISTENT_BAZEL")
 	return c.Environment().IsEnvTrue("USE_PERSISTENT_BAZEL")
 }
 }
 
 
+// GetBazeliskBazelVersion returns the Bazel version to use for this build,
+// or the empty string if the current canonical prod Bazel should be used.
+// This environment variable should only be set to debug the build system.
+// The Bazel version, if set, will be passed to Bazelisk, and Bazelisk will
+// handle downloading and invoking the correct Bazel binary.
+func (c *configImpl) GetBazeliskBazelVersion() string {
+	value, _ := c.Environment().Get("USE_BAZEL_VERSION")
+	return value
+}
+
 func (c *configImpl) BazelModulesForceEnabledByFlag() string {
 func (c *configImpl) BazelModulesForceEnabledByFlag() string {
 	return c.bazelForceEnabledModules
 	return c.bazelForceEnabledModules
 }
 }

+ 1 - 1
ui/build/soong.go

@@ -521,7 +521,7 @@ func runSoong(ctx Context, config Config) {
 		defer ctx.EndTrace()
 		defer ctx.EndTrace()
 
 
 		if config.IsPersistentBazelEnabled() {
 		if config.IsPersistentBazelEnabled() {
-			bazelProxy := bazel.NewProxyServer(ctx.Logger, config.OutDir(), filepath.Join(config.SoongOutDir(), "workspace"))
+			bazelProxy := bazel.NewProxyServer(ctx.Logger, config.OutDir(), filepath.Join(config.SoongOutDir(), "workspace"), config.GetBazeliskBazelVersion())
 			bazelProxy.Start()
 			bazelProxy.Start()
 			defer bazelProxy.Close()
 			defer bazelProxy.Close()
 		}
 		}