diff options
author | Irina Iancu <elenairina@google.com> | 2017-01-10 16:03:29 +0000 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-01-10 19:41:59 +0000 |
commit | 2f23599dda8f580234fc5a97675561cc86127444 (patch) | |
tree | a84a1bf15e7dd3ae1980522f5d6f8b71dfd39b51 /src/main/java | |
parent | 284bbda34a3405779da67dc4fa15ef0fea76a88e (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')
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()); |