From bbd1c1e001c39dec7eeeab16f1a619d3540ba959 Mon Sep 17 00:00:00 2001
From: Lukacs Berki
Date: Thu, 12 Jan 2017 09:24:35 +0000
Subject: Add a java_{library,binary}.resource_jars attribute that allows one
to specify jar files containing Java resources.
--
PiperOrigin-RevId: 144299119
MOS_MIGRATED_REVID=144299119
---
.../lib/bazel/rules/java/BazelJavaRuleClasses.java | 10 ++++++++
.../build/lib/rules/android/AndroidCommon.java | 1 +
.../lib/rules/android/JackCompilationHelper.java | 24 +++++++++++++++++--
.../devtools/build/lib/rules/java/JavaCommon.java | 6 +++++
.../lib/rules/java/JavaCompilationHelper.java | 1 +
.../build/lib/rules/java/JavaCompileAction.java | 27 ++++++++++++++++++++++
.../build/lib/rules/java/JavaTargetAttributes.java | 16 +++++++++++++
7 files changed, 83 insertions(+), 2 deletions(-)
(limited to 'src/main/java/com/google')
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
index 38a4b8297b..16742392ac 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
@@ -246,6 +246,16 @@ public class BazelJavaRuleClasses {
*/
.add(attr("resource_strip_prefix", STRING))
+ /*
+ Set of archives containing Java resources.
+
+ If specified, the contents of these jars are merged into the output jar.
+
+ */
+ .add(
+ attr("resource_jars", LABEL_LIST)
+ .orderIndependent()
+ .allowedFileTypes(JavaSemantics.JAR))
/*
Java compiler plugins to run at compile-time.
Every java_plugin
specified in this attribute will be run whenever this rule
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 7045816c7d..a14159f0b3 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
@@ -635,6 +635,7 @@ public class AndroidCommon {
.addJavaSources(attributes.getSourceFiles())
.addSourceJars(attributes.getSourceJars())
.addResources(attributes.getResources())
+ .addResourceJars(attributes.getResourceJars())
.addProcessorNames(attributes.getProcessorNames())
.addProcessorClasspathJars(attributes.getProcessorPath())
.addExports(JavaCommon.getExports(ruleContext))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
index 87e3443163..efc8da71c8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java
@@ -139,6 +139,9 @@ public final class JackCompilationHelper {
/** Java resources for the rule's Jack library. */
private final ImmutableMap resources;
+ /** Jars that contain resources to be added to the Jack library. */
+ private final NestedSet resourceJars;
+
/** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */
private final NestedSet exportedJacks;
/**
@@ -187,6 +190,7 @@ public final class JackCompilationHelper {
ImmutableSet javaSources,
ImmutableSet sourceJars,
ImmutableMap resources,
+ NestedSet resourceJars,
NestedSet processorClasspathJars,
ImmutableSet processorNames,
NestedSet exportedJacks,
@@ -206,6 +210,7 @@ public final class JackCompilationHelper {
this.javaSources = javaSources;
this.sourceJars = sourceJars;
this.resources = resources;
+ this.resourceJars = resourceJars;
this.processorClasspathJars = processorClasspathJars;
this.processorNames = processorNames;
this.exportedJacks = exportedJacks;
@@ -349,11 +354,12 @@ public final class JackCompilationHelper {
NestedSetBuilder dexContents = new NestedSetBuilder<>(Order.NAIVE_LINK_ORDER);
if (outputArtifact != null) {
- if (javaSources.isEmpty() && sourceJars.isEmpty() && resources.isEmpty()) {
+ if (javaSources.isEmpty() && sourceJars.isEmpty() && resources.isEmpty()
+ && resourceJars.isEmpty()) {
// We still have to create SOMETHING to fulfill the artifact, but man, screw it
buildEmptyJackAction();
} else {
- buildJackAction(javaSources, sourceJars, resources, classpath);
+ buildJackAction(javaSources, sourceJars, resources, resourceJars, classpath);
exports.add(outputArtifact);
dexContents.add(outputArtifact);
}
@@ -485,6 +491,7 @@ public final class JackCompilationHelper {
Iterable javaSources,
Iterable sourceJars,
Map resources,
+ NestedSet resourceJars,
NestedSet classpathJackLibraries) {
CustomCommandLine.Builder builder =
CustomCommandLine.builder()
@@ -517,6 +524,9 @@ public final class JackCompilationHelper {
builder.addPaths("%s:%s", rootPrefix, resourcePath);
}
}
+ if (!resourceJars.isEmpty()) {
+ builder.addJoinExecPaths(IMPORT_RESOURCE_ZIP, ":", resourceJars);
+ }
builder.addBeforeEachExecPath(IMPORT_SOURCE_ZIP, sourceJars).addExecPaths(javaSources);
ruleContext.registerAction(
new SpawnAction.Builder()
@@ -525,6 +535,7 @@ public final class JackCompilationHelper {
.addOutput(outputArtifact)
.addTransitiveInputs(processorClasspathJars)
.addInputs(resources.values())
+ .addTransitiveInputs(resourceJars)
.addInputs(sourceJars)
.addInputs(javaSources)
.setCommandLine(builder.build())
@@ -567,6 +578,9 @@ public final class JackCompilationHelper {
/** Map from paths within the Jack library to Java resources for the rule's Jack library. */
private final LinkedHashMap resources = new LinkedHashMap<>();
+ /** Set of resource jars that contain Java resources. */
+ private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder();
+
/** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */
private final NestedSetBuilder exportedJackLibraries =
new NestedSetBuilder<>(Order.NAIVE_LINK_ORDER);
@@ -712,6 +726,11 @@ public final class JackCompilationHelper {
return this;
}
+ public JackCompilationHelper.Builder addResourceJars(NestedSet resourceJars) {
+ this.resourceJars.addTransitive(resourceJars);
+ return this;
+ }
+
/**
* Adds a set of class names which will be used as annotation processors.
*/
@@ -867,6 +886,7 @@ public final class JackCompilationHelper {
ImmutableSet.copyOf(javaSources),
ImmutableSet.copyOf(sourceJars),
ImmutableMap.copyOf(resources),
+ resourceJars.build(),
processorClasspathJars.build(),
ImmutableSet.copyOf(processorNames),
exportedJackLibraries.build(),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index e2d9111ec8..cc1ebed2eb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
import com.google.devtools.build.lib.analysis.AnalysisUtils;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
+import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -589,6 +590,11 @@ public class JavaCommon {
JavaHelper.getJavaResourcePath(semantics, ruleContext, resource), resource);
}
+ if (ruleContext.attributes().has("resource_jars", BuildType.LABEL_LIST)) {
+ javaTargetAttributes.addResourceJars(PrerequisiteArtifacts.nestedSet(
+ ruleContext, "resource_jars", Mode.TARGET));
+ }
+
addPlugins(javaTargetAttributes);
javaTargetAttributes.setRuleKind(ruleContext.getRule().getRuleClass());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index 58dd7363e4..342b9bac68 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -173,6 +173,7 @@ public final class JavaCompilationHelper {
JavaCompileAction.Builder builder = createJavaCompileActionBuilder(semantics);
builder.setClasspathEntries(attributes.getCompileTimeClassPath());
builder.addResources(attributes.getResources());
+ builder.addResourceJars(attributes.getResourceJars());
builder.addClasspathResources(attributes.getClassPathResources());
builder.setBootclasspathEntries(getBootclasspathOrDefault());
builder.setExtdirInputs(getExtdirInputs());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index d79040c4be..67c3d151b1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -144,6 +144,11 @@ public final class JavaCompileAction extends AbstractAction {
*/
private final ImmutableList resources;
+ /**
+ * The set of resource jars to merge into the jar.
+ */
+ private final NestedSet resourceJars;
+
/** The number of resources that will be put into the jar. */
private final int resourceCount;
@@ -221,6 +226,7 @@ public final class JavaCompileAction extends AbstractAction {
List processorPath,
List processorNames,
Map resources,
+ NestedSet resourceJars,
Collection sourceJars,
Collection sourceFiles,
List javacOpts,
@@ -253,6 +259,7 @@ public final class JavaCompileAction extends AbstractAction {
this.processorPath = ImmutableList.copyOf(processorPath);
this.processorNames = ImmutableList.copyOf(processorNames);
this.resources = ImmutableList.copyOf(resources.values());
+ this.resourceJars = resourceJars;
this.sourceJars = ImmutableList.copyOf(sourceJars);
this.sourceFiles = ImmutableList.copyOf(sourceFiles);
this.javacOpts = ImmutableList.copyOf(javacOpts);
@@ -283,6 +290,11 @@ public final class JavaCompileAction extends AbstractAction {
return resources;
}
+ @VisibleForTesting
+ public NestedSet getResourceJars() {
+ return resourceJars;
+ }
+
/**
* Returns the list of paths that represents the classpath.
*/
@@ -620,6 +632,7 @@ public final class JavaCompileAction extends AbstractAction {
final List processorNames,
final Collection messages,
final Map resources,
+ final NestedSet resourceJars,
final Collection classpathResources,
final Collection sourceJars,
final Collection sourceFiles,
@@ -688,6 +701,9 @@ public final class JavaCompileAction extends AbstractAction {
addAsResourcePrefixedExecPath(resource.getKey(), resource.getValue(), result);
}
}
+ if (!resourceJars.isEmpty()) {
+ result.addExecPaths("--resource_jars", resourceJars);
+ }
if (!classpathResources.isEmpty()) {
result.addExecPaths("--classpath_resources", classpathResources);
}
@@ -941,6 +957,7 @@ public final class JavaCompileAction extends AbstractAction {
private final Collection sourceFiles = new ArrayList<>();
private final Collection sourceJars = new ArrayList<>();
private final Map resources = new LinkedHashMap<>();
+ private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder();
private final Collection classpathResources = new ArrayList<>();
private final Collection translations = new LinkedHashSet<>();
private BuildConfiguration.StrictDepsMode strictJavaDeps =
@@ -1061,6 +1078,8 @@ public final class JavaCompileAction extends AbstractAction {
configuration.getBinDirectory(targetLabel.getPackageIdentifier().getRepository()));
}
+ NestedSet resourceJars = this.resourceJars.build();
+
// ImmutableIterable is safe to use here because we know that none of the components of
// the Iterable.concat() will change. Without ImmutableIterable, AbstractAction will
// waste memory by making a preventive copy of the iterable.
@@ -1068,6 +1087,7 @@ public final class JavaCompileAction extends AbstractAction {
processorPath,
translations,
resources.values(),
+ resourceJars,
sourceJars,
sourceFiles,
classpathResources,
@@ -1107,6 +1127,7 @@ public final class JavaCompileAction extends AbstractAction {
processorNames,
translations,
resources,
+ resourceJars,
classpathResources,
sourceJars,
sourceFiles,
@@ -1180,6 +1201,7 @@ public final class JavaCompileAction extends AbstractAction {
processorPath,
processorNames,
resources,
+ resourceJars,
sourceJars,
sourceFiles,
internedJcopts,
@@ -1257,6 +1279,11 @@ public final class JavaCompileAction extends AbstractAction {
return this;
}
+ public Builder addResourceJars(NestedSet resourceJars) {
+ this.resourceJars.addTransitive(resourceJars);
+ return this;
+ }
+
public Builder addClasspathResources(Collection classpathResources) {
this.classpathResources.addAll(classpathResources);
return this;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java
index 4f996ad095..f1775189a3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java
@@ -79,6 +79,7 @@ public class JavaTargetAttributes {
private final Set apiGeneratingProcessorNames = new LinkedHashSet<>();
private final Map resources = new LinkedHashMap<>();
+ private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder();
private final List messages = new ArrayList<>();
private final List instrumentationMetadata = new ArrayList<>();
private final List sourceJars = new ArrayList<>();
@@ -295,6 +296,12 @@ public class JavaTargetAttributes {
return this;
}
+ public Builder addResourceJars(NestedSet resourceJars) {
+ Preconditions.checkArgument(!built);
+ this.resourceJars.addTransitive(resourceJars);
+ return this;
+ }
+
public Builder addProcessorName(String processor) {
Preconditions.checkArgument(!built);
processorNames.add(processor);
@@ -361,6 +368,7 @@ public class JavaTargetAttributes {
apiGeneratingProcessorPath,
apiGeneratingProcessorNames,
resources,
+ resourceJars.build(),
messages,
sourceJars,
classPathResources,
@@ -416,6 +424,8 @@ public class JavaTargetAttributes {
private final ImmutableSet apiGeneratingProcessorNames;
private final ImmutableMap resources;
+ private final NestedSet resourceJars;
+
private final ImmutableList messages;
private final ImmutableList sourceJars;
@@ -445,6 +455,7 @@ public class JavaTargetAttributes {
Set apiGeneratingProcessorPath,
Set apiGeneratingProcessorNames,
Map resources,
+ NestedSet resourceJars,
List messages,
List sourceJars,
List classPathResources,
@@ -472,6 +483,7 @@ public class JavaTargetAttributes {
this.apiGeneratingProcessorPath = ImmutableSet.copyOf(apiGeneratingProcessorPath);
this.apiGeneratingProcessorNames = ImmutableSet.copyOf(apiGeneratingProcessorNames);
this.resources = ImmutableMap.copyOf(resources);
+ this.resourceJars = resourceJars;
this.messages = ImmutableList.copyOf(messages);
this.sourceJars = ImmutableList.copyOf(sourceJars);
this.classPathResources = ImmutableList.copyOf(classPathResources);
@@ -499,6 +511,10 @@ public class JavaTargetAttributes {
return resources;
}
+ public NestedSet getResourceJars() {
+ return resourceJars;
+ }
+
public List getMessages() {
return messages;
}
--
cgit v1.2.3