aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
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
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')
-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
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Attribute.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java2
8 files changed, 116 insertions, 12 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();
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 d17e3dffd4..38a4b8297b 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
@@ -107,7 +107,7 @@ public class BazelJavaRuleClasses {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
- .add(attr(":jvm", LABEL).cfg(HOST).value(JavaSemantics.JVM))
+ .add(attr(":jvm", LABEL).value(JavaSemantics.JVM).useOutputLicenses())
.add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK))
.add(attr("$jacoco_instrumentation", LABEL).cfg(HOST))
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 12b40e4697..420e6b81d1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -297,6 +297,11 @@ public final class Attribute implements Comparable<Attribute> {
* policy would check it.
*/
SKIP_CONSTRAINTS_OVERRIDE,
+
+ /**
+ * Whether we should use output_licenses to check the licences on this attribute.
+ */
+ OUTPUT_LICENSES,
}
// TODO(bazel-team): modify this interface to extend Predicate and have an extra error
@@ -536,6 +541,14 @@ public final class Attribute implements Comparable<Attribute> {
}
/**
+ * Mark the built attribute as to use output_licenses for license checking.
+ */
+ public Builder<TYPE> useOutputLicenses() {
+ Preconditions.checkState(BuildType.isLabelType(type), "must be a label type");
+ return setPropertyFlag(PropertyFlag.OUTPUT_LICENSES, "output_license");
+ }
+
+ /**
* Defines the configuration transition for this attribute.
*/
public Builder<TYPE> cfg(SplitTransitionProvider splitTransitionProvider) {
@@ -1865,6 +1878,13 @@ public final class Attribute implements Comparable<Attribute> {
}
/**
+ * Returns true if output_licenses should be used for checking licensing.
+ */
+ public boolean useOutputLicenses() {
+ return getPropertyFlag(PropertyFlag.OUTPUT_LICENSES);
+ }
+
+ /**
* Returns the configuration transition for this attribute for label or label
* list attributes. For other attributes it will always return {@code NONE}.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index 5ff24aa753..494e74ecf1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -237,7 +237,10 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
// but it is sort-of-kind-of a tool, but various parts of it are linked into the output...
// ...so we trust the judgment of the author of the cc_toolchain rule to figure out what
// licenses should be propagated to C++ targets.
- License outputLicense = ruleContext.getRule().getToolOutputLicense(ruleContext.attributes());
+ // TODO(elenairina): Remove this and use Attribute.Builder.useOutputLicenses() on the
+ // :cc_toolchain attribute instead.
+ final License outputLicense =
+ ruleContext.getRule().getToolOutputLicense(ruleContext.attributes());
if (outputLicense != null && outputLicense != License.NO_LICENSE) {
final NestedSet<TargetLicense> license = NestedSetBuilder.create(Order.STABLE_ORDER,
new TargetLicense(ruleContext.getLabel(), outputLicense));
@@ -246,6 +249,17 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
public NestedSet<TargetLicense> getTransitiveLicenses() {
return license;
}
+
+ @Override
+ public TargetLicense getOutputLicenses() {
+ return new TargetLicense(label, outputLicense);
+ }
+
+ @Override
+ public boolean hasOutputLicenses() {
+ return true;
+ }
+
};
builder.add(LicensesProvider.class, licensesProvider);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 9175a25e2b..e40d8f7936 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -471,7 +471,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
builder.addArtifacts((Iterable<Artifact>) common.getRuntimeClasspath());
// Add the JDK files if it comes from the source repository (see java_stub_template.txt).
- TransitiveInfoCollection javabaseTarget = ruleContext.getPrerequisite(":jvm", Mode.HOST);
+ TransitiveInfoCollection javabaseTarget = ruleContext.getPrerequisite(":jvm", Mode.TARGET);
if (javabaseTarget != null) {
builder.addArtifacts(
(Iterable<Artifact>) javabaseTarget.getProvider(FileProvider.class).getFilesToBuild());