aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar Irina Iancu <elenairina@google.com>2017-01-10 16:03:29 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-10 19:41:59 +0000
commit2f23599dda8f580234fc5a97675561cc86127444 (patch)
treea84a1bf15e7dd3ae1980522f5d6f8b71dfd39b51 /src/main/java/com/google/devtools/build/lib/analysis
parent284bbda34a3405779da67dc4fa15ef0fea76a88e (diff)
Add new flag to specify if output_licenses attribute should be checked for licenses.
Also flipped :jvm attribute from HOST to TARGET and set the new flag on it. -- PiperOrigin-RevId: 144084000 MOS_MIGRATED_REVID=144084000
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/InputFileConfiguredTarget.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java54
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java13
4 files changed, 79 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/InputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/InputFileConfiguredTarget.java
index 904b4e0402..2374981007 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/InputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/InputFileConfiguredTarget.java
@@ -65,4 +65,14 @@ public final class InputFileConfiguredTarget extends FileConfiguredTarget {
public final NestedSet<TargetLicense> getTransitiveLicenses() {
return licenses;
}
+
+ @Override
+ public TargetLicense getOutputLicenses() {
+ return null;
+ }
+
+ @Override
+ public boolean hasOutputLicenses() {
+ return false;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
index 831744d21b..8115d9dea9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
@@ -35,6 +35,17 @@ public interface LicensesProvider extends TransitiveInfoProvider {
NestedSet<TargetLicense> getTransitiveLicenses();
/**
+ * A label - license association for output_licenses. If there are no output_licenses it returns
+ * null.
+ */
+ TargetLicense getOutputLicenses();
+
+ /**
+ * Return whether there is an output_licenses.
+ */
+ boolean hasOutputLicenses();
+
+ /**
* License association for a particular target.
*/
public static final class TargetLicense {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
index 0952d69274..fd4f4675df 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProviderImpl.java
@@ -14,11 +14,14 @@
package com.google.devtools.build.lib.analysis;
+import com.google.common.collect.ListMultimap;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.License;
import com.google.devtools.build.lib.packages.Rule;
@@ -28,12 +31,15 @@ import com.google.devtools.build.lib.packages.Rule;
@Immutable
public final class LicensesProviderImpl implements LicensesProvider {
public static final LicensesProvider EMPTY =
- new LicensesProviderImpl(NestedSetBuilder.<TargetLicense>emptySet(Order.LINK_ORDER));
+ new LicensesProviderImpl(NestedSetBuilder.<TargetLicense>emptySet(Order.LINK_ORDER), null);
private final NestedSet<TargetLicense> transitiveLicenses;
+ private final TargetLicense outputLicenses;
- public LicensesProviderImpl(NestedSet<TargetLicense> transitiveLicenses) {
+ public LicensesProviderImpl(
+ NestedSet<TargetLicense> transitiveLicenses, TargetLicense outputLicenses) {
this.transitiveLicenses = transitiveLicenses;
+ this.outputLicenses = outputLicenses;
}
/**
@@ -47,29 +53,59 @@ public final class LicensesProviderImpl implements LicensesProvider {
NestedSetBuilder<TargetLicense> builder = NestedSetBuilder.linkOrder();
BuildConfiguration configuration = ruleContext.getConfiguration();
Rule rule = ruleContext.getRule();
- License toolOutputLicense = rule.getToolOutputLicense(ruleContext.attributes());
+ AttributeMap attributes = ruleContext.attributes();
+ License toolOutputLicense = rule.getToolOutputLicense(attributes);
+ TargetLicense outputLicenses =
+ toolOutputLicense == null ? null : new TargetLicense(rule.getLabel(), toolOutputLicense);
+
if (configuration.isHostConfiguration() && toolOutputLicense != null) {
if (toolOutputLicense != License.NO_LICENSE) {
- builder.add(new TargetLicense(rule.getLabel(), toolOutputLicense));
+ builder.add(outputLicenses);
}
} else {
if (rule.getLicense() != License.NO_LICENSE) {
builder.add(new TargetLicense(rule.getLabel(), rule.getLicense()));
}
- for (TransitiveInfoCollection dep : ruleContext.getConfiguredTargetMap().values()) {
- LicensesProvider provider = dep.getProvider(LicensesProvider.class);
- if (provider != null) {
- builder.addTransitive(provider.getTransitiveLicenses());
+ ListMultimap<String, ? extends TransitiveInfoCollection> configuredMap =
+ ruleContext.getConfiguredTargetMap();
+
+ for (String depAttrName : attributes.getAttributeNames()) {
+ // Only add the transitive licenses for the attributes that do not have the output_licenses.
+ Attribute attribute = attributes.getAttributeDefinition(depAttrName);
+ for (TransitiveInfoCollection dep : configuredMap.get(depAttrName)) {
+ LicensesProvider provider = dep.getProvider(LicensesProvider.class);
+ if (provider == null) {
+ continue;
+ }
+ if (useOutputLicenses(attribute, configuration) && provider.hasOutputLicenses()) {
+ builder.add(provider.getOutputLicenses());
+ } else {
+ builder.addTransitive(provider.getTransitiveLicenses());
+ }
}
}
}
- return new LicensesProviderImpl(builder.build());
+ return new LicensesProviderImpl(builder.build(), outputLicenses);
+ }
+
+ private static boolean useOutputLicenses(Attribute attribute, BuildConfiguration configuration) {
+ return configuration.isHostConfiguration() || attribute.useOutputLicenses();
}
@Override
public NestedSet<TargetLicense> getTransitiveLicenses() {
return transitiveLicenses;
}
+
+ @Override
+ public TargetLicense getOutputLicenses() {
+ return outputLicenses;
+ }
+
+ @Override
+ public boolean hasOutputLicenses() {
+ return outputLicenses != null;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
index 8ba3211da1..e193a79994 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
@@ -54,6 +54,19 @@ public class OutputFileConfiguredTarget extends FileConfiguredTarget
}
@Override
+ public TargetLicense getOutputLicenses() {
+ return getProvider(LicensesProvider.class, LicensesProviderImpl.EMPTY)
+ .getOutputLicenses();
+ }
+
+ @Override
+ public boolean hasOutputLicenses() {
+ return getProvider(LicensesProvider.class, LicensesProviderImpl.EMPTY)
+ .hasOutputLicenses();
+ }
+
+
+ @Override
public NestedSet<Artifact> getInstrumentedFiles() {
return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
.getInstrumentedFiles();