Merge "Pass along local resource fraction to reproxy"
diff --git a/android/bazel.go b/android/bazel.go
index 9f38c3b..99cc30c 100644
--- a/android/bazel.go
+++ b/android/bazel.go
@@ -236,6 +236,8 @@
// Configure modules in these directories to enable bp2build_available: true or false by default.
bp2buildDefaultConfig = Bp2BuildConfig{
"art/libdexfile": Bp2BuildDefaultTrueRecursively,
+ "art/runtime": Bp2BuildDefaultTrueRecursively,
+ "art/tools": Bp2BuildDefaultTrue,
"bionic": Bp2BuildDefaultTrueRecursively,
"bootable/recovery/tools/recovery_l10n": Bp2BuildDefaultTrue,
"build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively,
@@ -245,6 +247,7 @@
"build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir
"build/soong/cc/ndkstubgen": Bp2BuildDefaultTrue,
"build/soong/cc/symbolfile": Bp2BuildDefaultTrue,
+ "build/soong/linkerconfig": Bp2BuildDefaultTrueRecursively,
"build/soong/scripts": Bp2BuildDefaultTrueRecursively,
"cts/common/device-side/nativetesthelper/jni": Bp2BuildDefaultTrueRecursively,
"development/apps/DevelopmentSettings": Bp2BuildDefaultTrue,
@@ -323,6 +326,7 @@
"packages/apps/DevCamera": Bp2BuildDefaultTrue,
"packages/apps/HTMLViewer": Bp2BuildDefaultTrue,
"packages/apps/Protips": Bp2BuildDefaultTrue,
+ "packages/modules/StatsD/lib/libstatssocket": Bp2BuildDefaultTrueRecursively,
"packages/modules/adb": Bp2BuildDefaultTrue,
"packages/modules/adb/apex": Bp2BuildDefaultTrue,
"packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively,
@@ -336,6 +340,8 @@
"packages/services/Car/tests/SampleRearViewCamera": Bp2BuildDefaultTrue,
"prebuilts/clang/host/linux-x86": Bp2BuildDefaultTrueRecursively,
"system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures
+ "system/apex/proto": Bp2BuildDefaultTrueRecursively,
+ "system/apex/libs": Bp2BuildDefaultTrueRecursively,
"system/core/debuggerd": Bp2BuildDefaultTrueRecursively,
"system/core/diagnose_usb": Bp2BuildDefaultTrueRecursively,
"system/core/libasyncio": Bp2BuildDefaultTrue,
@@ -364,6 +370,16 @@
// Per-module denylist to always opt modules out of both bp2build and mixed builds.
bp2buildModuleDoNotConvertList = []string{
+ "libnativehelper_compat_libc", // Broken compile: implicit declaration of function 'strerror_r' is invalid in C99
+
+ "libart", // depends on unconverted modules: art_operator_srcs, libodrstatslog, libelffile, art_cmdlineparser_headers, cpp-define-generator-definitions, libcpu_features, libdexfile, libartpalette, libbacktrace, libnativebridge, libnativeloader, libsigchain, libunwindstack, libartbase, libprofile, cpp-define-generator-asm-support, apex-info-list-tinyxml, libtinyxml2, libnativeloader-headers, libstatssocket, heapprofd_client_api
+ "libart-runtime-gtest", // depends on unconverted modules: libgtest_isolated, libart-compiler, libdexfile, libprofile, libartbase, libbacktrace, libartbase-art-gtest
+ "libart_headers", // depends on unconverted modules: art_libartbase_headers
+ "libartd", // depends on unconverted modules: apex-info-list-tinyxml, libtinyxml2, libnativeloader-headers, libstatssocket, heapprofd_client_api, art_operator_srcs, libodrstatslog, libelffiled, art_cmdlineparser_headers, cpp-define-generator-definitions, libcpu_features, libdexfiled, libartpalette, libbacktrace, libnativebridge, libnativeloader, libsigchain, libunwindstack, libartbased, libprofiled, cpp-define-generator-asm-support
+ "libartd-runtime-gtest", // depends on unconverted modules: libgtest_isolated, libartd-compiler, libdexfiled, libprofiled, libartbased, libbacktrace, libartbased-art-gtest
+ "libstatslog_art", // depends on unconverted modules: statslog_art.cpp, statslog_art.h
+ "statslog_art.h", "statslog_art.cpp", // depends on unconverted modules: stats-log-api-gen
+
"libandroid_runtime_lazy", // depends on unconverted modules: libbinder_headers
"libcmd", // depends on unconverted modules: libbinder
@@ -403,22 +419,23 @@
"libdebuggerd", // depends on unconverted modules libdexfile_support, libunwindstack, gwp_asan_crash_handler, libtombstone_proto, libprotobuf-cpp-lite
"libdexfile_static", // depends on libartpalette, libartbase, libdexfile, which are of unsupported type: art_cc_library.
- "host_bionic_linker_asm", // depends on extract_linker, a go binary.
- "host_bionic_linker_script", // depends on extract_linker, a go binary.
- "static_crasher", // depends on unconverted modules: libdebuggerd_handler
+ "static_crasher", // depends on unconverted modules: libdebuggerd_handler
"pbtombstone", "crash_dump", // depends on libdebuggerd, libunwindstack
"libbase_ndk", // http://b/186826477, fails to link libctscamera2_jni for device (required for CtsCameraTestCases)
- "libprotobuf-python", // contains .proto sources
"libprotobuf-internal-protos", // b/210751803, we don't handle path property for filegroups
"libprotobuf-internal-python-srcs", // b/210751803, we don't handle path property for filegroups
"libprotobuf-java-full", // b/210751803, we don't handle path property for filegroups
"libprotobuf-java-util-full", // b/210751803, we don't handle path property for filegroups
"conscrypt", // b/210751803, we don't handle path property for filegroups
- "conv_linker_config", // depends on linker_config_proto, a python lib with proto sources
+ // python protos
+ "libprotobuf-python", // contains .proto sources
+ "conv_linker_config", // depends on linker_config_proto, a python lib with proto sources
+ "apex_build_info_proto", "apex_manifest_proto", // a python lib with proto sources
+ "linker_config_proto", // contains .proto sources
"brotli-fuzzer-corpus", // b/202015218: outputs are in location incompatible with bazel genrule handling.
@@ -448,6 +465,11 @@
"libdexfile", // depends on unconverted modules: dexfile_operator_srcs, libartbase, libartpalette,
"libdexfiled", // depends on unconverted modules: dexfile_operator_srcs, libartbased, libartpalette
+
+ // go deps:
+ "apex-protos", // depends on unconverted modules: soong_zip
+ "host_bionic_linker_asm", // depends on extract_linker, a go binary.
+ "host_bionic_linker_script", // depends on extract_linker, a go binary.
}
// Per-module denylist of cc_library modules to only generate the static
diff --git a/android/bazel_paths.go b/android/bazel_paths.go
index 62e6156..f353a9d 100644
--- a/android/bazel_paths.go
+++ b/android/bazel_paths.go
@@ -92,6 +92,7 @@
GetDirectDep(name string) (blueprint.Module, blueprint.DependencyTag)
ModuleFromName(name string) (blueprint.Module, bool)
AddUnconvertedBp2buildDep(string)
+ AddMissingBp2buildDep(dep string)
}
// BazelLabelForModuleDeps expects a list of reference to other modules, ("<module>"
@@ -129,8 +130,10 @@
}
if m, t := SrcIsModuleWithTag(module); m != "" {
l := getOtherModuleLabel(ctx, m, t, moduleToLabelFn)
- l.OriginalModuleName = bpText
- labels.Includes = append(labels.Includes, l)
+ if l != nil {
+ l.OriginalModuleName = bpText
+ labels.Includes = append(labels.Includes, *l)
+ }
} else {
ctx.ModuleErrorf("%q, is not a module reference", module)
}
@@ -157,11 +160,17 @@
}
func BazelLabelForModuleSrcSingle(ctx BazelConversionPathContext, path string) bazel.Label {
- return BazelLabelForModuleSrcExcludes(ctx, []string{path}, []string(nil)).Includes[0]
+ if srcs := BazelLabelForModuleSrcExcludes(ctx, []string{path}, []string(nil)).Includes; len(srcs) > 0 {
+ return srcs[0]
+ }
+ return bazel.Label{}
}
func BazelLabelForModuleDepSingle(ctx BazelConversionPathContext, path string) bazel.Label {
- return BazelLabelForModuleDepsExcludes(ctx, []string{path}, []string(nil)).Includes[0]
+ if srcs := BazelLabelForModuleDepsExcludes(ctx, []string{path}, []string(nil)).Includes; len(srcs) > 0 {
+ return srcs[0]
+ }
+ return bazel.Label{}
}
// BazelLabelForModuleSrc expects a list of path (relative to local module directory) and module
@@ -328,9 +337,9 @@
for _, p := range paths {
if m, tag := SrcIsModuleWithTag(p); m != "" {
l := getOtherModuleLabel(ctx, m, tag, BazelModuleLabel)
- if !InList(l.Label, expandedExcludes) {
+ if l != nil && !InList(l.Label, expandedExcludes) {
l.OriginalModuleName = fmt.Sprintf(":%s", m)
- labels.Includes = append(labels.Includes, l)
+ labels.Includes = append(labels.Includes, *l)
}
} else {
var expandedPaths []bazel.Label
@@ -354,10 +363,16 @@
// module. The label will be relative to the current directory if appropriate. The dependency must
// already be resolved by either deps mutator or path deps mutator.
func getOtherModuleLabel(ctx BazelConversionPathContext, dep, tag string,
- labelFromModule func(BazelConversionPathContext, blueprint.Module) string) bazel.Label {
+ labelFromModule func(BazelConversionPathContext, blueprint.Module) string) *bazel.Label {
m, _ := ctx.ModuleFromName(dep)
+ // The module was not found in an Android.bp file, this is often due to:
+ // * a limited manifest
+ // * a required module not being converted from Android.mk
if m == nil {
- panic(fmt.Errorf("No module named %q found, but was a direct dep of %q", dep, ctx.Module().Name()))
+ ctx.AddMissingBp2buildDep(dep)
+ return &bazel.Label{
+ Label: ":" + dep + "__BP2BUILD__MISSING__DEP",
+ }
}
if !convertedToBazel(ctx, m) {
ctx.AddUnconvertedBp2buildDep(dep)
@@ -371,7 +386,7 @@
otherLabel = bazelShortLabel(otherLabel)
}
- return bazel.Label{
+ return &bazel.Label{
Label: otherLabel,
}
}
diff --git a/android/module.go b/android/module.go
index 71027b2..4da201c 100644
--- a/android/module.go
+++ b/android/module.go
@@ -321,6 +321,9 @@
// AddUnconvertedBp2buildDep stores module name of a direct dependency that was not converted via bp2build
AddUnconvertedBp2buildDep(dep string)
+ // AddMissingBp2buildDep stores the module name of a direct dependency that was not found.
+ AddMissingBp2buildDep(dep string)
+
Target() Target
TargetPrimary() bool
@@ -517,6 +520,7 @@
// Bp2buildTargets returns the target(s) generated for Bazel via bp2build for this module
Bp2buildTargets() []bp2buildInfo
GetUnconvertedBp2buildDeps() []string
+ GetMissingBp2buildDeps() []string
BuildParamsForTests() []BuildParams
RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams
@@ -858,6 +862,9 @@
// UnconvertedBp2buildDep stores the module names of direct dependency that were not converted to
// Bazel
UnconvertedBp2buildDeps []string `blueprint:"mutated"`
+
+ // MissingBp2buildDep stores the module names of direct dependency that were not found
+ MissingBp2buildDeps []string `blueprint:"mutated"`
}
// CommonAttributes represents the common Bazel attributes from which properties
@@ -1371,12 +1378,23 @@
*unconvertedDeps = append(*unconvertedDeps, dep)
}
+// AddMissingBp2buildDep stores module name of a dependency that was not found in a Android.bp file.
+func (b *baseModuleContext) AddMissingBp2buildDep(dep string) {
+ missingDeps := &b.Module().base().commonProperties.MissingBp2buildDeps
+ *missingDeps = append(*missingDeps, dep)
+}
+
// GetUnconvertedBp2buildDeps returns the list of module names of this module's direct dependencies that
// were not converted to Bazel.
func (m *ModuleBase) GetUnconvertedBp2buildDeps() []string {
return FirstUniqueStrings(m.commonProperties.UnconvertedBp2buildDeps)
}
+// GetMissingBp2buildDeps eturns the list of module names that were not found in Android.bp files.
+func (m *ModuleBase) GetMissingBp2buildDeps() []string {
+ return FirstUniqueStrings(m.commonProperties.MissingBp2buildDeps)
+}
+
func (m *ModuleBase) AddJSONData(d *map[string]interface{}) {
(*d)["Android"] = map[string]interface{}{
// Properties set in Blueprint or in blueprint of a defaults modules
diff --git a/android/prebuilt.go b/android/prebuilt.go
index ade92f7..5843487 100644
--- a/android/prebuilt.go
+++ b/android/prebuilt.go
@@ -309,6 +309,54 @@
return nil
}
+// PrebuiltGetPreferred returns the module that is preferred for the given
+// module. That is either the module itself or the prebuilt counterpart that has
+// taken its place. The given module must be a direct dependency of the current
+// context module, and it must be the source module if both source and prebuilt
+// exist.
+//
+// This function is for use on dependencies after PrebuiltPostDepsMutator has
+// run - any dependency that is registered before that will already reference
+// the right module. This function is only safe to call after all mutators that
+// may call CreateVariations, e.g. in GenerateAndroidBuildActions.
+func PrebuiltGetPreferred(ctx BaseModuleContext, module Module) Module {
+ if !module.IsReplacedByPrebuilt() {
+ return module
+ }
+ if IsModulePrebuilt(module) {
+ // If we're given a prebuilt then assume there's no source module around.
+ return module
+ }
+
+ sourceModDepFound := false
+ var prebuiltMod Module
+
+ ctx.WalkDeps(func(child, parent Module) bool {
+ if prebuiltMod != nil {
+ return false
+ }
+ if parent == ctx.Module() {
+ // First level: Only recurse if the module is found as a direct dependency.
+ sourceModDepFound = child == module
+ return sourceModDepFound
+ }
+ // Second level: Follow PrebuiltDepTag to the prebuilt.
+ if t := ctx.OtherModuleDependencyTag(child); t == PrebuiltDepTag {
+ prebuiltMod = child
+ }
+ return false
+ })
+
+ if prebuiltMod == nil {
+ if !sourceModDepFound {
+ panic(fmt.Errorf("Failed to find source module as a direct dependency: %s", module))
+ } else {
+ panic(fmt.Errorf("Failed to find prebuilt for source module: %s", module))
+ }
+ }
+ return prebuiltMod
+}
+
func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) {
ctx.BottomUp("prebuilt_rename", PrebuiltRenameMutator).Parallel()
}
diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go
index 54b59af..5887d06 100644
--- a/bp2build/build_conversion.go
+++ b/bp2build/build_conversion.go
@@ -324,6 +324,15 @@
return
}
}
+ if unconvertedDeps := aModule.GetMissingBp2buildDeps(); len(unconvertedDeps) > 0 {
+ msg := fmt.Sprintf("%q depends on missing modules: %s", m.Name(), strings.Join(unconvertedDeps, ", "))
+ if ctx.unconvertedDepMode == warnUnconvertedDeps {
+ metrics.moduleWithMissingDepsMsgs = append(metrics.moduleWithMissingDepsMsgs, msg)
+ } else if ctx.unconvertedDepMode == errorModulesUnconvertedDeps {
+ errs = append(errs, fmt.Errorf(msg))
+ return
+ }
+ }
targets = generateBazelTargets(bpCtx, aModule)
for _, t := range targets {
// A module can potentially generate more than 1 Bazel
diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go
index 1440b6f..b21a477 100644
--- a/bp2build/build_conversion_test.go
+++ b/bp2build/build_conversion_test.go
@@ -301,6 +301,19 @@
},
},
{
+ description: "non-existent dep",
+ blueprint: `custom {
+ name: "has_dep",
+ arch_paths: [":dep"],
+ bazel_module: { bp2build_available: true },
+}`,
+ expectedBazelTargets: []string{
+ makeBazelTarget("custom", "has_dep", attrNameToString{
+ "arch_paths": `[":dep__BP2BUILD__MISSING__DEP"]`,
+ }),
+ },
+ },
+ {
description: "arch-variant srcs",
blueprint: `custom {
name: "arch_paths",
diff --git a/bp2build/metrics.go b/bp2build/metrics.go
index 68ac544..557ea99 100644
--- a/bp2build/metrics.go
+++ b/bp2build/metrics.go
@@ -30,6 +30,10 @@
// NOTE: NOT in the .proto
moduleWithUnconvertedDepsMsgs []string
+ // List of modules with missing deps
+ // NOTE: NOT in the .proto
+ moduleWithMissingDepsMsgs []string
+
// List of converted modules
convertedModules []string
}
@@ -54,13 +58,21 @@
generatedTargetCount += count
}
fmt.Printf(
- "[bp2build] Converted %d Android.bp modules to %d total generated BUILD targets. Included %d handcrafted BUILD targets. There are %d total Android.bp modules.\n%d converted modules have unconverted deps: \n\t%s",
+ `[bp2build] Converted %d Android.bp modules to %d total generated BUILD targets. Included %d handcrafted BUILD targets. There are %d total Android.bp modules.
+%d converted modules have unconverted deps:
+ %s
+%d converted modules have missing deps:
+ %s
+`,
metrics.generatedModuleCount,
generatedTargetCount,
metrics.handCraftedModuleCount,
metrics.TotalModuleCount(),
len(metrics.moduleWithUnconvertedDepsMsgs),
- strings.Join(metrics.moduleWithUnconvertedDepsMsgs, "\n\t"))
+ strings.Join(metrics.moduleWithUnconvertedDepsMsgs, "\n\t"),
+ len(metrics.moduleWithMissingDepsMsgs),
+ strings.Join(metrics.moduleWithMissingDepsMsgs, "\n\t"),
+ )
}
const bp2buildMetricsFilename = "bp2build_metrics.pb"
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 6a91e01..c3e3ba5 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -106,6 +106,16 @@
android.LicenseAnnotationToolchainDependencyTag
label string
}
+
+func (t hostToolDependencyTag) AllowDisabledModuleDependency(target android.Module) bool {
+ // Allow depending on a disabled module if it's replaced by a prebuilt
+ // counterpart. We get the prebuilt through android.PrebuiltGetPreferred in
+ // GenerateAndroidBuildActions.
+ return target.IsReplacedByPrebuilt()
+}
+
+var _ android.AllowDisabledModuleDependency = (*hostToolDependencyTag)(nil)
+
type generatorProperties struct {
// The command to run on one or more input files. Cmd supports substitution of a few variables.
//
@@ -298,6 +308,12 @@
switch tag := ctx.OtherModuleDependencyTag(module).(type) {
case hostToolDependencyTag:
tool := ctx.OtherModuleName(module)
+ if m, ok := module.(android.Module); ok {
+ // Necessary to retrieve any prebuilt replacement for the tool, since
+ // toolDepsMutator runs too late for the prebuilt mutators to have
+ // replaced the dependency.
+ module = android.PrebuiltGetPreferred(ctx, m)
+ }
switch t := module.(type) {
case android.HostToolProvider:
diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go
index 714d2f8..04c97fd 100644
--- a/genrule/genrule_test.go
+++ b/genrule/genrule_test.go
@@ -34,7 +34,9 @@
android.PrepareForTestWithFilegroup,
PrepareForTestWithGenRuleBuildComponents,
android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
+ android.RegisterPrebuiltMutators(ctx)
ctx.RegisterModuleType("tool", toolFactory)
+ ctx.RegisterModuleType("prebuilt_tool", prebuiltToolFactory)
ctx.RegisterModuleType("output", outputProducerFactory)
ctx.RegisterModuleType("use_source", useSourceFactory)
}),
@@ -720,6 +722,69 @@
result.ModuleForTests("gen_all", "").Module().(*useSource).srcs)
}
+func TestPrebuiltTool(t *testing.T) {
+ testcases := []struct {
+ name string
+ bp string
+ expectedToolName string
+ }{
+ {
+ name: "source only",
+ bp: `
+ tool { name: "tool" }
+ `,
+ expectedToolName: "bin/tool",
+ },
+ {
+ name: "prebuilt only",
+ bp: `
+ prebuilt_tool { name: "tool" }
+ `,
+ expectedToolName: "prebuilt_bin/tool",
+ },
+ {
+ name: "source preferred",
+ bp: `
+ tool { name: "tool" }
+ prebuilt_tool { name: "tool" }
+ `,
+ expectedToolName: "bin/tool",
+ },
+ {
+ name: "prebuilt preferred",
+ bp: `
+ tool { name: "tool" }
+ prebuilt_tool { name: "tool", prefer: true }
+ `,
+ expectedToolName: "prebuilt_bin/prebuilt_tool",
+ },
+ {
+ name: "source disabled",
+ bp: `
+ tool { name: "tool", enabled: false }
+ prebuilt_tool { name: "tool" }
+ `,
+ expectedToolName: "prebuilt_bin/prebuilt_tool",
+ },
+ }
+
+ for _, test := range testcases {
+ t.Run(test.name, func(t *testing.T) {
+ result := prepareForGenRuleTest.RunTestWithBp(t, test.bp+`
+ genrule {
+ name: "gen",
+ tools: ["tool"],
+ out: ["foo"],
+ cmd: "$(location tool)",
+ }
+ `)
+ gen := result.Module("gen", "").(*Module)
+ expectedCmd := "__SBOX_SANDBOX_DIR__/tools/out/" + test.expectedToolName
+ android.AssertStringEquals(t, "command", expectedCmd, gen.rawCommands[0])
+ })
+ }
+}
+
func TestGenruleWithBazel(t *testing.T) {
bp := `
genrule {
@@ -764,7 +829,33 @@
return android.OptionalPathForPath(t.outputFile)
}
+type prebuiltTestTool struct {
+ android.ModuleBase
+ prebuilt android.Prebuilt
+ testTool
+}
+
+func (p *prebuiltTestTool) Name() string {
+ return p.prebuilt.Name(p.ModuleBase.Name())
+}
+
+func (p *prebuiltTestTool) Prebuilt() *android.Prebuilt {
+ return &p.prebuilt
+}
+
+func (t *prebuiltTestTool) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ t.outputFile = ctx.InstallFile(android.PathForModuleInstall(ctx, "prebuilt_bin"), ctx.ModuleName(), android.PathForOutput(ctx, ctx.ModuleName()))
+}
+
+func prebuiltToolFactory() android.Module {
+ module := &prebuiltTestTool{}
+ android.InitPrebuiltModuleWithoutSrcs(module)
+ android.InitAndroidArchModule(module, android.HostSupported, android.MultilibFirst)
+ return module
+}
+
var _ android.HostToolProvider = (*testTool)(nil)
+var _ android.HostToolProvider = (*prebuiltTestTool)(nil)
type testOutputProducer struct {
android.ModuleBase
diff --git a/java/app_test.go b/java/app_test.go
index d9667b9..2322ef4 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -2258,10 +2258,33 @@
t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
}
}
-
}
}
+func TestInstrumentationTargetPrebuilt(t *testing.T) {
+ bp := `
+ android_app_import {
+ name: "foo",
+ apk: "foo.apk",
+ presigned: true,
+ }
+
+ android_test {
+ name: "bar",
+ srcs: ["a.java"],
+ instrumentation_for: "foo",
+ sdk_version: "current",
+ }
+ `
+
+ android.GroupFixturePreparers(
+ PrepareForTestWithJavaDefaultModules,
+ ).ExtendWithErrorHandler(
+ android.FixtureExpectsAtLeastOneErrorMatchingPattern(
+ "instrumentation_for: dependency \"foo\" of type \"android_app_import\" does not provide JavaInfo so is unsuitable for use with this property")).
+ RunTestWithBp(t, bp)
+}
+
func TestStl(t *testing.T) {
ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
cc_library {
diff --git a/java/base.go b/java/base.go
index bc8da9a..63328c8 100644
--- a/java/base.go
+++ b/java/base.go
@@ -1945,6 +1945,9 @@
sm := module.(SystemModulesProvider)
outputDir, outputDeps := sm.OutputDirAndDeps()
deps.systemModules = &systemModules{outputDir, outputDeps}
+
+ case instrumentationForTag:
+ ctx.PropertyErrorf("instrumentation_for", "dependency %q of type %q does not provide JavaInfo so is unsuitable for use with this property", ctx.OtherModuleName(module), ctx.OtherModuleType(module))
}
}
diff --git a/sh/sh_binary.go b/sh/sh_binary.go
index b1d1bb2..2ab784d 100644
--- a/sh/sh_binary.go
+++ b/sh/sh_binary.go
@@ -268,6 +268,9 @@
func (s *ShBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
s.generateAndroidBuildActions(ctx)
installDir := android.PathForModuleInstall(ctx, "bin", proptools.String(s.properties.Sub_dir))
+ if !s.Installable() {
+ s.SkipInstall()
+ }
s.installedFile = ctx.InstallExecutable(installDir, s.outputFilePath.Base(), s.outputFilePath)
for _, symlink := range s.Symlinks() {
ctx.InstallSymlink(installDir, symlink, s.installedFile)
@@ -283,6 +286,7 @@
func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
s.customAndroidMkEntries(entries)
entries.SetString("LOCAL_MODULE_RELATIVE_PATH", proptools.String(s.properties.Sub_dir))
+ entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !s.Installable())
},
},
}}