Skip to content

Commit 39401a9

Browse files
katrecopybara-github
authored andcommitted
Allow native repository rules to declare toolchains they want
registered. Closes #11728. PiperOrigin-RevId: 320420725
1 parent 39e42d1 commit 39401a9

File tree

3 files changed

+35
-15
lines changed

3 files changed

+35
-15
lines changed

src/main/java/com/google/devtools/build/lib/packages/RuleClass.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,15 @@ public class RuleClass {
141141

142142
@AutoCodec
143143
static final Function<? super Rule, Map<String, Label>> NO_EXTERNAL_BINDINGS =
144-
Functions.<Map<String, Label>>constant(ImmutableMap.<String, Label>of());
144+
Functions.constant(ImmutableMap.of());
145+
146+
@AutoCodec
147+
static final Function<? super Rule, List<String>> NO_TOOLCHAINS_TO_REGISTER =
148+
Functions.constant(ImmutableList.of());
145149

146150
@AutoCodec
147151
static final Function<? super Rule, Set<String>> NO_OPTION_REFERENCE =
148-
Functions.<Set<String>>constant(ImmutableSet.<String>of());
152+
Functions.constant(ImmutableSet.of());
149153

150154
public static final PathFragment THIRD_PARTY_PREFIX = PathFragment.create("third_party");
151155
public static final PathFragment EXPERIMENTAL_PREFIX = PathFragment.create("experimental");
@@ -674,6 +678,8 @@ public String toString() {
674678
private BuildSetting buildSetting = null;
675679
private Function<? super Rule, Map<String, Label>> externalBindingsFunction =
676680
NO_EXTERNAL_BINDINGS;
681+
private Function<? super Rule, ? extends List<String>> toolchainsToRegisterFunction =
682+
NO_TOOLCHAINS_TO_REGISTER;
677683
private Function<? super Rule, ? extends Set<String>> optionReferenceFunction =
678684
NO_OPTION_REFERENCE;
679685
/** This field and the next are null iff the rule is native. */
@@ -821,6 +827,7 @@ public RuleClass build(String name, String key) {
821827
assertStarlarkRuleClassHasEnvironmentLabel();
822828
}
823829
Preconditions.checkState(externalBindingsFunction == NO_EXTERNAL_BINDINGS);
830+
Preconditions.checkState(toolchainsToRegisterFunction == NO_TOOLCHAINS_TO_REGISTER);
824831
}
825832
if (type == RuleClassType.PLACEHOLDER) {
826833
Preconditions.checkNotNull(ruleDefinitionEnvironmentDigest, this.name);
@@ -885,6 +892,7 @@ public RuleClass build(String name, String key) {
885892
advertisedProviders.build(),
886893
configuredTargetFunction,
887894
externalBindingsFunction,
895+
toolchainsToRegisterFunction,
888896
optionReferenceFunction,
889897
ruleDefinitionEnvironmentLabel,
890898
ruleDefinitionEnvironmentDigest,
@@ -1274,6 +1282,12 @@ public Builder setExternalBindingsFunction(Function<? super Rule, Map<String, La
12741282
return this;
12751283
}
12761284

1285+
public Builder setToolchainsToRegisterFunction(
1286+
Function<? super Rule, ? extends List<String>> func) {
1287+
this.toolchainsToRegisterFunction = func;
1288+
return this;
1289+
}
1290+
12771291
/**
12781292
* Sets the rule definition environment label and transitive digest. Meant for Starlark usage.
12791293
*/
@@ -1616,6 +1630,9 @@ public Attribute.Builder<?> copy(String name) {
16161630
*/
16171631
private final Function<? super Rule, Map<String, Label>> externalBindingsFunction;
16181632

1633+
/** Returns the toolchains a workspace function wants to have registered in the WORKSPACE file. */
1634+
private final Function<? super Rule, ? extends List<String>> toolchainsToRegisterFunction;
1635+
16191636
/**
16201637
* Returns the options referenced by this rule's attributes.
16211638
*/
@@ -1695,6 +1712,7 @@ public Attribute.Builder<?> copy(String name) {
16951712
AdvertisedProviderSet advertisedProviders,
16961713
@Nullable StarlarkCallable configuredTargetFunction,
16971714
Function<? super Rule, Map<String, Label>> externalBindingsFunction,
1715+
Function<? super Rule, ? extends List<String>> toolchainsToRegisterFunction,
16981716
Function<? super Rule, ? extends Set<String>> optionReferenceFunction,
16991717
@Nullable Label ruleDefinitionEnvironmentLabel,
17001718
@Nullable byte[] ruleDefinitionEnvironmentDigest,
@@ -1727,6 +1745,7 @@ public Attribute.Builder<?> copy(String name) {
17271745
this.advertisedProviders = advertisedProviders;
17281746
this.configuredTargetFunction = configuredTargetFunction;
17291747
this.externalBindingsFunction = externalBindingsFunction;
1748+
this.toolchainsToRegisterFunction = toolchainsToRegisterFunction;
17301749
this.optionReferenceFunction = optionReferenceFunction;
17311750
this.ruleDefinitionEnvironmentLabel = ruleDefinitionEnvironmentLabel;
17321751
this.ruleDefinitionEnvironmentDigest = ruleDefinitionEnvironmentDigest;
@@ -2591,6 +2610,16 @@ public Function<? super Rule, Map<String, Label>> getExternalBindingsFunction()
25912610
return externalBindingsFunction;
25922611
}
25932612

2613+
/**
2614+
* Returns a function that computes the toolchains that should be registered for a repository
2615+
* function.
2616+
*
2617+
* @return
2618+
*/
2619+
public Function<? super Rule, ? extends List<String>> getToolchainsToRegisterFunction() {
2620+
return toolchainsToRegisterFunction;
2621+
}
2622+
25942623
/**
25952624
* Returns a function that computes the options referenced by a rule.
25962625
*/

src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public static Rule createAndAddRepositoryRule(
5656
Label nameLabel = Label.parseAbsolute("//external:" + entry.getKey(), ImmutableMap.of());
5757
addBindRule(pkg, bindRuleClass, nameLabel, entry.getValue(), semantics, callstack);
5858
}
59+
pkg.addRegisteredToolchains(ruleClass.getToolchainsToRegisterFunction().apply(rule));
5960
return rule;
6061
}
6162

src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.substitutePlaceholderIntoTemplate;
2323
import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
2424
import static com.google.devtools.build.lib.packages.RuleClass.NO_EXTERNAL_BINDINGS;
25+
import static com.google.devtools.build.lib.packages.RuleClass.NO_TOOLCHAINS_TO_REGISTER;
2526
import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
2627
import static com.google.devtools.build.lib.packages.Type.INTEGER;
2728
import static com.google.devtools.build.lib.packages.Type.STRING;
2829
import static com.google.devtools.build.lib.packages.Type.STRING_LIST;
2930
import static org.junit.Assert.assertThrows;
3031
import static org.junit.Assert.fail;
3132

32-
import com.google.common.base.Function;
3333
import com.google.common.base.Predicate;
3434
import com.google.common.base.Predicates;
3535
import com.google.common.base.Strings;
@@ -122,7 +122,6 @@ private static RuleClass createRuleClassA() throws LabelSyntaxException {
122122
PREFERRED_DEPENDENCY_PREDICATE,
123123
AdvertisedProviderSet.EMPTY,
124124
null,
125-
NO_EXTERNAL_BINDINGS,
126125
ImmutableSet.<Class<?>>of(),
127126
MissingFragmentPolicy.FAIL_ANALYSIS,
128127
true,
@@ -159,7 +158,6 @@ private static RuleClass createRuleClassB(RuleClass ruleClassA) {
159158
PREFERRED_DEPENDENCY_PREDICATE,
160159
AdvertisedProviderSet.EMPTY,
161160
null,
162-
NO_EXTERNAL_BINDINGS,
163161
ImmutableSet.<Class<?>>of(),
164162
MissingFragmentPolicy.FAIL_ANALYSIS,
165163
true,
@@ -289,7 +287,6 @@ public void testDuplicatedDeps() throws Exception {
289287
PREFERRED_DEPENDENCY_PREDICATE,
290288
AdvertisedProviderSet.EMPTY,
291289
null,
292-
NO_EXTERNAL_BINDINGS,
293290
ImmutableSet.<Class<?>>of(),
294291
MissingFragmentPolicy.FAIL_ANALYSIS,
295292
true,
@@ -336,7 +333,6 @@ public void testCreateRuleWithLegacyPublicVisibility() throws Exception {
336333
PREFERRED_DEPENDENCY_PREDICATE,
337334
AdvertisedProviderSet.EMPTY,
338335
null,
339-
NO_EXTERNAL_BINDINGS,
340336
ImmutableSet.<Class<?>>of(),
341337
MissingFragmentPolicy.FAIL_ANALYSIS,
342338
true,
@@ -435,7 +431,6 @@ public void testImplicitOutputs() throws Exception {
435431
PREFERRED_DEPENDENCY_PREDICATE,
436432
AdvertisedProviderSet.EMPTY,
437433
null,
438-
NO_EXTERNAL_BINDINGS,
439434
ImmutableSet.<Class<?>>of(),
440435
MissingFragmentPolicy.FAIL_ANALYSIS,
441436
true,
@@ -476,7 +471,6 @@ public void testImplicitOutsWithBasenameDirname() throws Exception {
476471
PREFERRED_DEPENDENCY_PREDICATE,
477472
AdvertisedProviderSet.EMPTY,
478473
null,
479-
NO_EXTERNAL_BINDINGS,
480474
ImmutableSet.<Class<?>>of(),
481475
MissingFragmentPolicy.FAIL_ANALYSIS,
482476
true);
@@ -512,7 +506,6 @@ private static RuleClass getRuleClassWithComputedDefault(Attribute computedDefau
512506
PREFERRED_DEPENDENCY_PREDICATE,
513507
AdvertisedProviderSet.EMPTY,
514508
null,
515-
NO_EXTERNAL_BINDINGS,
516509
ImmutableSet.<Class<?>>of(),
517510
MissingFragmentPolicy.FAIL_ANALYSIS,
518511
true,
@@ -681,7 +674,6 @@ public void testOutputsAreOrdered() throws Exception {
681674
PREFERRED_DEPENDENCY_PREDICATE,
682675
AdvertisedProviderSet.EMPTY,
683676
null,
684-
NO_EXTERNAL_BINDINGS,
685677
ImmutableSet.<Class<?>>of(),
686678
MissingFragmentPolicy.FAIL_ANALYSIS,
687679
true,
@@ -724,7 +716,6 @@ public void testSubstitutePlaceholderIntoTemplate() throws Exception {
724716
PREFERRED_DEPENDENCY_PREDICATE,
725717
AdvertisedProviderSet.EMPTY,
726718
null,
727-
NO_EXTERNAL_BINDINGS,
728719
ImmutableSet.<Class<?>>of(),
729720
MissingFragmentPolicy.FAIL_ANALYSIS,
730721
true,
@@ -881,7 +872,6 @@ private static RuleClass newRuleClass(
881872
Predicate<String> preferredDependencyPredicate,
882873
AdvertisedProviderSet advertisedProviders,
883874
@Nullable StarlarkFunction configuredTargetFunction,
884-
Function<? super Rule, Map<String, Label>> externalBindingsFunction,
885875
Set<Class<?>> allowedConfigurationFragments,
886876
MissingFragmentPolicy missingFragmentPolicy,
887877
boolean supportsConstraintChecking,
@@ -909,7 +899,8 @@ private static RuleClass newRuleClass(
909899
preferredDependencyPredicate,
910900
advertisedProviders,
911901
configuredTargetFunction,
912-
externalBindingsFunction,
902+
NO_EXTERNAL_BINDINGS,
903+
NO_TOOLCHAINS_TO_REGISTER,
913904
/*optionReferenceFunction=*/ RuleClass.NO_OPTION_REFERENCE,
914905
/*ruleDefinitionEnvironmentLabel=*/ null,
915906
/*ruleDefinitionEnvironmentDigest=*/ null,
@@ -946,7 +937,6 @@ private static RuleClass createParentRuleClass() {
946937
PREFERRED_DEPENDENCY_PREDICATE,
947938
AdvertisedProviderSet.EMPTY,
948939
null,
949-
NO_EXTERNAL_BINDINGS,
950940
ImmutableSet.<Class<?>>of(DummyFragment.class),
951941
MissingFragmentPolicy.FAIL_ANALYSIS,
952942
true,

0 commit comments

Comments
 (0)