aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-07-20 07:26:18 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-07-20 07:26:18 +0000
commit34bc1f7e95861ca17e0fe71ced6c6ce0dbd4c7b3 (patch)
tree837acd164d13e867c3c84792cfc86b71a3e32ae1
parent10e92df42b9cafff1f7d14496c05c87ed229ec44 (diff)
parent2c44fdf8a2a0434b71cbd9a37e44b20766e6a559 (diff)
downloadsoong-34bc1f7e95861ca17e0fe71ced6c6ce0dbd4c7b3.tar.gz
release-request-d8901a87-7dd0-4cc8-a44e-d04982e429da-for-git_oc-mr1-release-4198291 snap-temp-L50900000084068812
Change-Id: I9bfbc9d96dc8305dbaf849aae9f692f9000b3e70
-rw-r--r--Android.bp3
-rw-r--r--android/defaults.go34
-rw-r--r--androidmk/cmd/androidmk/android.go6
-rw-r--r--cc/cc.go8
-rw-r--r--cc/llndk_library.go5
-rw-r--r--cc/ndk_library.go31
-rw-r--r--java/app.go5
-rw-r--r--java/java.go166
-rw-r--r--java/java_test.go240
9 files changed, 380 insertions, 118 deletions
diff --git a/Android.bp b/Android.bp
index 68b379c50..82be0fa65 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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 84f0a3dbd..3ec3ff42f 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 78395c338..194b2c93e 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",
diff --git a/cc/cc.go b/cc/cc.go
index 8fc0ebdf3..3824a3be0 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -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 66ffc9fe7..c3d3462bb 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 5765aa92a..dbfc5be3c 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 2f2b899d1..fccd3823a 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 adb3d7bdb..3d2e96094 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 000000000..bd6451cb8
--- /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()
+ }
+}