diff options
-rw-r--r-- | Android.bp | 3 | ||||
-rw-r--r-- | android/defaults.go | 34 | ||||
-rw-r--r-- | androidmk/cmd/androidmk/android.go | 6 | ||||
-rw-r--r-- | cc/cc.go | 8 | ||||
-rw-r--r-- | cc/llndk_library.go | 5 | ||||
-rw-r--r-- | cc/ndk_library.go | 31 | ||||
-rw-r--r-- | java/app.go | 5 | ||||
-rw-r--r-- | java/java.go | 166 | ||||
-rw-r--r-- | java/java_test.go | 240 |
9 files changed, 380 insertions, 118 deletions
@@ -203,6 +203,9 @@ bootstrap_go_package { "java/java.go", "java/resources.go", ], + testSrcs: [ + "java/java_test.go", + ], pluginFor: ["soong_build"], } diff --git a/android/defaults.go b/android/defaults.go index 84f0a3db..3ec3ff42 100644 --- a/android/defaults.go +++ b/android/defaults.go @@ -29,16 +29,16 @@ type defaultsProperties struct { Defaults []string } -type DefaultableModule struct { +type DefaultableModuleBase struct { defaultsProperties defaultsProperties defaultableProperties []interface{} } -func (d *DefaultableModule) defaults() *defaultsProperties { +func (d *DefaultableModuleBase) defaults() *defaultsProperties { return &d.defaultsProperties } -func (d *DefaultableModule) setProperties(props []interface{}) { +func (d *DefaultableModuleBase) setProperties(props []interface{}) { d.defaultableProperties = props } @@ -48,17 +48,21 @@ type Defaultable interface { applyDefaults(TopDownMutatorContext, []Defaults) } -var _ Defaultable = (*DefaultableModule)(nil) +type DefaultableModule interface { + Module + Defaultable +} -func InitDefaultableModule(module Module, d Defaultable) { +var _ Defaultable = (*DefaultableModuleBase)(nil) - d.setProperties(module.GetProperties()) +func InitDefaultableModule(module DefaultableModule) { + module.(Defaultable).setProperties(module.(Module).GetProperties()) - module.AddProperties(d.defaults()) + module.AddProperties(module.defaults()) } -type DefaultsModule struct { - DefaultableModule +type DefaultsModuleBase struct { + DefaultableModuleBase defaultProperties []interface{} } @@ -68,31 +72,31 @@ type Defaults interface { properties() []interface{} } -func (d *DefaultsModule) isDefaults() bool { +func (d *DefaultsModuleBase) isDefaults() bool { return true } -func (d *DefaultsModule) properties() []interface{} { +func (d *DefaultsModuleBase) properties() []interface{} { return d.defaultableProperties } -func InitDefaultsModule(module Module, d Defaults) { +func InitDefaultsModule(module DefaultableModule) { module.AddProperties( &hostAndDeviceProperties{}, &commonProperties{}, &variableProperties{}) InitArchModule(module) - InitDefaultableModule(module, d) + InitDefaultableModule(module) module.AddProperties(&module.base().nameProperties) module.base().module = module } -var _ Defaults = (*DefaultsModule)(nil) +var _ Defaults = (*DefaultsModuleBase)(nil) -func (defaultable *DefaultableModule) applyDefaults(ctx TopDownMutatorContext, +func (defaultable *DefaultableModuleBase) applyDefaults(ctx TopDownMutatorContext, defaultsList []Defaults) { for _, defaults := range defaultsList { diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index 78395c33..194b2c93 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -102,11 +102,11 @@ func init() { "LOCAL_RENDERSCRIPT_INCLUDES": "renderscript.include_dirs", "LOCAL_RENDERSCRIPT_FLAGS": "renderscript.flags", - "LOCAL_JAVA_RESOURCE_DIRS": "java_resource_dirs", + "LOCAL_JAVA_RESOURCE_DIRS": "resource_dirs", "LOCAL_JAVACFLAGS": "javacflags", "LOCAL_DX_FLAGS": "dxflags", - "LOCAL_JAVA_LIBRARIES": "java_libs", - "LOCAL_STATIC_JAVA_LIBRARIES": "java_static_libs", + "LOCAL_JAVA_LIBRARIES": "libs", + "LOCAL_STATIC_JAVA_LIBRARIES": "static_libs", "LOCAL_AIDL_INCLUDES": "aidl.include_dirs", "LOCAL_AAPT_FLAGS": "aaptflags", "LOCAL_PACKAGE_SPLITS": "package_splits", @@ -275,7 +275,7 @@ var ( // to construct the output file. Behavior can be customized with a Customizer interface type Module struct { android.ModuleBase - android.DefaultableModule + android.DefaultableModuleBase Properties BaseProperties unused UnusedProperties @@ -339,7 +339,7 @@ func (c *Module) Init() android.Module { android.InitAndroidArchModule(c, c.hod, c.multilib) - android.InitDefaultableModule(c, c) + android.InitDefaultableModule(c) return c } @@ -1138,7 +1138,7 @@ func (c *Module) HostToolPath() android.OptionalPath { // type Defaults struct { android.ModuleBase - android.DefaultsModule + android.DefaultsModuleBase } func (*Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -1174,7 +1174,7 @@ func DefaultsFactory(props ...interface{}) android.Module { &SAbiProperties{}, ) - android.InitDefaultsModule(module, module) + android.InitDefaultsModule(module) return module } diff --git a/cc/llndk_library.go b/cc/llndk_library.go index 66ffc9fe..c3d3462b 100644 --- a/cc/llndk_library.go +++ b/cc/llndk_library.go @@ -61,6 +61,11 @@ type llndkStubDecorator struct { versionScriptPath android.ModuleGenPath } +func (stub *llndkStubDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { + flags = stub.baseCompiler.compilerFlags(ctx, flags) + return addStubLibraryCompilerFlags(flags) +} + func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { objs, versionScript := compileStubLibrary(ctx, flags, stub.Properties.Symbol_file, "current", "--vndk") stub.versionScriptPath = versionScript diff --git a/cc/ndk_library.go b/cc/ndk_library.go index 5765aa92..dbfc5be3 100644 --- a/cc/ndk_library.go +++ b/cc/ndk_library.go @@ -242,6 +242,25 @@ func (c *stubDecorator) compilerInit(ctx BaseModuleContext) { ndkMigratedLibs = append(ndkMigratedLibs, name) } +func addStubLibraryCompilerFlags(flags Flags) Flags { + flags.CFlags = append(flags.CFlags, + // We're knowingly doing some otherwise unsightly things with builtin + // functions here. We're just generating stub libraries, so ignore it. + "-Wno-incompatible-library-redeclaration", + "-Wno-builtin-requires-header", + "-Wno-invalid-noreturn", + // These libraries aren't actually used. Don't worry about unwinding + // (avoids the need to link an unwinder into a fake library). + "-fno-unwind-tables", + ) + return flags +} + +func (stub *stubDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags { + flags = stub.baseCompiler.compilerFlags(ctx, flags) + return addStubLibraryCompilerFlags(flags) +} + func compileStubLibrary(ctx ModuleContext, flags Flags, symbolFile, apiLevel, vndk string) (Objects, android.ModuleGenPath) { arch := ctx.Arch().ArchType.String() @@ -263,18 +282,6 @@ func compileStubLibrary(ctx ModuleContext, flags Flags, symbolFile, apiLevel, vn }, }) - flags.CFlags = append(flags.CFlags, - // We're knowingly doing some otherwise unsightly things with builtin - // functions here. We're just generating stub libraries, so ignore it. - "-Wno-incompatible-library-redeclaration", - "-Wno-builtin-requires-header", - "-Wno-invalid-noreturn", - - // These libraries aren't actually used. Don't worry about unwinding - // (avoids the need to link an unwinder into a fake library). - "-fno-unwind-tables", - ) - subdir := "" srcs := []android.Path{stubSrcPath} return compileObjs(ctx, flagsToBuilderFlags(flags), subdir, srcs, nil), versionScriptPath diff --git a/java/app.go b/java/app.go index 2f2b899d..fccd3823 100644 --- a/java/app.go +++ b/java/app.go @@ -68,17 +68,14 @@ type AndroidApp struct { func (a *AndroidApp) DepsMutator(ctx android.BottomUpMutatorContext) { a.Module.deps(ctx) - var deps []string if !a.properties.No_standard_libraries { switch a.deviceProperties.Sdk_version { // TODO: Res_sdk_version? case "current", "system_current", "": - deps = append(deps, "framework-res") + ctx.AddDependency(ctx.Module(), frameworkResTag, "framework-res") default: // We'll already have a dependency on an sdk prebuilt android.jar } } - - ctx.AddDependency(ctx.Module(), nil, deps...) } func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { diff --git a/java/java.go b/java/java.go index adb3d7bd..3d2e9609 100644 --- a/java/java.go +++ b/java/java.go @@ -35,8 +35,8 @@ func init() { android.RegisterModuleType("java_library_host", JavaLibraryHostFactory) android.RegisterModuleType("java_binary", JavaBinaryFactory) android.RegisterModuleType("java_binary_host", JavaBinaryHostFactory) - android.RegisterModuleType("prebuilt_java_library", JavaPrebuiltFactory) - android.RegisterModuleType("prebuilt_sdk", SdkPrebuiltFactory) + android.RegisterModuleType("java_prebuilt_library", JavaPrebuiltFactory) + android.RegisterModuleType("android_prebuilt_sdk", SdkPrebuiltFactory) android.RegisterModuleType("android_app", AndroidAppFactory) android.RegisterSingletonType("logtags", LogtagsSingleton) @@ -65,10 +65,10 @@ type compilerProperties struct { Exclude_srcs []string `android:"arch_variant"` // list of directories containing Java resources - Java_resource_dirs []string `android:"arch_variant"` + Resource_dirs []string `android:"arch_variant"` - // list of directories that should be excluded from java_resource_dirs - Exclude_java_resource_dirs []string `android:"arch_variant"` + // list of directories that should be excluded from resource_dirs + Exclude_resource_dirs []string `android:"arch_variant"` // don't build against the default libraries (legacy-test, core-junit, // ext, and framework for device targets) @@ -78,10 +78,10 @@ type compilerProperties struct { Javacflags []string `android:"arch_variant"` // list of of java libraries that will be in the classpath - Java_libs []string `android:"arch_variant"` + Libs []string `android:"arch_variant"` // list of java libraries that will be compiled into the resulting jar - Java_static_libs []string `android:"arch_variant"` + Static_libs []string `android:"arch_variant"` // manifest file to be included in resulting jar Manifest *string @@ -147,45 +147,46 @@ type JavaDependency interface { AidlIncludeDirs() android.Paths } -func (j *Module) BootClasspath(ctx android.BaseContext) string { - if ctx.Device() { - switch j.deviceProperties.Sdk_version { - case "": - return "core-libart" - case "current": - // TODO: !TARGET_BUILD_APPS - // TODO: export preprocessed framework.aidl from android_stubs_current - return "android_stubs_current" - case "system_current": - return "android_system_stubs_current" - default: - return "sdk_v" + j.deviceProperties.Sdk_version - } - } else { - if j.deviceProperties.Dex { - return "core-libart" - } else { - return "" - } - } +type dependencyTag struct { + blueprint.BaseDependencyTag + name string } -func (j *Module) deps(ctx android.BottomUpMutatorContext) { - var deps []string +var ( + javaStaticLibTag = dependencyTag{name: "staticlib"} + javaLibTag = dependencyTag{name: "javalib"} + bootClasspathTag = dependencyTag{name: "bootclasspath"} + frameworkResTag = dependencyTag{name: "framework-res"} + sdkDependencyTag = dependencyTag{name: "sdk"} +) +func (j *Module) deps(ctx android.BottomUpMutatorContext) { if !j.properties.No_standard_libraries { - bootClasspath := j.BootClasspath(ctx) - if bootClasspath != "" { - deps = append(deps, bootClasspath) + if ctx.Device() { + switch j.deviceProperties.Sdk_version { + case "": + ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-libart") + case "current": + // TODO: !TARGET_BUILD_APPS + // TODO: export preprocessed framework.aidl from android_stubs_current + ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_stubs_current") + case "system_current": + ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_system_stubs_current") + default: + ctx.AddDependency(ctx.Module(), sdkDependencyTag, "sdk_v"+j.deviceProperties.Sdk_version) + } + } else { + if j.deviceProperties.Dex { + ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-libart") + } } + if ctx.Device() && j.deviceProperties.Sdk_version == "" { - deps = append(deps, config.DefaultLibraries...) + ctx.AddDependency(ctx.Module(), javaLibTag, config.DefaultLibraries...) } } - deps = append(deps, j.properties.Java_libs...) - deps = append(deps, j.properties.Java_static_libs...) - - ctx.AddDependency(ctx.Module(), nil, deps...) + ctx.AddDependency(ctx.Module(), javaLibTag, j.properties.Libs...) + ctx.AddDependency(ctx.Module(), javaStaticLibTag, j.properties.Static_libs...) } func (j *Module) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath, @@ -216,38 +217,48 @@ func (j *Module) collectDeps(ctx android.ModuleContext) (classpath android.Paths ctx.VisitDirectDeps(func(module blueprint.Module) { otherName := ctx.OtherModuleName(module) - if javaDep, ok := module.(JavaDependency); ok { - if otherName == j.BootClasspath(ctx) { - bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile()) - } else if inList(otherName, config.DefaultLibraries) { - classpath = append(classpath, javaDep.ClasspathFile()) - } else if inList(otherName, j.properties.Java_libs) { - classpath = append(classpath, javaDep.ClasspathFile()) - } else if inList(otherName, j.properties.Java_static_libs) { - classpath = append(classpath, javaDep.ClasspathFile()) - classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...) - resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...) - } else if otherName == "framework-res" { - if ctx.ModuleName() == "framework" { - // framework.jar has a one-off dependency on the R.java and Manifest.java files - // generated by framework-res.apk - srcFileLists = append(srcFileLists, module.(*AndroidApp).aaptJavaFileList) - } - } else { - panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName())) + tag := ctx.OtherModuleDependencyTag(module) + + javaDep, _ := module.(JavaDependency) + if javaDep == nil { + switch tag { + case android.DefaultsDepTag, android.SourceDepTag: + default: + ctx.ModuleErrorf("depends on non-java module %q", otherName) } - aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...) - if sdkDep, ok := module.(sdkDependency); ok { - if sdkDep.AidlPreprocessed().Valid() { - if aidlPreprocess.Valid() { - ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q", - aidlPreprocess, sdkDep.AidlPreprocessed()) - } else { - aidlPreprocess = sdkDep.AidlPreprocessed() - } + return + } + + switch tag { + case bootClasspathTag: + bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile()) + case javaLibTag: + classpath = append(classpath, javaDep.ClasspathFile()) + case javaStaticLibTag: + classpath = append(classpath, javaDep.ClasspathFile()) + classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...) + resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...) + case frameworkResTag: + if ctx.ModuleName() == "framework" { + // framework.jar has a one-off dependency on the R.java and Manifest.java files + // generated by framework-res.apk + srcFileLists = append(srcFileLists, module.(*AndroidApp).aaptJavaFileList) + } + case sdkDependencyTag: + sdkDep := module.(sdkDependency) + if sdkDep.AidlPreprocessed().Valid() { + if aidlPreprocess.Valid() { + ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q", + aidlPreprocess, sdkDep.AidlPreprocessed()) + } else { + aidlPreprocess = sdkDep.AidlPreprocessed() } } + default: + panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName())) } + + aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...) }) return classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess, @@ -309,7 +320,7 @@ func (j *Module) compile(ctx android.ModuleContext) { classJarSpecs = append([]jarSpec{classes}, classJarSpecs...) } - resourceJarSpecs = append(ResourceDirsToJarSpecs(ctx, j.properties.Java_resource_dirs, j.properties.Exclude_java_resource_dirs), + resourceJarSpecs = append(ResourceDirsToJarSpecs(ctx, j.properties.Resource_dirs, j.properties.Exclude_resource_dirs), resourceJarSpecs...) manifest := android.OptionalPathForModuleSrc(ctx, j.properties.Manifest) @@ -500,28 +511,23 @@ func JavaBinaryHostFactory() android.Module { // Java prebuilts // -type javaPrebuiltProperties struct { - Srcs []string -} - type JavaPrebuilt struct { android.ModuleBase - - properties javaPrebuiltProperties + prebuilt android.Prebuilt classpathFile android.Path classJarSpecs, resourceJarSpecs []jarSpec } +func (j *JavaPrebuilt) Prebuilt() *android.Prebuilt { + return &j.prebuilt +} + func (j *JavaPrebuilt) DepsMutator(ctx android.BottomUpMutatorContext) { } func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { - if len(j.properties.Srcs) != 1 { - ctx.ModuleErrorf("expected exactly one jar in srcs") - return - } - prebuilt := android.PathForModuleSrc(ctx, j.properties.Srcs[0]) + prebuilt := j.prebuilt.Path(ctx) classJarSpec, resourceJarSpec := TransformPrebuiltJarToClasses(ctx, prebuilt) @@ -552,7 +558,7 @@ func (j *JavaPrebuilt) AidlIncludeDirs() android.Paths { func JavaPrebuiltFactory() android.Module { module := &JavaPrebuilt{} - module.AddProperties(&module.properties) + module.AddProperties(&module.prebuilt.Properties) android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) return module @@ -595,7 +601,7 @@ func SdkPrebuiltFactory() android.Module { module := &sdkPrebuilt{} module.AddProperties( - &module.properties, + &module.prebuilt.Properties, &module.sdkProperties) android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) diff --git a/java/java_test.go b/java/java_test.go new file mode 100644 index 00000000..bd6451cb --- /dev/null +++ b/java/java_test.go @@ -0,0 +1,240 @@ +// Copyright 2017 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package java + +import ( + "android/soong/android" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" +) + +var buildDir string + +func setUp() { + var err error + buildDir, err = ioutil.TempDir("", "soong_java_test") + if err != nil { + panic(err) + } +} + +func tearDown() { + os.RemoveAll(buildDir) +} + +func TestMain(m *testing.M) { + run := func() int { + setUp() + defer tearDown() + + return m.Run() + } + + os.Exit(run()) +} + +func testJava(t *testing.T, bp string) *android.TestContext { + config := android.TestConfig(buildDir) + + ctx := android.NewTestContext() + ctx.RegisterModuleType("android_app", android.ModuleFactoryAdaptor(AndroidAppFactory)) + ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(JavaLibraryFactory)) + ctx.RegisterModuleType("java_prebuilt_library", android.ModuleFactoryAdaptor(JavaPrebuiltFactory)) + ctx.Register() + + extraModules := []string{"core-libart", "frameworks", "sdk_v14"} + + for _, extra := range extraModules { + bp += fmt.Sprintf(` + java_library { + name: "%s", + no_standard_libraries: true, + } + `, extra) + } + + ctx.MockFileSystem(map[string][]byte{ + "Android.bp": []byte(bp), + "a.java": nil, + "b.java": nil, + "c.java": nil, + "a.jar": nil, + "b.jar": nil, + }) + + _, errs := ctx.ParseBlueprintsFiles("Android.bp") + fail(t, errs) + _, errs = ctx.PrepareBuildActions(config) + fail(t, errs) + + return ctx +} + +func TestSimple(t *testing.T) { + ctx := testJava(t, ` + java_library { + name: "foo", + srcs: ["a.java"], + libs: ["bar"], + static_libs: ["baz"], + } + + java_library { + name: "bar", + srcs: ["b.java"], + } + + java_library { + name: "baz", + srcs: ["c.java"], + } + `) + + javac := ctx.ModuleForTests("foo", "").Rule("javac") + jar := ctx.ModuleForTests("foo", "").Rule("jar") + + if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" { + t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs) + } + + bar := filepath.Join(buildDir, ".intermediates", "bar", "classes-full-debug.jar") + if !strings.Contains(javac.Args["classpath"], bar) { + t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar) + } + + baz := filepath.Join(buildDir, ".intermediates", "baz", "classes.list") + if !strings.Contains(jar.Args["jarArgs"], baz) { + t.Errorf("foo jarArgs %v does not contain %q", jar.Args["jarArgs"], baz) + } +} + +func TestSdk(t *testing.T) { + ctx := testJava(t, ` + java_library { + name: "foo1", + srcs: ["a.java"], + } + + java_library { + name: "foo2", + srcs: ["a.java"], + sdk_version: "", + } + + java_library { + name: "foo3", + srcs: ["a.java"], + sdk_version: "14", + } + + java_library { + name: "foo4", + srcs: ["a.java"], + sdk_version: "current", + } + + java_library { + name: "foo5", + srcs: ["a.java"], + sdk_version: "system_current", + } + + java_library { + name: "foo6", + srcs: ["a.java"], + sdk_version: "test_current", + } + `) + + type depType int + const ( + staticLib = iota + classpathLib + bootclasspathLib + ) + + check := func(module, dep string, depType depType) { + if dep != "" { + dep = filepath.Join(buildDir, ".intermediates", dep, "classes-full-debug.jar") + } + + javac := ctx.ModuleForTests(module, "").Rule("javac") + + if depType == bootclasspathLib { + got := strings.TrimPrefix(javac.Args["bootClasspath"], "-bootclasspath ") + if got != dep { + t.Errorf("module %q bootclasspath %q != %q", module, got, dep) + } + } else if depType == classpathLib { + got := strings.TrimPrefix(javac.Args["classpath"], "-classpath ") + if got != dep { + t.Errorf("module %q classpath %q != %q", module, got, dep) + } + } + + if len(javac.Implicits) != 1 || javac.Implicits[0].String() != dep { + t.Errorf("module %q implicits != [%q]", dep) + } + } + + check("foo1", "core-libart", bootclasspathLib) +} + +func TestPrebuilts(t *testing.T) { + ctx := testJava(t, ` + java_library { + name: "foo", + srcs: ["a.java"], + libs: ["bar"], + static_libs: ["baz"], + } + + java_prebuilt_library { + name: "bar", + srcs: ["a.jar"], + } + + java_prebuilt_library { + name: "baz", + srcs: ["b.jar"], + } + `) + + javac := ctx.ModuleForTests("foo", "").Rule("javac") + jar := ctx.ModuleForTests("foo", "").Rule("jar") + + bar := "a.jar" + if !strings.Contains(javac.Args["classpath"], bar) { + t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar) + } + + baz := filepath.Join(buildDir, ".intermediates", "baz", "extracted", "classes.list") + if !strings.Contains(jar.Args["jarArgs"], baz) { + t.Errorf("foo jarArgs %v does not contain %q", jar.Args["jarArgs"], baz) + } +} + +func fail(t *testing.T, errs []error) { + if len(errs) > 0 { + for _, err := range errs { + t.Error(err) + } + t.FailNow() + } +} |