Remove the dependency on LanguageDependentFragment from the C++ rules. This comes at the cost of adding a dependency of proto rules in turn, but they pretty much depended on it already, so not a lot is lost. RELNOTES: None. PiperOrigin-RevId: 220783592
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java b/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java index 9444fb6..6dd8963 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/LanguageDependentFragment.java
@@ -15,8 +15,6 @@ package com.google.devtools.build.lib.analysis; import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; -import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.util.Objects; @@ -70,68 +68,18 @@ } } - private final Label label; private final ImmutableSet<LibraryLanguage> languages; @AutoCodec.Instantiator - public LanguageDependentFragment(Label label, ImmutableSet<LibraryLanguage> languages) { - this.label = label; + public LanguageDependentFragment(ImmutableSet<LibraryLanguage> languages) { this.languages = languages; } /** - * Returns the label that is associated with this piece of information. - * - * <p>This is usually the label of the target that provides the information. - */ - public Label getLabel() { - return label; - } - - /** * Returns a set of the languages the ConfiguredTarget generates output for. * For use only by rules that directly depend on this library via a "deps" attribute. */ public ImmutableSet<LibraryLanguage> getSupportedLanguages() { return languages; } - - /** - * Routines for verifying that dependency provide the right output. - */ - public static final class Checker { - /** Checks that given dep supports the given language. */ - public static boolean depSupportsLanguage( - RuleContext context, - LanguageDependentFragment dep, - LibraryLanguage language, - String attrName) { - if (dep.getSupportedLanguages().contains(language)) { - return true; - } else { - context.attributeError( - attrName, - String.format("'%s' does not produce output for %s", dep.getLabel(), language)); - return false; - } - } - - /** - * Checks that all LanguageDependentFragment support the given language. - * - * @param attrNames names of attributes whose contents should be checked for supported - * languages, e.g., "deps". - */ - public static void depsSupportsLanguage( - RuleContext context, LibraryLanguage language, Iterable<String> attrNames) { - for (String attrName : attrNames) { - if (context.attributes().has(attrName)) { - for (LanguageDependentFragment dep : - context.getPrerequisites(attrName, Mode.TARGET, LanguageDependentFragment.class)) { - depSupportsLanguage(context, dep, language, attrName); - } - } - } - } - } }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index fc79d3c..67df1f6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -792,11 +792,7 @@ */ public CompilationInfo compile() throws RuleErrorException { if (checkDepsGenerateCpp) { - for (LanguageDependentFragment dep : - AnalysisUtils.getProviders(deps, LanguageDependentFragment.class)) { - LanguageDependentFragment.Checker.depSupportsLanguage( - ruleContext, dep, CppRuleClasses.LANGUAGE, "deps"); - } + CppHelper.checkProtoLibrariesInDeps(ruleContext, deps); } if (!generatePicAction && !generateNoPicAction) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java index a5c74ef..c2b9d58 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java
@@ -346,11 +346,7 @@ Preconditions.checkNotNull(ccOutputs); if (checkDepsGenerateCpp) { - for (LanguageDependentFragment dep : - AnalysisUtils.getProviders(deps, LanguageDependentFragment.class)) { - LanguageDependentFragment.Checker.depSupportsLanguage( - ruleContext, dep, CppRuleClasses.LANGUAGE, "deps"); - } + CppHelper.checkProtoLibrariesInDeps(ruleContext, deps); } // Create link actions (only if there are object files or if explicitly requested).
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 60edc5e..39eb822 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -59,6 +59,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.FdoProvider.FdoMode; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; +import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import com.google.devtools.build.lib.shell.ShellUtils; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileTypeSet; @@ -831,4 +832,14 @@ } return new CcNativeLibraryProvider(result.build()); } + + public static void checkProtoLibrariesInDeps(RuleContext ruleContext, + Iterable<TransitiveInfoCollection> deps) { + for (TransitiveInfoCollection dep : deps) { + if (dep.getProvider(ProtoSourcesProvider.class) != null && dep.get(CcInfo.PROVIDER) == null) { + ruleContext.attributeError("deps", + String.format("proto_library '%s' does not produce output for C++", dep.getLabel())); + } + } + } }