Skip to content

Commit 66e29cd

Browse files
comiuscopybara-github
authored andcommitted
Proxy proto compiler and proto opts over proto_lang_toolchain rule.
This is needed for the proto_common.generate_code function. This change doesn't modify any of proto_lang_toolchain public attributes. PiperOrigin-RevId: 437713619
1 parent a229bed commit 66e29cd

6 files changed

Lines changed: 82 additions & 11 deletions

File tree

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ public ConfiguredTarget create(RuleContext ruleContext)
6262
// targets. While this has the potential to use more memory than using a NestedSet,
6363
// there are only a few `proto_lang_toolchain` targets in every build, so the impact
6464
// on memory consumption should be neglectable.
65-
providedProtoSources.build().toList()))
65+
providedProtoSources.build().toList(),
66+
ruleContext.getPrerequisite(":proto_compiler", FilesToRunProvider.class),
67+
ruleContext.getConfiguration().getFragment(ProtoConfiguration.class).protocOpts()))
6668
.setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
6769
.addProvider(RunfilesProvider.simple(Runfiles.EMPTY))
6870
.build();

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainProvider.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
2424
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
2525
import javax.annotation.Nullable;
26+
import net.starlark.java.annot.StarlarkMethod;
27+
import net.starlark.java.eval.StarlarkList;
2628

2729
// Note: AutoValue v1.4-rc1 has AutoValue.CopyAnnotations which makes it work with Starlark. No need
2830
// to un-AutoValue this class to expose it to Starlark.
@@ -32,11 +34,25 @@
3234
*/
3335
@AutoValue
3436
public abstract class ProtoLangToolchainProvider implements TransitiveInfoProvider {
37+
@StarlarkMethod(
38+
name = "out_replacement_format_flag",
39+
doc = "Format string used when passing output to the plugin used by proto compiler.",
40+
structField = true)
3541
public abstract String outReplacementFormatFlag();
3642

43+
@StarlarkMethod(
44+
name = "plugin_format_flag",
45+
doc = "Format string used when passing plugin to proto compiler.",
46+
structField = true,
47+
allowReturnNones = true)
3748
@Nullable
3849
public abstract String pluginFormatFlag();
3950

51+
@StarlarkMethod(
52+
name = "plugin",
53+
doc = "Proto compiler plugin.",
54+
structField = true,
55+
allowReturnNones = true)
4056
@Nullable
4157
public abstract FilesToRunProvider pluginExecutable();
4258

@@ -49,6 +65,19 @@ public abstract class ProtoLangToolchainProvider implements TransitiveInfoProvid
4965
*/
5066
public abstract ImmutableList<ProtoSource> providedProtoSources();
5167

68+
@StarlarkMethod(name = "proto_compiler", doc = "Proto compiler.", structField = true)
69+
public abstract FilesToRunProvider protoc();
70+
71+
@StarlarkMethod(
72+
name = "protoc_opts",
73+
doc = "Options to pass to proto compiler.",
74+
structField = true)
75+
public StarlarkList<String> protocOptsForStarlark() {
76+
return StarlarkList.immutableCopyOf(protocOpts());
77+
}
78+
79+
public abstract ImmutableList<String> protocOpts();
80+
5281
/**
5382
* This makes the blacklisted_protos member available in the provider. It can be removed after
5483
* users are migrated and a sufficient time for Bazel rules to migrate has elapsed.
@@ -67,7 +96,9 @@ public static ProtoLangToolchainProvider create(
6796
String pluginFormatFlag,
6897
FilesToRunProvider pluginExecutable,
6998
TransitiveInfoCollection runtime,
70-
ImmutableList<ProtoSource> providedProtoSources) {
99+
ImmutableList<ProtoSource> providedProtoSources,
100+
FilesToRunProvider protoc,
101+
ImmutableList<String> protocOpts) {
71102
NestedSetBuilder<Artifact> blacklistedProtos = NestedSetBuilder.stableOrder();
72103
for (ProtoSource protoSource : providedProtoSources) {
73104
blacklistedProtos.add(protoSource.getOriginalSourceFile());
@@ -78,6 +109,8 @@ public static ProtoLangToolchainProvider create(
78109
pluginExecutable,
79110
runtime,
80111
providedProtoSources,
112+
protoc,
113+
protocOpts,
81114
blacklistedProtos.build());
82115
}
83116
}

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainRule.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,25 @@
2222
import com.google.devtools.build.lib.analysis.RuleDefinition;
2323
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
2424
import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
25+
import com.google.devtools.build.lib.cmdline.Label;
26+
import com.google.devtools.build.lib.packages.Attribute;
2527
import com.google.devtools.build.lib.packages.RuleClass;
2628
import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
2729
import com.google.devtools.build.lib.packages.Type;
2830

2931
/** Implements {code proto_lang_toolchain}. */
3032
public class ProtoLangToolchainRule implements RuleDefinition {
33+
private static final Label DEFAULT_PROTO_COMPILER =
34+
Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
35+
private static final Attribute.LabelLateBoundDefault<?> PROTO_COMPILER =
36+
Attribute.LabelLateBoundDefault.fromTargetConfiguration(
37+
ProtoConfiguration.class,
38+
DEFAULT_PROTO_COMPILER,
39+
(rule, attributes, protoConfig) ->
40+
protoConfig.protoCompiler() != null
41+
? protoConfig.protoCompiler()
42+
: DEFAULT_PROTO_COMPILER);
43+
3144
@Override
3245
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
3346
return builder
@@ -78,6 +91,11 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment envi
7891
attr("blacklisted_protos", LABEL_LIST)
7992
.allowedFileTypes()
8093
.mandatoryProviders(StarlarkProviderIdentifier.forKey(ProtoInfo.PROVIDER.getKey())))
94+
.add(
95+
attr(":proto_compiler", LABEL)
96+
.cfg(ExecutionTransitionFactory.create())
97+
.exec()
98+
.value(PROTO_COMPILER))
8199
.requiresConfigurationFragments(ProtoConfiguration.class)
82100
.advertiseProvider(ProtoLangToolchainProvider.class)
83101
.removeAttribute("data")

src/test/java/com/google/devtools/build/lib/rules/proto/BUILD

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@ java_test(
1616
name = "ProtoCompileActionBuilderTest",
1717
srcs = ["ProtoCompileActionBuilderTest.java"],
1818
deps = [
19-
"//src/main/java/com/google/devtools/build/lib/actions",
2019
"//src/main/java/com/google/devtools/build/lib/actions:artifacts",
2120
"//src/main/java/com/google/devtools/build/lib/actions:localhost_capacity",
22-
"//src/main/java/com/google/devtools/build/lib/analysis:actions/custom_command_line",
2321
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
2422
"//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_collection",
2523
"//src/main/java/com/google/devtools/build/lib/cmdline",

src/test/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilderTest.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,18 @@ public void commandLine_basic() throws Exception {
127127
/* pluginFormatFlag= */ null,
128128
/* pluginExecutable= */ null,
129129
/* runtime= */ mock(TransitiveInfoCollection.class),
130-
/* providedProtoSources= */ ImmutableList.of());
130+
/* providedProtoSources= */ ImmutableList.of(),
131+
/* protoc= */ FilesToRunProvider.EMPTY,
132+
/* protocOpts= */ ImmutableList.of());
131133
ProtoLangToolchainProvider toolchainWithPlugin =
132134
ProtoLangToolchainProvider.create(
133135
"--PLUGIN_pluginName_out=param3,param4:%s",
134136
/* pluginFormatFlag= */ "--plugin=protoc-gen-PLUGIN_pluginName=%s",
135137
plugin,
136138
/* runtime= */ mock(TransitiveInfoCollection.class),
137-
/* providedProtoSources= */ ImmutableList.of());
139+
/* providedProtoSources= */ ImmutableList.of(),
140+
/* protoc= */ FilesToRunProvider.EMPTY,
141+
/* protocOpts= */ ImmutableList.of());
138142
useConfiguration("--strict_proto_deps=OFF");
139143

140144
RuleContext ruleContext =
@@ -200,7 +204,9 @@ public void commandLine_strictDeps() throws Exception {
200204
/* pluginFormatFlag= */ null,
201205
/* pluginExecutable= */ null,
202206
/* runtime= */ mock(TransitiveInfoCollection.class),
203-
/* providedProtoSources= */ ImmutableList.of());
207+
/* providedProtoSources= */ ImmutableList.of(),
208+
/* protoc= */ FilesToRunProvider.EMPTY,
209+
/* protocOpts= */ ImmutableList.of());
204210

205211
RuleContext ruleContext =
206212
getRuleContext(getConfiguredTarget("//foo:bar"), collectingAnalysisEnvironment);
@@ -236,7 +242,9 @@ public void commandLine_exports() throws Exception {
236242
/* pluginFormatFlag= */ null,
237243
/* pluginExecutable= */ null,
238244
/* runtime= */ mock(TransitiveInfoCollection.class),
239-
/* providedProtoSources= */ ImmutableList.of());
245+
/* providedProtoSources= */ ImmutableList.of(),
246+
/* protoc= */ FilesToRunProvider.EMPTY,
247+
/* protocOpts= */ ImmutableList.of());
240248
useConfiguration("--strict_proto_deps=OFF");
241249

242250
RuleContext ruleContext =
@@ -307,7 +315,9 @@ public void outReplacementAreLazilyEvaluated() throws Exception {
307315
/* pluginFormatFlag= */ null,
308316
/* pluginExecutable= */ null,
309317
/* runtime= */ mock(TransitiveInfoCollection.class),
310-
/* providedProtoSources= */ ImmutableList.of());
318+
/* providedProtoSources= */ ImmutableList.of(),
319+
/* protoc= */ FilesToRunProvider.EMPTY,
320+
/* protocOpts= */ ImmutableList.of());
311321

312322
RuleContext ruleContext =
313323
getRuleContext(getConfiguredTarget("//foo:bar"), collectingAnalysisEnvironment);
@@ -341,14 +351,18 @@ public void exceptionIfSameName() throws Exception {
341351
/* pluginFormatFlag= */ null,
342352
/* pluginExecutable= */ null,
343353
/* runtime= */ mock(TransitiveInfoCollection.class),
344-
/* providedProtoSources= */ ImmutableList.of());
354+
/* providedProtoSources= */ ImmutableList.of(),
355+
/* protoc= */ FilesToRunProvider.EMPTY,
356+
/* protocOpts= */ ImmutableList.of());
345357
ProtoLangToolchainProvider toolchain2 =
346358
ProtoLangToolchainProvider.create(
347359
"dontcare=%s",
348360
/* pluginFormatFlag= */ null,
349361
/* pluginExecutable= */ null,
350362
/* runtime= */ mock(TransitiveInfoCollection.class),
351-
/* providedProtoSources= */ ImmutableList.of());
363+
/* providedProtoSources= */ ImmutableList.of(),
364+
/* protoc= */ FilesToRunProvider.EMPTY,
365+
/* protocOpts= */ ImmutableList.of());
352366

353367
RuleContext ruleContext =
354368
getRuleContext(getConfiguredTarget("//foo:bar"), collectingAnalysisEnvironment);

src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class ProtoLangToolchainTest extends BuildViewTestCase {
3636
public void setUp() throws Exception {
3737
MockProtoSupport.setupWorkspace(scratch);
3838
MockProtoSupport.setup(mockToolsConfig);
39+
useConfiguration("--protocopt=--myflag");
3940
invalidatePackages();
4041
}
4142

@@ -54,6 +55,11 @@ private void validateProtoLangToolchain(ProtoLangToolchainProvider toolchain) th
5455
"third_party/x/metadata.proto",
5556
"third_party/x/descriptor.proto",
5657
"third_party/x/any.proto");
58+
59+
assertThat(toolchain.protocOpts()).containsExactly("--myflag");
60+
Label protoc = Label.parseAbsoluteUnchecked(ProtoConstants.DEFAULT_PROTOC_LABEL);
61+
assertThat(toolchain.protoc().getExecutable().prettyPrint())
62+
.isEqualTo(protoc.toPathFragment().getPathString());
5763
}
5864

5965
@Test

0 commit comments

Comments
 (0)