Skip to content

Commit 4ff32da

Browse files
iirinaCopybara-Service
authored and
Copybara-Service
committed
Merge outputs in java_common.merge.
RELNOTES: [JavaInfo] Outputs are merged in java_common.merge(). PiperOrigin-RevId: 203474741
1 parent 5947f47 commit 4ff32da

File tree

3 files changed

+92
-3
lines changed

3 files changed

+92
-3
lines changed

src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ public static JavaInfo merge(List<JavaInfo> providers) {
128128
JavaInfo.fetchProvidersFromList(providers, JavaPluginInfoProvider.class);
129129
List<JavaExportsProvider> javaExportsProviders =
130130
JavaInfo.fetchProvidersFromList(providers, JavaExportsProvider.class);
131+
List<JavaRuleOutputJarsProvider> javaRuleOutputJarsProviders =
132+
JavaInfo.fetchProvidersFromList(providers, JavaRuleOutputJarsProvider.class);
131133

132134

133135
Runfiles mergedRunfiles = Runfiles.EMPTY;
@@ -145,9 +147,8 @@ public static JavaInfo merge(List<JavaInfo> providers) {
145147
JavaStrictCompilationArgsProvider.merge(javaStrictCompilationArgsProviders))
146148
.addProvider(
147149
JavaSourceJarsProvider.class, JavaSourceJarsProvider.merge(javaSourceJarsProviders))
148-
// When a rule merges multiple JavaProviders, its purpose is to pass on information, so
149-
// it doesn't have any output jars.
150-
.addProvider(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build())
150+
.addProvider(JavaRuleOutputJarsProvider.class,
151+
JavaRuleOutputJarsProvider.merge(javaRuleOutputJarsProviders))
151152
.addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(mergedRunfiles))
152153
.addProvider(
153154
JavaPluginInfoProvider.class, JavaPluginInfoProvider.merge(javaPluginInfoProviders))

src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.devtools.build.lib.skylarkbuildapi.java.JavaRuleOutputJarsProviderApi;
2828
import com.google.devtools.build.lib.skylarkbuildapi.java.OutputJarApi;
2929
import com.google.devtools.build.lib.syntax.SkylarkList;
30+
import java.util.Collection;
3031
import java.util.stream.Collectors;
3132
import javax.annotation.Nullable;
3233

@@ -150,6 +151,15 @@ public static Builder builder() {
150151
return new Builder();
151152
}
152153

154+
public static JavaRuleOutputJarsProvider merge(
155+
Collection<JavaRuleOutputJarsProvider> providers) {
156+
Builder builder = new Builder();
157+
for (JavaRuleOutputJarsProvider provider : providers) {
158+
builder.addOutputJars(provider.getOutputJars());
159+
}
160+
return builder.build();
161+
}
162+
153163
/**
154164
* Builder for {@link JavaRuleOutputJarsProvider}.
155165
*/

src/test/shell/bazel/bazel_java_test.sh

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,6 +1248,84 @@ EOF
12481248
expect_log "Using type com.google.sandwich.C from an indirect dependency"
12491249
}
12501250

1251+
function test_java_merge_outputs() {
1252+
mkdir -p java/com/google/sandwich
1253+
1254+
cat > java/com/google/sandwich/BUILD << EOF
1255+
load(':java_custom_library.bzl', 'java_custom_library')
1256+
1257+
java_custom_library(
1258+
name = "custom",
1259+
srcs = ["A.java"],
1260+
jar = "libb.jar"
1261+
)
1262+
1263+
java_library(
1264+
name = "b",
1265+
srcs = ["B.java"]
1266+
)
1267+
EOF
1268+
1269+
cat > java/com/google/sandwich/B.java << EOF
1270+
package com.google.sandwich;
1271+
class B {
1272+
public void printB() {
1273+
System.out.println("Message from B");
1274+
}
1275+
}
1276+
EOF
1277+
1278+
cat > java/com/google/sandwich/A.java << EOF
1279+
package com.google.sandwich;
1280+
class A {
1281+
public void printA() {
1282+
System.out.println("Message from A");
1283+
}
1284+
}
1285+
EOF
1286+
1287+
cat > java/com/google/sandwich/java_custom_library.bzl << EOF
1288+
def _impl(ctx):
1289+
compiled_jar = ctx.actions.declare_file("lib" + ctx.label.name + ".jar")
1290+
imported_jar = ctx.files.jar[0];
1291+
1292+
compilation_provider = java_common.compile(
1293+
ctx,
1294+
source_files = ctx.files.srcs,
1295+
output = compiled_jar,
1296+
java_toolchain = ctx.attr._java_toolchain,
1297+
host_javabase = ctx.attr._host_javabase
1298+
)
1299+
1300+
imported_provider = JavaInfo(output_jar = imported_jar, use_ijar=False);
1301+
1302+
final_provider = java_common.merge([compilation_provider, imported_provider])
1303+
1304+
print(final_provider.outputs.jars[0].class_jar)
1305+
print(final_provider.outputs.jars[1].class_jar)
1306+
1307+
return struct(
1308+
files = depset([compiled_jar, imported_jar]),
1309+
providers = [final_provider]
1310+
)
1311+
1312+
java_custom_library = rule(
1313+
implementation = _impl,
1314+
attrs = {
1315+
"srcs": attr.label_list(allow_files=True),
1316+
"jar": attr.label(allow_files=True),
1317+
"_java_toolchain": attr.label(default = Label("@bazel_tools//tools/jdk:toolchain")),
1318+
"_host_javabase": attr.label(default = Label("@bazel_tools//tools/jdk:current_host_java_runtime"))
1319+
},
1320+
fragments = ["java"]
1321+
)
1322+
EOF
1323+
1324+
bazel build java/com/google/sandwich:custom &> "$TEST_log" || fail "Java sandwich build failed"
1325+
expect_log "<generated file java/com/google/sandwich/libcustom.jar>"
1326+
expect_log "<generated file java/com/google/sandwich/libb.jar>"
1327+
}
1328+
12511329
function test_java_common_create_provider_with_ijar() {
12521330
mkdir -p java/com/google/foo
12531331
touch java/com/google/foo/{BUILD,A.java,my_rule.bzl}

0 commit comments

Comments
 (0)