Merge "Generate .srcjar for prebuilt_stubs_sources"
This commit is contained in:
@@ -118,6 +118,9 @@ type Path interface {
|
|||||||
type WritablePath interface {
|
type WritablePath interface {
|
||||||
Path
|
Path
|
||||||
|
|
||||||
|
// return the path to the build directory.
|
||||||
|
buildDir() string
|
||||||
|
|
||||||
// the writablePath method doesn't directly do anything,
|
// the writablePath method doesn't directly do anything,
|
||||||
// but it allows a struct to distinguish between whether or not it implements the WritablePath interface
|
// but it allows a struct to distinguish between whether or not it implements the WritablePath interface
|
||||||
writablePath()
|
writablePath()
|
||||||
@@ -848,7 +851,12 @@ func (p OutputPath) WithoutRel() OutputPath {
|
|||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p OutputPath) buildDir() string {
|
||||||
|
return p.config.buildDir
|
||||||
|
}
|
||||||
|
|
||||||
var _ Path = OutputPath{}
|
var _ Path = OutputPath{}
|
||||||
|
var _ WritablePath = OutputPath{}
|
||||||
|
|
||||||
// PathForOutput joins the provided paths and returns an OutputPath that is
|
// PathForOutput joins the provided paths and returns an OutputPath that is
|
||||||
// validated to not escape the build dir.
|
// 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
|
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) writablePath() {}
|
||||||
|
|
||||||
func (p InstallPath) String() string {
|
func (p InstallPath) String() string {
|
||||||
@@ -1302,6 +1317,10 @@ type PhonyPath struct {
|
|||||||
|
|
||||||
func (p PhonyPath) writablePath() {}
|
func (p PhonyPath) writablePath() {}
|
||||||
|
|
||||||
|
func (p PhonyPath) buildDir() string {
|
||||||
|
return p.config.buildDir
|
||||||
|
}
|
||||||
|
|
||||||
var _ Path = PhonyPath{}
|
var _ Path = PhonyPath{}
|
||||||
var _ WritablePath = PhonyPath{}
|
var _ WritablePath = PhonyPath{}
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@ package android
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -411,3 +412,33 @@ func AndroidMkDataForTest(t *testing.T, config Config, bpPath string, mod bluepr
|
|||||||
data.fillInData(config, bpPath, mod)
|
data.fillInData(config, bpPath, mod)
|
||||||
return data
|
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
|
||||||
|
}
|
||||||
|
@@ -1948,12 +1948,42 @@ type PrebuiltStubsSources struct {
|
|||||||
|
|
||||||
properties PrebuiltStubsSourcesProperties
|
properties PrebuiltStubsSourcesProperties
|
||||||
|
|
||||||
srcs android.Paths
|
// The source directories containing stubs source files.
|
||||||
|
srcDirs android.Paths
|
||||||
stubsSrcJar android.ModuleOutPath
|
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) {
|
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 {
|
func (p *PrebuiltStubsSources) Prebuilt() *android.Prebuilt {
|
||||||
@@ -1964,10 +1994,6 @@ func (p *PrebuiltStubsSources) Name() string {
|
|||||||
return p.prebuilt.Name(p.ModuleBase.Name())
|
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
|
// prebuilt_stubs_sources imports a set of java source files as if they were
|
||||||
// generated by droidstubs.
|
// generated by droidstubs.
|
||||||
//
|
//
|
||||||
|
@@ -484,28 +484,24 @@ func TestPrebuilts(t *testing.T) {
|
|||||||
|
|
||||||
prebuilt_stubs_sources {
|
prebuilt_stubs_sources {
|
||||||
name: "stubs-source",
|
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")
|
combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac")
|
||||||
barJar := ctx.ModuleForTests("bar", "android_common").Rule("combineJar").Output
|
barJar := ctx.ModuleForTests("bar", "android_common").Rule("combineJar").Output
|
||||||
bazJar := ctx.ModuleForTests("baz", "android_common").Rule("combineJar").Output
|
bazJar := ctx.ModuleForTests("baz", "android_common").Rule("combineJar").Output
|
||||||
sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
|
sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output
|
||||||
|
|
||||||
inputs := []string{}
|
fooLibrary := fooModule.Module().(*Library)
|
||||||
for _, p := range javac.BuildParams.Inputs {
|
assertDeepEquals(t, "foo java sources incorrect",
|
||||||
inputs = append(inputs, p.String())
|
[]string{"a.java"}, fooLibrary.compiledJavaSrcs.Strings())
|
||||||
}
|
|
||||||
|
|
||||||
expected := []string{
|
assertDeepEquals(t, "foo java source jars incorrect",
|
||||||
"a.java",
|
[]string{".intermediates/stubs-source/android_common/stubs-source-stubs.srcjar"},
|
||||||
"stubs/sources/foo/Foo.java",
|
android.NormalizePathsForTesting(fooLibrary.compiledSrcJars))
|
||||||
}
|
|
||||||
if !reflect.DeepEqual(expected, inputs) {
|
|
||||||
t.Errorf("foo inputs incorrect: expected %q, found %q", expected, inputs)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.Contains(javac.Args["classpath"], barJar.String()) {
|
if !strings.Contains(javac.Args["classpath"], barJar.String()) {
|
||||||
t.Errorf("foo classpath %v does not contain %q", 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")
|
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) {
|
func TestDefaults(t *testing.T) {
|
||||||
ctx, _ := testJava(t, `
|
ctx, _ := testJava(t, `
|
||||||
java_defaults {
|
java_defaults {
|
||||||
|
@@ -183,7 +183,7 @@ func (r *testSdkResult) getSdkSnapshotBuildInfo(sdk *sdk) *snapshotBuildInfo {
|
|||||||
switch bp.Rule.String() {
|
switch bp.Rule.String() {
|
||||||
case android.Cp.String():
|
case android.Cp.String():
|
||||||
// Get source relative to build directory.
|
// Get source relative to build directory.
|
||||||
src := r.pathRelativeToBuildDir(bp.Input)
|
src := android.NormalizePathForTesting(bp.Input)
|
||||||
// Get destination relative to the snapshot root
|
// Get destination relative to the snapshot root
|
||||||
dest := bp.Output.Rel()
|
dest := bp.Output.Rel()
|
||||||
_, _ = fmt.Fprintf(copyRules, "%s -> %s\n", src, dest)
|
_, _ = 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.
|
// 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
|
// In that case this will be overridden when the rule to merge the zips
|
||||||
// is processed.
|
// is processed.
|
||||||
info.outputZip = r.pathRelativeToBuildDir(bp.Output)
|
info.outputZip = android.NormalizePathForTesting(bp.Output)
|
||||||
|
|
||||||
case mergeZips.String():
|
case mergeZips.String():
|
||||||
// Copy the current outputZip to the intermediateZip.
|
// Copy the current outputZip to the intermediateZip.
|
||||||
info.intermediateZip = info.outputZip
|
info.intermediateZip = info.outputZip
|
||||||
mergeInput := r.pathRelativeToBuildDir(bp.Input)
|
mergeInput := android.NormalizePathForTesting(bp.Input)
|
||||||
if info.intermediateZip != mergeInput {
|
if info.intermediateZip != mergeInput {
|
||||||
r.t.Errorf("Expected intermediate zip %s to be an input to merge zips but found %s instead",
|
r.t.Errorf("Expected intermediate zip %s to be an input to merge zips but found %s instead",
|
||||||
info.intermediateZip, mergeInput)
|
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
|
// Override output zip (which was actually the intermediate zip file) with the actual
|
||||||
// output zip.
|
// output zip.
|
||||||
info.outputZip = r.pathRelativeToBuildDir(bp.Output)
|
info.outputZip = android.NormalizePathForTesting(bp.Output)
|
||||||
|
|
||||||
// Save the zips to be merged into the intermediate zip.
|
// 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)
|
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.
|
// Check the snapshot build rules.
|
||||||
//
|
//
|
||||||
// Takes a list of functions which check different facets of the snapshot build rules.
|
// Takes a list of functions which check different facets of the snapshot build rules.
|
||||||
|
Reference in New Issue
Block a user