Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1ffd53f authored by Ramy Medhat's avatar Ramy Medhat Committed by Gerrit Code Review
Browse files

Merge "Add support for the remote execution of metalava actions."

parents 7097b058 427683ca
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import (

	"android/soong/android"
	"android/soong/java/config"
	"android/soong/remoteexec"
)

func init() {
@@ -1375,7 +1376,31 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi
	srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths) *android.RuleBuilderCommand {
	// Metalava uses lots of memory, restrict the number of metalava jobs that can run in parallel.
	rule.HighMem()
	cmd := rule.Command().BuiltTool(ctx, "metalava").
	cmd := rule.Command()
	if ctx.Config().IsEnvTrue("RBE_METALAVA") {
		rule.Remoteable(android.RemoteRuleSupports{RBE: true})
		execStrategy := remoteexec.LocalExecStrategy
		if v := ctx.Config().Getenv("RBE_METALAVA_EXEC_STRATEGY"); v != "" {
			execStrategy = v
		}
		pool := "metalava"
		if v := ctx.Config().Getenv("RBE_METALAVA_POOL"); v != "" {
			pool = v
		}
		inputs := []string{android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "metalava.jar").String()}
		if v := ctx.Config().Getenv("RBE_METALAVA_INPUTS"); v != "" {
			inputs = append(inputs, strings.Split(v, ",")...)
		}
		cmd.Text((&remoteexec.REParams{
			Labels:          map[string]string{"type": "compile", "lang": "java", "compiler": "metalava"},
			ExecStrategy:    execStrategy,
			Inputs:          inputs,
			ToolchainInputs: []string{config.JavaCmd(ctx).String()},
			Platform:        map[string]string{remoteexec.PoolKey: pool},
		}).NoVarTemplate(ctx.Config()))
	}

	cmd.BuiltTool(ctx, "metalava").
		Flag(config.JavacVmFlags).
		FlagWithArg("-encoding ", "UTF-8").
		FlagWithArg("-source ", javaVersion.String()).
+28 −14
Original line number Diff line number Diff line
@@ -82,17 +82,31 @@ type REParams struct {

func init() {
	pctx.VariableFunc("Wrapper", func(ctx android.PackageVarContext) string {
		if override := ctx.Config().Getenv("RBE_WRAPPER"); override != "" {
		return wrapper(ctx.Config())
	})
}

func wrapper(cfg android.Config) string {
	if override := cfg.Getenv("RBE_WRAPPER"); override != "" {
		return override
	}
	return DefaultWrapperPath
	})
}

// Generate the remote execution wrapper template to be added as a prefix to the rule's command.
// Template generates the remote execution wrapper template to be added as a prefix to the rule's
// command.
func (r *REParams) Template() string {
	template := "${remoteexec.Wrapper}"
	return "${remoteexec.Wrapper}" + r.wrapperArgs()
}

// NoVarTemplate generate the remote execution wrapper template without variables, to be used in
// RuleBuilder.
func (r *REParams) NoVarTemplate(cfg android.Config) string {
	return wrapper(cfg) + r.wrapperArgs()
}

func (r *REParams) wrapperArgs() string {
	args := ""
	var kvs []string
	labels := r.Labels
	if len(labels) == 0 {
@@ -102,7 +116,7 @@ func (r *REParams) Template() string {
		kvs = append(kvs, k+"="+v)
	}
	sort.Strings(kvs)
	template += " --labels=" + strings.Join(kvs, ",")
	args += " --labels=" + strings.Join(kvs, ",")

	var platform []string
	for k, v := range r.Platform {
@@ -116,32 +130,32 @@ func (r *REParams) Template() string {
	}
	if platform != nil {
		sort.Strings(platform)
		template += " --platform=\"" + strings.Join(platform, ",") + "\""
		args += " --platform=\"" + strings.Join(platform, ",") + "\""
	}

	strategy := r.ExecStrategy
	if strategy == "" {
		strategy = defaultExecStrategy
	}
	template += " --exec_strategy=" + strategy
	args += " --exec_strategy=" + strategy

	if len(r.Inputs) > 0 {
		template += " --inputs=" + strings.Join(r.Inputs, ",")
		args += " --inputs=" + strings.Join(r.Inputs, ",")
	}

	if r.RSPFile != "" {
		template += " --input_list_paths=" + r.RSPFile
		args += " --input_list_paths=" + r.RSPFile
	}

	if len(r.OutputFiles) > 0 {
		template += " --output_files=" + strings.Join(r.OutputFiles, ",")
		args += " --output_files=" + strings.Join(r.OutputFiles, ",")
	}

	if len(r.ToolchainInputs) > 0 {
		template += " --toolchain_inputs=" + strings.Join(r.ToolchainInputs, ",")
		args += " --toolchain_inputs=" + strings.Join(r.ToolchainInputs, ",")
	}

	return template + " -- "
	return args + " -- "
}

// StaticRules returns a pair of rules based on the given RuleParams, where the first rule is a
+18 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ package remoteexec
import (
	"fmt"
	"testing"

	"android/soong/android"
)

func TestTemplate(t *testing.T) {
@@ -64,6 +66,22 @@ func TestTemplate(t *testing.T) {
	}
}

func TestNoVarTemplate(t *testing.T) {
	params := &REParams{
		Labels:      map[string]string{"type": "compile", "lang": "cpp", "compiler": "clang"},
		Inputs:      []string{"$in"},
		OutputFiles: []string{"$out"},
		Platform: map[string]string{
			ContainerImageKey: DefaultImage,
			PoolKey:           "default",
		},
	}
	want := fmt.Sprintf("prebuilts/remoteexecution-client/live/rewrapper --labels=compiler=clang,lang=cpp,type=compile --platform=\"Pool=default,container-image=%s\" --exec_strategy=local --inputs=$in --output_files=$out -- ", DefaultImage)
	if got := params.NoVarTemplate(android.NullConfig("")); got != want {
		t.Errorf("NoVarTemplate() returned\n%s\nwant\n%s", got, want)
	}
}

func TestTemplateDeterminism(t *testing.T) {
	r := &REParams{
		Labels:      map[string]string{"type": "compile", "lang": "cpp", "compiler": "clang"},