aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-09-21 12:51:47 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-21 13:53:58 +0000
commit13f9150e7706ad226831b52981cb0b7c76678b7b (patch)
treee27c2efd8e0a86281ed56bbae0c92b8bdd2db0a5 /src/main/java/com/google/devtools/build/lib/rules
parent45d18d4c93ca25d787c2cab41469a41bc807df59 (diff)
Unify AndroidLibrary code paths.
There were 2-3 code paths taken depending on whether resources are defined or not. These contained a lot of duplication. This CL factors out the similarities. -- MOS_MIGRATED_REVID=103538550
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java267
1 files changed, 109 insertions, 158 deletions
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 dad95631dd..6ab6579f7c 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
@@ -75,16 +75,20 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
NestedSet<Artifact> transitiveProguardConfigs =
collectTransitiveProguardConfigs(ruleContext);
AndroidIdlProvider transitiveIdlImportData = collectTransitiveIdlImports(ruleContext);
- if (LocalResourceContainer.definesAndroidResources(ruleContext.attributes())) {
- try {
- if (!LocalResourceContainer.validateRuleContext(ruleContext)) {
- throw new RuleConfigurationException();
- }
- JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics);
- AndroidCommon androidCommon = new AndroidCommon(ruleContext, javaCommon);
+ JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics);
+ AndroidCommon androidCommon = new AndroidCommon(ruleContext, javaCommon);
- ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext);
- ResourceApk resourceApk = applicationManifest.packWithDataAndResources(
+ boolean definesLocalResources =
+ LocalResourceContainer.definesAndroidResources(ruleContext.attributes());
+ if (definesLocalResources && !LocalResourceContainer.validateRuleContext(ruleContext)) {
+ return null;
+ }
+
+ final ResourceApk resourceApk;
+ if (definesLocalResources) {
+ ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext);
+ try {
+ resourceApk = applicationManifest.packWithDataAndResources(
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK),
ruleContext, transitiveResources,
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT),
@@ -97,168 +101,115 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
null /* versionName */,
false,
null /* proguardCfgOut */);
-
- JavaTargetAttributes javaTargetAttributes = androidCommon.init(
- javaSemantics,
- androidSemantics,
- resourceApk,
- transitiveIdlImportData,
- false /* addCoverageSupport */,
- true /* collectJavaCompilationArgs */,
- AndroidRuleClasses.ANDROID_LIBRARY_GEN_JAR);
- if (javaTargetAttributes == null) {
- return null;
- }
-
- Artifact classesJar = mergeJarsFromSrcs(ruleContext,
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR));
-
- Artifact aarOut = ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_LIBRARY_AAR);
-
- new AarGeneratorBuilder(ruleContext)
- .withPrimary(resourceApk.getPrimaryResource())
- .withManifest(resourceApk.getPrimaryResource().getManifest())
- .withRtxt(resourceApk.getPrimaryResource().getRTxt())
- .withClasses(classesJar)
- .strictResourceMerging()
- .setAAROut(aarOut)
- .build(ruleContext);
-
- Aar aar = new Aar(aarOut, applicationManifest.getManifest());
-
- RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
- androidCommon.addTransitiveInfoProviders(builder);
- androidSemantics.addTransitiveInfoProviders(
- builder, ruleContext, javaCommon, androidCommon,
- null, resourceApk, null, ImmutableList.<Artifact>of());
-
- return builder
- .add(AndroidNativeLibraryProvider.class,
- new AndroidNativeLibraryProvider(transitiveNativeLibraries))
- .add(JavaSourceJarsProvider.class, new JavaSourceJarsProvider(
- androidCommon.getTransitiveSourceJars(),
- androidCommon.getTopLevelSourceJars()))
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
- .add(JavaNeverlinkInfoProvider.class,
- new JavaNeverlinkInfoProvider(androidCommon.isNeverLink()))
- .add(AndroidCcLinkParamsProvider.class,
- new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore()))
- .add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs))
- .add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(aar,
- transitiveAars.add(aar).build()))
- .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs)
- .build();
} catch (RuleConfigurationException e) {
// RuleConfigurations exceptions will only be thrown after the RuleContext is updated.
// So, exit.
return null;
}
} else {
- JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics);
- AndroidCommon androidCommon = new AndroidCommon(ruleContext, javaCommon);
- ResourceApk resourceApk = ResourceApk.fromTransitiveResources(transitiveResources);
-
- JavaTargetAttributes javaTargetAttributes = androidCommon.init(
- javaSemantics,
- androidSemantics,
- resourceApk,
- transitiveIdlImportData,
- false /* addCoverageSupport */,
- true /* collectJavaCompilationArgs */,
- AndroidRuleClasses.ANDROID_LIBRARY_GEN_JAR);
- if (javaTargetAttributes == null) {
- return null;
- }
+ resourceApk = ResourceApk.fromTransitiveResources(transitiveResources);
+ }
- RuleConfiguredTargetBuilder targetBuilder = androidCommon.addTransitiveInfoProviders(
- new RuleConfiguredTargetBuilder(ruleContext));
-
- androidSemantics.addTransitiveInfoProviders(
- targetBuilder, ruleContext, javaCommon, androidCommon,
- null, null, null, ImmutableList.<Artifact>of());
- targetBuilder
- .add(AndroidNativeLibraryProvider.class,
- new AndroidNativeLibraryProvider(transitiveNativeLibraries))
- .add(JavaSourceJarsProvider.class, androidCommon.getJavaSourceJarsProvider())
- .add(AndroidCcLinkParamsProvider.class,
- new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore()))
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
- .add(JavaNeverlinkInfoProvider.class,
- new JavaNeverlinkInfoProvider(androidCommon.isNeverLink()))
- .add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs))
- .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs);
-
- Artifact aarOut = ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_LIBRARY_AAR);
-
- Artifact classesJar = mergeJarsFromSrcs(ruleContext,
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR));
-
- ResourceContainer primaryResources;
-
- if (AndroidCommon.getAndroidResources(ruleContext) != null) {
- primaryResources = Iterables.getOnlyElement(
- AndroidCommon.getAndroidResources(ruleContext).getTransitiveAndroidResources());
-
- Aar aar = new Aar(aarOut, primaryResources.getManifest());
- targetBuilder.add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(
- aar, transitiveAars.add(aar).build()));
- } else {
- // there are no local resources and resources attribute was not specified either
- ApplicationManifest applicationManifest =
- ApplicationManifest.generatedManifest(ruleContext);
+ JavaTargetAttributes javaTargetAttributes = androidCommon.init(
+ javaSemantics,
+ androidSemantics,
+ resourceApk,
+ transitiveIdlImportData,
+ false /* addCoverageSupport */,
+ true /* collectJavaCompilationArgs */,
+ AndroidRuleClasses.ANDROID_LIBRARY_GEN_JAR);
+ if (javaTargetAttributes == null) {
+ return null;
+ }
- Artifact apk = ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_RESOURCES_APK);
+ Artifact classesJar = mergeJarsFromSrcs(ruleContext,
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR));
+ Artifact aarOut = ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_LIBRARY_AAR);
+
+ final ResourceContainer primaryResources;
+ final Aar aar;
+ if (definesLocalResources) {
+ primaryResources = resourceApk.getPrimaryResource();
+ ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext);
+ aar = new Aar(aarOut, applicationManifest.getManifest());
+ transitiveAars.add(aar);
+ } else if (AndroidCommon.getAndroidResources(ruleContext) != null) {
+ primaryResources = Iterables.getOnlyElement(
+ AndroidCommon.getAndroidResources(ruleContext).getTransitiveAndroidResources());
+ aar = new Aar(aarOut, primaryResources.getManifest());
+ transitiveAars.add(aar);
+ } else {
+ // there are no local resources and resources attribute was not specified either
+ aar = null;
+ ApplicationManifest applicationManifest = ApplicationManifest.generatedManifest(ruleContext);
- String javaPackage;
- if (apk.getExecPath().getFirstSegment(ImmutableSet.of("java", "javatests"))
- != PathFragment.INVALID_SEGMENT) {
- javaPackage = JavaUtil.getJavaPackageName(apk.getExecPath());
- } else {
- // This is a workaround for libraries that don't follow the standard Bazel package format
- javaPackage = apk.getRootRelativePath().getPathString().replace('/', '.');
- }
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package")) {
- javaPackage = ruleContext.attributes().get("custom_package", Type.STRING);
- }
+ Artifact apk = ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_RESOURCES_APK);
- primaryResources = new ResourceContainer(ruleContext.getLabel(),
- javaPackage, null /* renameManifestPackage */, false /* inlinedConstants */,
- apk, applicationManifest.getManifest(),
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR),
- ImmutableList.<Artifact>of(), ImmutableList.<Artifact>of(),
- ImmutableList.<PathFragment>of(), ImmutableList.<PathFragment>of(),
- ruleContext.attributes().get("exports_manifest", Type.BOOLEAN),
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), null);
-
- primaryResources = new AndroidResourcesProcessorBuilder(ruleContext)
- .setApkOut(apk)
- .setRTxtOut(primaryResources.getRTxt())
- .setSourceJarOut(primaryResources.getJavaSourceJar())
- .setJavaPackage(primaryResources.getJavaPackage())
- .withPrimary(primaryResources)
- .withDependencies(transitiveResources)
- .setDebug(
- ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
- .setWorkingDirectory(ruleContext.getUniqueDirectory("_resources"))
- .build(ruleContext);
-
- targetBuilder.add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(
- null, transitiveAars.build()));
+ String javaPackage;
+ if (apk.getExecPath().getFirstSegment(ImmutableSet.of("java", "javatests"))
+ != PathFragment.INVALID_SEGMENT) {
+ javaPackage = JavaUtil.getJavaPackageName(apk.getExecPath());
+ } else {
+ // This is a workaround for libraries that don't follow the standard Bazel package format
+ javaPackage = apk.getRootRelativePath().getPathString().replace('/', '.');
+ }
+ if (ruleContext.attributes().isAttributeValueExplicitlySpecified("custom_package")) {
+ javaPackage = ruleContext.attributes().get("custom_package", Type.STRING);
}
- new AarGeneratorBuilder(ruleContext)
- .withPrimary(primaryResources)
- .withManifest(primaryResources.getManifest())
- .withRtxt(primaryResources.getRTxt())
- .withClasses(classesJar)
- .setAAROut(aarOut)
- .build(ruleContext);
-
- return targetBuilder.build();
+ ResourceContainer resourceContainer = new ResourceContainer(ruleContext.getLabel(),
+ javaPackage, null /* renameManifestPackage */, false /* inlinedConstants */,
+ apk, applicationManifest.getManifest(),
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR),
+ ImmutableList.<Artifact>of(), ImmutableList.<Artifact>of(),
+ ImmutableList.<PathFragment>of(), ImmutableList.<PathFragment>of(),
+ ruleContext.attributes().get("exports_manifest", Type.BOOLEAN),
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), null);
+
+ primaryResources = new AndroidResourcesProcessorBuilder(ruleContext)
+ .setApkOut(apk)
+ .setRTxtOut(resourceContainer.getRTxt())
+ .setSourceJarOut(resourceContainer.getJavaSourceJar())
+ .setJavaPackage(resourceContainer.getJavaPackage())
+ .withPrimary(resourceContainer)
+ .withDependencies(transitiveResources)
+ .setDebug(
+ ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
+ .setWorkingDirectory(ruleContext.getUniqueDirectory("_resources"))
+ .build(ruleContext);
}
+
+ new AarGeneratorBuilder(ruleContext)
+ .withPrimary(primaryResources)
+ .withManifest(primaryResources.getManifest())
+ .withRtxt(primaryResources.getRTxt())
+ .withClasses(classesJar)
+ .setAAROut(aarOut)
+ .build(ruleContext);
+
+ RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
+ androidCommon.addTransitiveInfoProviders(builder);
+ androidSemantics.addTransitiveInfoProviders(
+ builder, ruleContext, javaCommon, androidCommon,
+ null, definesLocalResources ? resourceApk : null,
+ null, ImmutableList.<Artifact>of());
+
+ return builder
+ .add(AndroidNativeLibraryProvider.class,
+ new AndroidNativeLibraryProvider(transitiveNativeLibraries))
+ .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
+ .add(JavaNeverlinkInfoProvider.class,
+ new JavaNeverlinkInfoProvider(androidCommon.isNeverLink()))
+ .add(JavaSourceJarsProvider.class, androidCommon.getJavaSourceJarsProvider())
+ .add(AndroidCcLinkParamsProvider.class,
+ new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore()))
+ .add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs))
+ .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs)
+ .add(AndroidLibraryAarProvider.class, new AndroidLibraryAarProvider(
+ aar, transitiveAars.build()))
+ .build();
}
private static Artifact mergeJarsFromSrcs(RuleContext ruleContext, Artifact inputJar)