diff options
author | 2017-05-07 11:34:16 -0400 | |
---|---|---|
committer | 2017-05-08 09:49:13 -0400 | |
commit | fefced3743b6fb4f66580687f4cfd656d8bf62b4 (patch) | |
tree | dd6c7c2ff8f6f82f42e08a53910d9ba8b1cbc1a3 /src/main/java/com/google/devtools/build/lib | |
parent | 33876789f80853baa8d4210628aa8eabf6c2513a (diff) |
Make default value of exports_manifest depend on a flag.
RELNOTES: None
PiperOrigin-RevId: 155321388
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
6 files changed, 68 insertions, 35 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLibraryRule.java index a47e806687..45146a5e2b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLibraryRule.java @@ -15,13 +15,14 @@ package com.google.devtools.build.lib.bazel.rules.android; import static com.google.devtools.build.lib.packages.Attribute.attr; -import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; +import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.android.AndroidConfiguration; import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses; @@ -35,8 +36,7 @@ public class BazelAndroidLibraryRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder - .requiresConfigurationFragments( - JavaConfiguration.class, AndroidConfiguration.class) + .requiresConfigurationFragments(JavaConfiguration.class, AndroidConfiguration.class) /* <!-- #BLAZE_RULE(android_library).IMPLICIT_OUTPUTS --> <ul> <li><code>lib<var>name</var>.jar</code>: A Java archive.</li> @@ -47,7 +47,7 @@ public class BazelAndroidLibraryRule implements RuleDefinition { </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS --> */ .setImplicitOutputsFunction(AndroidRuleClasses.ANDROID_LIBRARY_IMPLICIT_OUTPUTS) - .override(attr("exports_manifest", BOOLEAN).value(true)) + .override(attr("exports_manifest", BuildType.TRISTATE).value(TriState.YES)) .build(); } 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 f8aebaefd4..c99c9fa704 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 @@ -41,6 +41,7 @@ import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor; +import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.android.ResourceContainer.ResourceType; import com.google.devtools.build.lib.rules.cpp.CcLinkParams; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; @@ -390,6 +391,24 @@ public class AndroidCommon { return transitiveAarNativeLibs; } + static boolean getExportsManifest(RuleContext ruleContext) { + // AndroidLibraryBaseRule has exports_manifest but AndroidBinaryBaseRule does not. + // ResourceContainers are built for both, so we must check if exports_manifest is present. + if (!ruleContext.attributes().has("exports_manifest", BuildType.TRISTATE)) { + return false; + } + TriState attributeValue = ruleContext.attributes().get("exports_manifest", BuildType.TRISTATE); + + // If the rule does not have the Android configuration fragment, we default to false. + boolean exportsManifestDefault = + ruleContext.isLegalFragment(AndroidConfiguration.class) + && ruleContext + .getFragment(AndroidConfiguration.class) + .getExportsManifestDefault(ruleContext); + return attributeValue == TriState.YES + || (attributeValue == TriState.AUTO && exportsManifestDefault); + } + private void compileResources( JavaSemantics javaSemantics, ResourceApk resourceApk, 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 96b018b8a8..fd0ea7752f 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 @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; +import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.EmptyToNullLabelConverter; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; @@ -516,13 +517,24 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { ) public boolean includeLibraryResourceJars; - @Option(name = "experimental_android_use_nocompress_extensions_on_apk", - defaultValue = "false", - optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED, - help = "Use the value of nocompress_extensions attribute with the SingleJar " - + "--nocompress_suffixes flag when building the APK.") + @Option( + name = "experimental_android_use_nocompress_extensions_on_apk", + defaultValue = "false", + optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED, + help = + "Use the value of nocompress_extensions attribute with the SingleJar " + + "--nocompress_suffixes flag when building the APK." + ) public boolean useNocompressExtensionsOnApk; + @Option( + name = "experimental_android_library_exports_manifest_default", + defaultValue = "false", + optionUsageRestrictions = OptionUsageRestrictions.DOCUMENTED, + help = "The default value of the exports_manifest attribute on android_library." + ) + public boolean exportsManifestDefault; + @Override public void addAllLabels(Multimap<String, Label> labelMap) { if (androidCrosstoolTop != null) { @@ -607,6 +619,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { private final boolean compressJavaResources; private final boolean includeLibraryResourceJars; private final boolean useNocompressExtensionsOnApk; + private final boolean exportsManifestDefault; AndroidConfiguration(Options options, Label androidSdk) throws InvalidConfigurationException { this.sdk = androidSdk; @@ -638,6 +651,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { this.compressJavaResources = options.compressJavaResources; this.includeLibraryResourceJars = options.includeLibraryResourceJars; this.useNocompressExtensionsOnApk = options.useNocompressExtensionsOnApk; + this.exportsManifestDefault = options.exportsManifestDefault; if (!dexoptsSupportedInIncrementalDexing.contains("--no-locals")) { // TODO(bazel-team): Still needed? See DexArchiveAspect @@ -750,6 +764,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { return useNocompressExtensionsOnApk; } + boolean getExportsManifestDefault(RuleContext ruleContext) { + return exportsManifestDefault; + } + @Override public void addGlobalMakeVariables(ImmutableMap.Builder<String, String> globalMakeEnvBuilder) { globalMakeEnvBuilder.put("ANDROID_CPU", cpu); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index 0648e10f40..eae1f2dfb4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -36,7 +36,6 @@ import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; import com.google.devtools.build.lib.rules.java.ProguardLibrary; import com.google.devtools.build.lib.rules.java.ProguardSpecProvider; -import com.google.devtools.build.lib.syntax.Type; /** * An implementation for the "android_library" rule. @@ -163,15 +162,16 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { String javaPackage = AndroidCommon.getJavaPackage(ruleContext); - ResourceContainer resourceContainer = ResourceContainer.builder() - .setLabel(ruleContext.getLabel()) - .setJavaPackageFromString(javaPackage) - .setManifest(applicationManifest.getManifest()) - .setJavaSourceJar( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) - .setManifestExported(ruleContext.attributes().get("exports_manifest", Type.BOOLEAN)) - .setRTxt(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) - .build(); + ResourceContainer resourceContainer = + ResourceContainer.builder() + .setLabel(ruleContext.getLabel()) + .setJavaPackageFromString(javaPackage) + .setManifest(applicationManifest.getManifest()) + .setJavaSourceJar( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) + .setManifestExported(AndroidCommon.getExportsManifest(ruleContext)) + .setRTxt(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT)) + .build(); primaryResources = new AndroidResourcesProcessorBuilder(ruleContext) .setLibrary(true) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java index a8a589bc6c..1badc11f0d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java @@ -17,6 +17,7 @@ import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTran import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; +import static com.google.devtools.build.lib.packages.BuildType.TRISTATE; import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import static com.google.devtools.build.lib.syntax.Type.STRING; @@ -24,6 +25,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; +import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidAaptBaseRule; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidBaseRule; import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidResourceSupportRule; @@ -78,9 +80,9 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { for the Android target platform. <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ .override(builder.copy("deps") - .allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES) - .allowedFileTypes() - .aspect(androidNeverlinkAspect)) + .allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES) + .allowedFileTypes() + .aspect(androidNeverlinkAspect)) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports) --> The closure of all rules reached via <code>exports</code> attributes are considered direct dependencies of any rule that directly depends on the @@ -89,13 +91,13 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ .add(attr("exports", LABEL_LIST) .allowedRuleClasses(AndroidRuleClasses.ALLOWED_DEPENDENCIES) - .allowedFileTypes(/*May not have files in exports!*/) + .allowedFileTypes(/*May not have files in exports!*/ ) .aspect(androidNeverlinkAspect)) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exports_manifest) --> Whether to export manifest entries to <code>android_binary</code> targets that depend on this target. <code>uses-permissions</code> attributes are never exported. <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ - .add(attr("exports_manifest", BOOLEAN).value(false)) + .add(attr("exports_manifest", TRISTATE).value(TriState.AUTO)) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(exported_plugins) --> The list of <code><a href="#${link java_plugin}">java_plugin</a></code>s (e.g. annotation processors) to export to libraries that directly depend on this library. @@ -106,7 +108,7 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { </p> <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ .add(attr("exported_plugins", LABEL_LIST).cfg(HOST).allowedRuleClasses("java_plugin") - .allowedFileTypes(FileTypeSet.NO_FILE)) + .allowedFileTypes(FileTypeSet.NO_FILE)) .add(attr("alwayslink", BOOLEAN).undocumented("purely informational for now")) /* <!-- #BLAZE_RULE(android_library).ATTRIBUTE(neverlink) --> Only use this library for compilation and not at runtime. @@ -156,7 +158,8 @@ public final class AndroidLibraryBaseRule implements RuleDefinition { See <a href="${link android_library.idl_import_root}">the description of idl_import_root</a> for information about what this means.</p> <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ - .add(attr("idl_parcelables", LABEL_LIST).direct_compile_time_input() + .add(attr("idl_parcelables", LABEL_LIST) + .direct_compile_time_input() .allowedFileTypes(AndroidRuleClasses.ANDROID_IDL)) .add(attr("$android_manifest_merge_tool", LABEL).cfg(HOST).exec().value( env.getToolsLabel(AndroidRuleClasses.MANIFEST_MERGE_TOOL_LABEL))) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java index a24d77d333..d66961b48d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainer.java @@ -124,7 +124,7 @@ public abstract class ResourceContainer { /** Converts this container back into a builder to create a modified copy. */ public abstract Builder toBuilder(); - + /** * Returns a copy of this container with filtered resources. The original container is unchanged. */ @@ -181,7 +181,7 @@ public abstract class ResourceContainer { .setJavaSourceJar( ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR)) .setJavaPackageFrom(JavaPackageSource.SOURCE_JAR_PATH) - .setManifestExported(getExportsManifest(ruleContext)); + .setManifestExported(AndroidCommon.getExportsManifest(ruleContext)); } /** @@ -311,13 +311,6 @@ public abstract class ResourceContainer { return ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package"); } - private static boolean getExportsManifest(RuleContext ruleContext) { - // AndroidLibraryBaseRule has exports_manifest but AndroidBinaryBaseRule does not. - // ResourceContainers are built for both, so we must check if exports_manifest is present. - return ruleContext.attributes().has("exports_manifest", Type.BOOLEAN) - && ruleContext.attributes().get("exports_manifest", Type.BOOLEAN); - } - @Nullable private static String getRenameManifestPackage(RuleContext ruleContext) { return ruleContext.attributes().isAttributeValueExplicitlySpecified("rename_manifest_package") |