Skip to content

Commit

Permalink
Check that java_import dependencies are complete
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 439968050
  • Loading branch information
cushon authored and copybara-github committed Apr 6, 2022
1 parent 9db58e0 commit bbf34eb
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
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.rules.java.JavaConfiguration.ImportDepsCheckingLevel;
import java.util.stream.Collectors;

Expand All @@ -40,6 +42,7 @@ public static ImportDepsCheckActionBuilder newBuilder() {
private NestedSet<Artifact> declaredDeps;
private NestedSet<Artifact> transitiveDeps;
private ImportDepsCheckingLevel importDepsCheckingLevel;
private Artifact importDepsChecker;

private ImportDepsCheckActionBuilder() {}

Expand Down Expand Up @@ -86,6 +89,12 @@ public ImportDepsCheckActionBuilder transitiveDeps(NestedSet<Artifact> transitiv
return this;
}

public ImportDepsCheckActionBuilder importDepsChecker(Artifact importDepsChecker) {
checkState(this.importDepsChecker == null);
this.importDepsChecker = checkNotNull(importDepsChecker);
return this;
}

public void buildAndRegister(RuleContext ruleContext) {
checkNotNull(jarsToCheck);
checkNotNull(bootclasspath);
Expand All @@ -95,10 +104,20 @@ public void buildAndRegister(RuleContext ruleContext) {
checkNotNull(jdepsArtifact);
checkNotNull(ruleLabel);

SpawnAction.Builder builder = new SpawnAction.Builder();
if (importDepsChecker == null) {
builder.setExecutable(ruleContext.getExecutablePrerequisite("$import_deps_checker"));
} else {
builder
.addTransitiveInputs(JavaRuntimeInfo.forHost(ruleContext).javaBaseInputs())
.setJarExecutable(
JavaCommon.getHostJavaExecutable(ruleContext),
importDepsChecker,
NestedSetBuilder.emptySet(Order.STABLE_ORDER));
}
ruleContext.registerAction(
new SpawnAction.Builder()
builder
.useDefaultShellEnvironment()
.setExecutable(ruleContext.getExecutablePrerequisite("$import_deps_checker"))
.addTransitiveInputs(jarsToCheck)
.addTransitiveInputs(declaredDeps)
.addTransitiveInputs(transitiveDeps)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.analysis.Allowlist;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.OutputGroupInfo;
Expand All @@ -31,6 +32,7 @@
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.rules.java.JavaConfiguration.ImportDepsCheckingLevel;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.JavaOutput;
import java.util.LinkedHashSet;
import java.util.Set;
Expand Down Expand Up @@ -87,6 +89,28 @@ public ConfiguredTarget create(RuleContext ruleContext)
srcJars = ImmutableList.of(srcJar);
}

Artifact jdepsArtifact = null;
JavaToolchainProvider toolchain = JavaToolchainProvider.from(ruleContext);
Artifact depsChecker = toolchain.depsChecker();
if (Allowlist.hasAllowlist(ruleContext, "java_import_deps_checking")
&& !Allowlist.isAvailable(ruleContext, "java_import_deps_checking")
&& !jars.isEmpty()
&& depsChecker != null) {
jdepsArtifact =
ruleContext.getUniqueDirectoryArtifact(
"_java_import", "jdeps.proto", ruleContext.getBinOrGenfilesDirectory());
ImportDepsCheckActionBuilder.newBuilder()
.importDepsChecker(depsChecker)
.bootclasspath(toolchain.getBootclasspath().bootclasspath())
.declareDeps(getCompileTimeJarsFromCollection(targets, /*isDirect=*/ true))
.transitiveDeps(getCompileTimeJarsFromCollection(targets, /*isDirect=*/ false))
.checkJars(NestedSetBuilder.wrap(Order.STABLE_ORDER, jars))
.importDepsCheckingLevel(ImportDepsCheckingLevel.ERROR)
.jdepsOutputArtifact(jdepsArtifact)
.ruleLabel(ruleContext.getLabel())
.buildAndRegister(ruleContext);
}

// The "neverlink" attribute is transitive, so if it is enabled, we don't add any
// runfiles from this target or its dependencies.
Runfiles runfiles =
Expand Down Expand Up @@ -141,6 +165,10 @@ public ConfiguredTarget create(RuleContext ruleContext)
.setNeverlink(neverLink)
.build();

if (jdepsArtifact != null) {
ruleBuilder.addOutputGroup(OutputGroupInfo.VALIDATION, jdepsArtifact);
}

return ruleBuilder
.setFilesToBuild(filesToBuild)
.addNativeDeclaredProvider(javaInfo)
Expand All @@ -154,6 +182,12 @@ public ConfiguredTarget create(RuleContext ruleContext)
.build();
}

private static NestedSet<Artifact> getCompileTimeJarsFromCollection(
ImmutableList<TransitiveInfoCollection> deps, boolean isDirect) {
JavaCompilationArgsProvider provider = JavaCompilationArgsProvider.legacyFromTargets(deps);
return isDirect ? provider.getDirectCompileTimeJars() : provider.getTransitiveCompileTimeJars();
}

private NestedSet<Artifact> collectTransitiveJavaSourceJars(
RuleContext ruleContext, Artifact srcJar) {
NestedSetBuilder<Artifact> transitiveJavaSourceJarBuilder = NestedSetBuilder.stableOrder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public ConfiguredTarget create(RuleContext ruleContext)
Artifact oneVersion = ruleContext.getPrerequisiteArtifact("oneversion");
Artifact oneVersionAllowlist = ruleContext.getPrerequisiteArtifact("oneversion_whitelist");
Artifact genClass = ruleContext.getPrerequisiteArtifact("genclass");
Artifact depsChecker = ruleContext.getPrerequisiteArtifact("deps_checker");
Artifact resourceJarBuilder = ruleContext.getPrerequisiteArtifact("resourcejar");
Artifact timezoneData = ruleContext.getPrerequisiteArtifact("timezone_data");
FilesToRunProvider ijar = ruleContext.getExecutablePrerequisite("ijar");
Expand Down Expand Up @@ -174,6 +175,7 @@ public ConfiguredTarget create(RuleContext ruleContext)
oneVersion,
oneVersionAllowlist,
genClass,
depsChecker,
resourceJarBuilder,
timezoneData,
ijar,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ public static JavaToolchainProvider create(
@Nullable Artifact oneVersion,
@Nullable Artifact oneVersionAllowlist,
Artifact genClass,
@Nullable Artifact depsChecker,
@Nullable Artifact resourceJarBuilder,
@Nullable Artifact timezoneData,
FilesToRunProvider ijar,
Expand All @@ -132,6 +133,7 @@ public static JavaToolchainProvider create(
oneVersion,
oneVersionAllowlist,
genClass,
depsChecker,
resourceJarBuilder,
timezoneData,
ijar,
Expand Down Expand Up @@ -163,6 +165,7 @@ public static JavaToolchainProvider create(
@Nullable private final Artifact oneVersion;
@Nullable private final Artifact oneVersionAllowlist;
private final Artifact genClass;
@Nullable private final Artifact depsChecker;
@Nullable private final Artifact resourceJarBuilder;
@Nullable private final Artifact timezoneData;
private final FilesToRunProvider ijar;
Expand Down Expand Up @@ -194,6 +197,7 @@ private JavaToolchainProvider(
@Nullable Artifact oneVersion,
@Nullable Artifact oneVersionAllowlist,
Artifact genClass,
@Nullable Artifact depsChecker,
@Nullable Artifact resourceJarBuilder,
@Nullable Artifact timezoneData,
FilesToRunProvider ijar,
Expand Down Expand Up @@ -224,6 +228,7 @@ private JavaToolchainProvider(
this.oneVersion = oneVersion;
this.oneVersionAllowlist = oneVersionAllowlist;
this.genClass = genClass;
this.depsChecker = depsChecker;
this.resourceJarBuilder = resourceJarBuilder;
this.timezoneData = timezoneData;
this.ijar = ijar;
Expand Down Expand Up @@ -337,6 +342,12 @@ public Artifact getGenClass() {
return genClass;
}

/** Returns the {@link Artifact} of the ImportDepsChecker deploy jar */
@Nullable
public Artifact depsChecker() {
return depsChecker;
}

@Nullable
public Artifact getResourceJarBuilder() {
return resourceJarBuilder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,15 @@ The Java target version (e.g., '6' or '7'). It specifies for which Java runtime
.cfg(ExecutionTransitionFactory.create())
.allowedFileTypes(FileTypeSet.ANY_FILE)
.exec())
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(deps_checker) -->
Label of the ImportDepsChecker deploy jar.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(
attr("deps_checker", LABEL_LIST)
.singleArtifact()
.cfg(ExecutionTransitionFactory.create())
.allowedFileTypes(FileTypeSet.ANY_FILE)
.exec())
/* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(resourcejar) -->
Label of the resource jar builder executable.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
Expand Down

0 comments on commit bbf34eb

Please sign in to comment.