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

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

Merge "Generate .srcjar for prebuilt_stubs_sources"

parents 97e7279c 9b478b08
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -118,6 +118,9 @@ type Path interface {
type WritablePath interface {
	Path

	// return the path to the build directory.
	buildDir() string

	// the writablePath method doesn't directly do anything,
	// but it allows a struct to distinguish between whether or not it implements the WritablePath interface
	writablePath()
@@ -848,7 +851,12 @@ func (p OutputPath) WithoutRel() OutputPath {
	return p
}

func (p OutputPath) buildDir() string {
	return p.config.buildDir
}

var _ Path = OutputPath{}
var _ WritablePath = OutputPath{}

// PathForOutput joins the provided paths and returns an OutputPath that is
// validated to not escape the build dir.
@@ -1151,6 +1159,13 @@ type InstallPath struct {
	baseDir string // "../" for Make paths to convert "out/soong" to "out", "" for Soong paths
}

func (p InstallPath) buildDir() string {
	return p.config.buildDir
}

var _ Path = InstallPath{}
var _ WritablePath = InstallPath{}

func (p InstallPath) writablePath() {}

func (p InstallPath) String() string {
@@ -1302,6 +1317,10 @@ type PhonyPath struct {

func (p PhonyPath) writablePath() {}

func (p PhonyPath) buildDir() string {
	return p.config.buildDir
}

var _ Path = PhonyPath{}
var _ WritablePath = PhonyPath{}

+31 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ package android

import (
	"fmt"
	"path/filepath"
	"regexp"
	"strings"
	"testing"
@@ -411,3 +412,33 @@ func AndroidMkDataForTest(t *testing.T, config Config, bpPath string, mod bluepr
	data.fillInData(config, bpPath, mod)
	return data
}

// Normalize the path for testing.
//
// If the path is relative to the build directory then return the relative path
// to avoid tests having to deal with the dynamically generated build directory.
//
// Otherwise, return the supplied path as it is almost certainly a source path
// that is relative to the root of the source tree.
//
// The build and source paths should be distinguishable based on their contents.
func NormalizePathForTesting(path Path) string {
	p := path.String()
	if w, ok := path.(WritablePath); ok {
		rel, err := filepath.Rel(w.buildDir(), p)
		if err != nil {
			panic(err)
		}
		return rel
	}
	return p
}

func NormalizePathsForTesting(paths Paths) []string {
	var result []string
	for _, path := range paths {
		relative := NormalizePathForTesting(path)
		result = append(result, relative)
	}
	return result
}
+32 −6
Original line number Diff line number Diff line
@@ -1948,12 +1948,42 @@ type PrebuiltStubsSources struct {

	properties PrebuiltStubsSourcesProperties

	srcs        android.Paths
	// The source directories containing stubs source files.
	srcDirs     android.Paths
	stubsSrcJar android.ModuleOutPath
}

func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) {
	switch tag {
	case "":
		return android.Paths{p.stubsSrcJar}, nil
	default:
		return nil, fmt.Errorf("unsupported module reference tag %q", tag)
	}
}

func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	p.srcs = android.PathsForModuleSrc(ctx, p.properties.Srcs)
	p.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")

	p.srcDirs = android.PathsForModuleSrc(ctx, p.properties.Srcs)

	rule := android.NewRuleBuilder()
	command := rule.Command().
		BuiltTool(ctx, "soong_zip").
		Flag("-write_if_changed").
		Flag("-jar").
		FlagWithOutput("-o ", p.stubsSrcJar)

	for _, d := range p.srcDirs {
		dir := d.String()
		command.
			FlagWithArg("-C ", dir).
			FlagWithInput("-D ", d)
	}

	rule.Restat()

	rule.Build(pctx, ctx, "zip src", "Create srcjar from prebuilt source")
}

func (p *PrebuiltStubsSources) Prebuilt() *android.Prebuilt {
@@ -1964,10 +1994,6 @@ func (p *PrebuiltStubsSources) Name() string {
	return p.prebuilt.Name(p.ModuleBase.Name())
}

func (p *PrebuiltStubsSources) Srcs() android.Paths {
	return append(android.Paths{}, p.srcs...)
}

// prebuilt_stubs_sources imports a set of java source files as if they were
// generated by droidstubs.
//
+15 −13
Original line number Diff line number Diff line
@@ -484,28 +484,24 @@ func TestPrebuilts(t *testing.T) {

		prebuilt_stubs_sources {
			name: "stubs-source",
			srcs: ["stubs/sources/**/*.java"],
			srcs: ["stubs/sources"],
		}
		`)

	javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
	fooModule := ctx.ModuleForTests("foo", "android_common")
	javac := fooModule.Rule("javac")
	combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
	barJar := ctx.ModuleForTests("bar", "android_common").Rule("combineJar").Output
	bazJar := ctx.ModuleForTests("baz", "android_common").Rule("combineJar").Output
	sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output

	inputs := []string{}
	for _, p := range javac.BuildParams.Inputs {
		inputs = append(inputs, p.String())
	}
	fooLibrary := fooModule.Module().(*Library)
	assertDeepEquals(t, "foo java sources incorrect",
		[]string{"a.java"}, fooLibrary.compiledJavaSrcs.Strings())

	expected := []string{
		"a.java",
		"stubs/sources/foo/Foo.java",
	}
	if !reflect.DeepEqual(expected, inputs) {
		t.Errorf("foo inputs incorrect: expected %q, found %q", expected, inputs)
	}
	assertDeepEquals(t, "foo java source jars incorrect",
		[]string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
		android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))

	if !strings.Contains(javac.Args["classpath"], barJar.String()) {
		t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String())
@@ -522,6 +518,12 @@ func TestPrebuilts(t *testing.T) {
	ctx.ModuleForTests("qux", "android_common").Rule("Cp")
}

func assertDeepEquals(t *testing.T, message string, expected interface{}, actual interface{}) {
	if !reflect.DeepEqual(expected, actual) {
		t.Errorf("%s: expected %q, found %q", message, expected, actual)
	}
}

func TestDefaults(t *testing.T) {
	ctx, _ := testJava(t, `
		java_defaults {
+5 −18
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo {
		switch bp.Rule.String() {
		case android.Cp.String():
			// Get source relative to build directory.
			src := r.pathRelativeToBuildDir(bp.Input)
			src := android.NormalizePathForTesting(bp.Input)
			// Get destination relative to the snapshot root
			dest := bp.Output.Rel()
			_, _ = fmt.Fprintf(copyRules, "%s -> %s\n", src, dest)
@@ -199,12 +199,12 @@ func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo {
			// This could be an intermediate zip file and not the actual output zip.
			// In that case this will be overridden when the rule to merge the zips
			// is processed.
			info.outputZip = r.pathRelativeToBuildDir(bp.Output)
			info.outputZip = android.NormalizePathForTesting(bp.Output)

		case mergeZips.String():
			// Copy the current outputZip to the intermediateZip.
			info.intermediateZip = info.outputZip
			mergeInput := r.pathRelativeToBuildDir(bp.Input)
			mergeInput := android.NormalizePathForTesting(bp.Input)
			if info.intermediateZip != mergeInput {
				r.t.Errorf("Expected intermediate zip %s to be an input to merge zips but found %s instead",
					info.intermediateZip, mergeInput)
@@ -212,10 +212,10 @@ func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo {

			// Override output zip (which was actually the intermediate zip file) with the actual
			// output zip.
			info.outputZip = r.pathRelativeToBuildDir(bp.Output)
			info.outputZip = android.NormalizePathForTesting(bp.Output)

			// Save the zips to be merged into the intermediate zip.
			info.mergeZips = r.pathsRelativeToBuildDir(bp.Inputs)
			info.mergeZips = android.NormalizePathsForTesting(bp.Inputs)
		}
	}

@@ -232,19 +232,6 @@ func (r *testSdkResult) ModuleForTests(name string, variant string) android.Test
	return r.ctx.ModuleForTests(name, variant)
}

func (r *testSdkResult) pathRelativeToBuildDir(path android.Path) string {
	buildDir := filepath.Clean(r.config.BuildDir()) + "/"
	return strings.TrimPrefix(filepath.Clean(path.String()), buildDir)
}

func (r *testSdkResult) pathsRelativeToBuildDir(paths android.Paths) []string {
	var result []string
	for _, path := range paths {
		result = append(result, r.pathRelativeToBuildDir(path))
	}
	return result
}

// Check the snapshot build rules.
//
// Takes a list of functions which check different facets of the snapshot build rules.