Fix check for srcs-less android_* rules In android rules with no srcs, deps are treated like exports by strict java deps. This fixes the check for srcs-less targets to consider srcjars in addition to .java files. This bug was fixed for java_* rules by adding the runtime_deps attribute, and disallowing deps in srcs-less rules. -- MOS_MIGRATED_REVID=101581572
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index c694cce..6117d58 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -507,8 +507,12 @@ transitiveSourceJars = javaCommon.collectTransitiveSourceJars(srcJar); if (collectJavaCompilationArgs) { - this.javaCompilationArgs = collectJavaCompilationArgs( - ruleContext, exportDeps, asNeverLink, attributes.hasSourceFiles()); + boolean includeSrcjars = + ruleContext.getFragment(AndroidConfiguration.class).treatSrcjarsAsSrcsForStrictDeps(); + boolean hasSources = + attributes.hasSourceFiles() || (includeSrcjars && attributes.hasSourceJars()); + this.javaCompilationArgs = + collectJavaCompilationArgs(ruleContext, exportDeps, asNeverLink, hasSources); this.recursiveJavaCompilationArgs = collectJavaCompilationArgs( ruleContext, true, asNeverLink, /* hasSources */ true); }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index a472310..c74baa9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
@@ -162,6 +162,16 @@ help = "Enables sanity checks for Jack and Jill compilation.") public boolean jackSanityChecks; + // TODO(cushon): enable by default, then delete the flag + @Option( + name = "treat_srcjars_as_srcs_for_strict_deps", + defaultValue = "false", + category = "semantics", + help = "Causes deps of android_library rules with .srcjars (but no Java srcs)" + + " to be promoted to exports." + ) + public boolean treatSrcjarsAsSrcsForStrictDeps; + @Override public void addAllLabels(Multimap<String, Label> labelMap) { if (proguard != null) { @@ -249,6 +259,7 @@ private final Label proguard; private final boolean useJackForDexing; private final boolean jackSanityChecks; + private final boolean treatSrcjarsAsSrcsForStrictDeps; AndroidConfiguration(Options options) { this.sdk = options.realSdk(); @@ -261,6 +272,7 @@ this.proguard = options.proguard; this.useJackForDexing = options.useJackForDexing; this.jackSanityChecks = options.jackSanityChecks; + this.treatSrcjarsAsSrcsForStrictDeps = options.treatSrcjarsAsSrcsForStrictDeps; } public String getCpu() { @@ -298,6 +310,14 @@ return jackSanityChecks; } + /** + * Returns true if srcjars should be treated as sources when deciding to promote + * deps to exports for Strict Java Deps. + */ + public boolean treatSrcjarsAsSrcsForStrictDeps() { + return treatSrcjarsAsSrcsForStrictDeps; + } + public boolean useIncrementalNativeLibs() { return incrementalNativeLibs; }