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

Commit 7467a714 authored by Paul Duffin's avatar Paul Duffin Committed by Gerrit Code Review
Browse files

Merge "Use static build rules in snapshot generation"

parents d57bd3c8 375058f6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import (

func init() {
	pctx.Import("android/soong/android")
	pctx.Import("android/soong/java/config")

	android.RegisterModuleType("sdk", ModuleFactory)
	android.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
	android.PreDepsMutators(RegisterPreDepsMutators)
+43 −31
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import (
	"android/soong/java"
)

func testSdkContext(t *testing.T, bp string) (*android.TestContext, android.Config) {
func testSdkContext(bp string) (*android.TestContext, android.Config) {
	config := android.TestArchConfig(buildDir, nil)
	ctx := android.NewTestArchContext()

@@ -114,7 +114,7 @@ func testSdkContext(t *testing.T, bp string) (*android.TestContext, android.Conf
}

func testSdk(t *testing.T, bp string) (*android.TestContext, android.Config) {
	ctx, config := testSdkContext(t, bp)
	ctx, config := testSdkContext(bp)
	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
	android.FailIfErrored(t, errs)
	_, errs = ctx.PrepareBuildActions(config)
@@ -124,7 +124,7 @@ func testSdk(t *testing.T, bp string) (*android.TestContext, android.Config) {

func testSdkError(t *testing.T, pattern, bp string) {
	t.Helper()
	ctx, config := testSdkContext(t, bp)
	ctx, config := testSdkContext(bp)
	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
	if len(errs) > 0 {
		android.FailIfNoMatchingErrors(t, pattern, errs)
@@ -147,7 +147,7 @@ func ensureListContains(t *testing.T, result []string, expected string) {
}

func pathsToStrings(paths android.Paths) []string {
	ret := []string{}
	var ret []string
	for _, p := range paths {
		ret = append(ret, p.String())
	}
@@ -554,14 +554,23 @@ sdk_snapshot {
	var copySrcs []string
	var copyDests []string
	buildParams := sdk.BuildParamsForTests()
	var zipBp android.BuildParams
	var mergeZipInputs []string
	var intermediateZip string
	var outputZip string
	for _, bp := range buildParams {
		ruleString := bp.Rule.String()
		if ruleString == "android/soong/android.Cp" {
		if ruleString == android.Cp.String() {
			copySrcs = append(copySrcs, bp.Input.String())
			copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
		} else if ruleString == "<local rule>:m.mysdk_android_common.snapshot" {
			zipBp = bp
		} else if ruleString == zipFiles.String() {
			intermediateZip = bp.Output.String()
		} else if ruleString == mergeZips.String() {
			input := bp.Input.String()
			if intermediateZip != input {
				t.Errorf("Intermediate zip %s is not an input to merge_zips, %s is used instead", intermediateZip, input)
			}
			mergeZipInputs = bp.Inputs.Strings()
			outputZip = bp.Output.String()
		}
	}

@@ -582,17 +591,14 @@ sdk_snapshot {
	ensureListContains(t, copyDests, "java/myjavalib.jar")
	ensureListContains(t, copyDests, "arm64/lib/mynativelib.so")

	expectedOutputZip := filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.zip")
	expectedRepackagedZip := filepath.Join(buildDir, ".intermediates/mysdk/android_common/tmp/java/myjavaapistubs_stubs_sources.zip")

	// Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
	// and then merged together with the intermediate snapshot zip.
	snapshotCreationInputs := zipBp.Implicits.Strings()
	ensureListContains(t, snapshotCreationInputs,
		filepath.Join(buildDir, ".intermediates/mysdk/android_common/tmp/java/myjavaapistubs_stubs_sources.zip"))
	ensureListContains(t, snapshotCreationInputs,
		filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.unmerged.zip"))
	actual := zipBp.Output.String()
	expected := filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.zip")
	if actual != expected {
		t.Errorf("Expected snapshot output to be %q but was %q", expected, actual)
	ensureListContains(t, mergeZipInputs, expectedRepackagedZip)
	if outputZip != expectedOutputZip {
		t.Errorf("Expected snapshot output to be %q but was %q", expectedOutputZip, outputZip)
	}
}

@@ -749,14 +755,23 @@ sdk_snapshot {
	var copySrcs []string
	var copyDests []string
	buildParams := sdk.BuildParamsForTests()
	var zipBp android.BuildParams
	var mergeZipInputs []string
	var intermediateZip string
	var outputZip string
	for _, bp := range buildParams {
		ruleString := bp.Rule.String()
		if ruleString == "android/soong/android.Cp" {
		if ruleString == android.Cp.String() {
			copySrcs = append(copySrcs, bp.Input.String())
			copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
		} else if ruleString == "<local rule>:m.mysdk_linux_glibc_common.snapshot" {
			zipBp = bp
		} else if ruleString == zipFiles.String() {
			intermediateZip = bp.Output.String()
		} else if ruleString == mergeZips.String() {
			input := bp.Input.String()
			if intermediateZip != input {
				t.Errorf("Intermediate zip %s is not an input to merge_zips, %s is used instead", intermediateZip, input)
			}
			mergeZipInputs = bp.Inputs.Strings()
			outputZip = bp.Output.String()
		}
	}

@@ -777,17 +792,14 @@ sdk_snapshot {
	ensureListContains(t, copyDests, "java/myjavalib.jar")
	ensureListContains(t, copyDests, "x86_64/lib/mynativelib.so")

	expectedOutputZip := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.zip")
	expectedRepackagedZip := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/tmp/java/myjavaapistubs_stubs_sources.zip")

	// Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
	// and then merged together with the intermediate snapshot zip.
	snapshotCreationInputs := zipBp.Implicits.Strings()
	ensureListContains(t, snapshotCreationInputs,
		filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/tmp/java/myjavaapistubs_stubs_sources.zip"))
	ensureListContains(t, snapshotCreationInputs,
		filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.unmerged.zip"))
	actual := zipBp.Output.String()
	expected := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.zip")
	if actual != expected {
		t.Errorf("Expected snapshot output to be %q but was %q", expected, actual)
	ensureListContains(t, mergeZipInputs, expectedRepackagedZip)
	if outputZip != expectedOutputZip {
		t.Errorf("Expected snapshot output to be %q but was %q", expectedOutputZip, outputZip)
	}
}

@@ -810,7 +822,7 @@ func setUp() {
}

func tearDown() {
	os.RemoveAll(buildDir)
	_ = os.RemoveAll(buildDir)
}

func TestMain(m *testing.M) {
+57 −26
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import (
	"reflect"
	"strings"

	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"

	"android/soong/android"
@@ -29,6 +30,36 @@ import (

var pctx = android.NewPackageContext("android/soong/sdk")

var (
	repackageZip = pctx.AndroidStaticRule("SnapshotRepackageZip",
		blueprint.RuleParams{
			Command: `${config.Zip2ZipCmd} -i $in -o $out "**/*:$destdir"`,
			CommandDeps: []string{
				"${config.Zip2ZipCmd}",
			},
		},
		"destdir")

	zipFiles = pctx.AndroidStaticRule("SnapshotZipFiles",
		blueprint.RuleParams{
			Command: `${config.SoongZipCmd} -C $basedir -l $out.rsp -o $out`,
			CommandDeps: []string{
				"${config.SoongZipCmd}",
			},
			Rspfile:        "$out.rsp",
			RspfileContent: "$in",
		},
		"basedir")

	mergeZips = pctx.AndroidStaticRule("SnapshotMergeZips",
		blueprint.RuleParams{
			Command: `${config.MergeZipsCmd} $out $in`,
			CommandDeps: []string{
				"${config.MergeZipsCmd}",
			},
		})
)

type generatedContents struct {
	content     strings.Builder
	indentLevel int
@@ -316,41 +347,39 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {

	// zip them all
	outputZipFile := android.PathForModuleOut(ctx, ctx.ModuleName()+"-current.zip").OutputPath
	outputRuleName := "snapshot"
	outputDesc := "Building snapshot for " + ctx.ModuleName()

	// If there are no zips to merge then generate the output zip directly.
	// Otherwise, generate an intermediate zip file into which other zips can be
	// merged.
	var zipFile android.OutputPath
	var ruleName string
	var desc string
	if len(builder.zipsToMerge) == 0 {
		zipFile = outputZipFile
		ruleName = outputRuleName
		desc = outputDesc
	} else {
		zipFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"-current.unmerged.zip").OutputPath
		ruleName = "intermediate snapshot"
		desc = "Building intermediate snapshot for " + ctx.ModuleName()
	}

	rb := android.NewRuleBuilder()
	rb.Command().
		BuiltTool(ctx, "soong_zip").
		FlagWithArg("-C ", builder.snapshotDir.String()).
		FlagWithRspFileInputList("-l ", filesToZip).
		FlagWithOutput("-o ", zipFile)
	rb.Build(pctx, ctx, ruleName, desc)
	ctx.Build(pctx, android.BuildParams{
		Description: desc,
		Rule:        zipFiles,
		Inputs:      filesToZip,
		Output:      zipFile,
		Args: map[string]string{
			"basedir": builder.snapshotDir.String(),
		},
	})

	if len(builder.zipsToMerge) != 0 {
		rb := android.NewRuleBuilder()
		rb.Command().
			BuiltTool(ctx, "merge_zips").
			Output(outputZipFile).
			Input(zipFile).
			Inputs(builder.zipsToMerge)
		rb.Build(pctx, ctx, outputRuleName, outputDesc)
		ctx.Build(pctx, android.BuildParams{
			Description: outputDesc,
			Rule:        mergeZips,
			Input:       zipFile,
			Inputs:      builder.zipsToMerge,
			Output:      outputZipFile,
		})
	}

	return outputZipFile
@@ -534,14 +563,16 @@ func (s *snapshotBuilder) UnzipToSnapshot(zipPath android.Path, destDir string)
	// Repackage the zip file so that the entries are in the destDir directory.
	// This will allow the zip file to be merged into the snapshot.
	tmpZipPath := android.PathForModuleOut(ctx, "tmp", destDir+".zip").OutputPath
	rb := android.NewRuleBuilder()
	rb.Command().
		BuiltTool(ctx, "zip2zip").
		FlagWithInput("-i ", zipPath).
		FlagWithOutput("-o ", tmpZipPath).
		Flag("**/*:" + destDir)
	rb.Build(pctx, ctx, "repackaging "+destDir,
		"Repackaging zip file "+destDir+" for snapshot "+ctx.ModuleName())

	ctx.Build(pctx, android.BuildParams{
		Description: "Repackaging zip file " + destDir + " for snapshot " + ctx.ModuleName(),
		Rule:        repackageZip,
		Input:       zipPath,
		Output:      tmpZipPath,
		Args: map[string]string{
			"destdir": destDir,
		},
	})

	// Add the repackaged zip file to the files to merge.
	s.zipsToMerge = append(s.zipsToMerge, tmpZipPath)