aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-11-10 00:59:09 +0100
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-11-10 23:27:43 +0100
commitd76b395e9f1062a7dafce9fcac9fb85a64ed1bfa (patch)
treec6de6b6d1c2632d39b728c016358a0fa0b68d486 /src/main/java/com/google/devtools
parentd92053661c687bf8d342b6030b8c7427e7c4139b (diff)
Adjust blaze to allow for integration of one-version checking inside Google. This feature is not yet available for Bazel users.
RELNOTES: n/a PiperOrigin-RevId: 175226288
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java78
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java8
6 files changed, 102 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index aae1f63f2f..c6e5649a9f 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -736,7 +736,6 @@ java_library(
"rules/java/JavaToolchainRule.java",
"rules/java/JavaToolchainSkylarkApiProvider.java",
"rules/java/JvmConfigurationLoader.java",
- "rules/java/OneVersionCheckActionBuilder.java",
"rules/java/ProguardHelper.java",
"rules/java/ProguardLibrary.java",
"rules/java/ProguardLibraryRule.java",
@@ -834,6 +833,7 @@ java_library(
"rules/java/Jvm.java",
"rules/java/MessageBundleProvider.java",
"rules/java/NativeLibraryNestedSetBuilder.java",
+ "rules/java/OneVersionCheckActionBuilder.java",
"rules/java/ProtoJavaApiInfoAspectProvider.java",
"rules/java/ProtoJavaApiInfoProvider.java",
"rules/java/ResourceJarActionBuilder.java",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
index 16c7d059c8..3e8b2fc586 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
@@ -52,6 +52,7 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
import com.google.devtools.build.lib.rules.java.JavaHelper;
import com.google.devtools.build.lib.rules.java.JavaInfo;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
@@ -684,9 +685,23 @@ public class BazelJavaSemantics implements JavaSemantics {
NestedSet<Artifact> classpath,
boolean includeBuildData,
Compression compression,
- Artifact launcher) {
- return DeployArchiveBuilder.defaultSingleJarCommandLine(output, mainClass, manifestLines,
- buildInfoFiles, resources, classpath, includeBuildData, compression, launcher).build();
+ Artifact launcher,
+ boolean usingNativeSinglejar,
+ // Explicitly ignoring params since Bazel doesn't yet support one version
+ OneVersionEnforcementLevel oneVersionEnforcementLevel,
+ Artifact oneVersionWhitelistArtifact) {
+ return DeployArchiveBuilder.defaultSingleJarCommandLineWithoutOneVersion(
+ output,
+ mainClass,
+ manifestLines,
+ buildInfoFiles,
+ resources,
+ classpath,
+ includeBuildData,
+ compression,
+ launcher,
+ usingNativeSinglejar)
+ .build();
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
index 7e4e61ba6f..5ae578951f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
@@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTa
import com.google.devtools.build.lib.collect.IterablesChain;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -65,6 +66,8 @@ public class DeployArchiveBuilder {
@Nullable private Artifact launcher;
@Nullable private Function<Artifact, Artifact> derivedJars = null;
private boolean checkDesugarDeps;
+ private OneVersionEnforcementLevel oneVersionEnforcementLevel = OneVersionEnforcementLevel.OFF;
+ @Nullable private Artifact oneVersionWhitelistArtifact;
/**
* Type of compression to apply to output archive.
@@ -171,6 +174,41 @@ public class DeployArchiveBuilder {
return this;
}
+ /** Whether or not singlejar would attempt to enforce one version of java classes in the jar */
+ public DeployArchiveBuilder setOneVersionEnforcementLevel(
+ OneVersionEnforcementLevel oneVersionEnforcementLevel,
+ @Nullable Artifact oneVersionWhitelistArtifact) {
+ this.oneVersionEnforcementLevel = oneVersionEnforcementLevel;
+ this.oneVersionWhitelistArtifact = oneVersionWhitelistArtifact;
+ return this;
+ }
+
+ public static CustomCommandLine.Builder defaultSingleJarCommandLineWithoutOneVersion(
+ Artifact outputJar,
+ String javaMainClass,
+ ImmutableList<String> deployManifestLines,
+ Iterable<Artifact> buildInfoFiles,
+ ImmutableList<Artifact> classpathResources,
+ NestedSet<Artifact> runtimeClasspath,
+ boolean includeBuildData,
+ Compression compress,
+ Artifact launcher,
+ boolean usingNativeSinglejar) {
+ return defaultSingleJarCommandLine(
+ outputJar,
+ javaMainClass,
+ deployManifestLines,
+ buildInfoFiles,
+ classpathResources,
+ runtimeClasspath,
+ includeBuildData,
+ compress,
+ launcher,
+ usingNativeSinglejar,
+ OneVersionEnforcementLevel.OFF,
+ null);
+ }
+
public static CustomCommandLine.Builder defaultSingleJarCommandLine(
Artifact outputJar,
String javaMainClass,
@@ -180,7 +218,10 @@ public class DeployArchiveBuilder {
NestedSet<Artifact> runtimeClasspath,
boolean includeBuildData,
Compression compress,
- Artifact launcher) {
+ Artifact launcher,
+ boolean usingNativeSinglejar,
+ OneVersionEnforcementLevel oneVersionEnforcementLevel,
+ @Nullable Artifact oneVersionWhitelistArtifact) {
CustomCommandLine.Builder args = CustomCommandLine.builder();
args.addExecPath("--output", outputJar);
@@ -211,7 +252,20 @@ public class DeployArchiveBuilder {
args.addExecPaths("--classpath_resources", classpathResources);
if (runtimeClasspath != null) {
- args.addExecPaths("--sources", runtimeClasspath);
+ if (usingNativeSinglejar) {
+ args.addAll(
+ "--sources", OneVersionCheckActionBuilder.jarAndTargetVectorArg(runtimeClasspath));
+ } else {
+ args.addExecPaths("--sources", runtimeClasspath);
+ }
+ }
+ if (oneVersionEnforcementLevel != OneVersionEnforcementLevel.OFF && usingNativeSinglejar) {
+ args.add("--enforce_one_version");
+ Preconditions.checkNotNull(oneVersionWhitelistArtifact);
+ args.addExecPath("--one_version_whitelist", oneVersionWhitelistArtifact);
+ if (oneVersionEnforcementLevel == OneVersionEnforcementLevel.WARNING) {
+ args.add("--succeed_on_found_violations");
+ }
}
return args;
}
@@ -285,6 +339,15 @@ public class DeployArchiveBuilder {
inputs.add(launcher);
}
+ if (oneVersionEnforcementLevel != OneVersionEnforcementLevel.OFF) {
+ inputs.add(oneVersionWhitelistArtifact);
+ }
+ // If singlejar's name ends with .jar, it is Java application, otherwise it is native.
+ // TODO(asmundak): once https://github.com/bazelbuild/bazel/issues/2241 is fixed (that is,
+ // the native singlejar is used on windows) remove support for the Java implementation
+ Artifact singlejar = getSingleJar(ruleContext);
+ boolean usingNativeSinglejar = !singlejar.getFilename().endsWith(".jar");
+
CommandLine commandLine =
semantics.buildSingleJarCommandLine(
ruleContext.getConfiguration(),
@@ -296,7 +359,10 @@ public class DeployArchiveBuilder {
runtimeClasspath.build(),
includeBuildData,
compression,
- launcher);
+ launcher,
+ usingNativeSinglejar,
+ oneVersionEnforcementLevel,
+ oneVersionWhitelistArtifact);
if (checkDesugarDeps) {
commandLine = CommandLine.concat(commandLine, ImmutableList.of("--check_desugar_deps"));
}
@@ -305,11 +371,7 @@ public class DeployArchiveBuilder {
ResourceSet resourceSet =
ResourceSet.createWithRamCpuIo(/*memoryMb = */200.0, /*cpuUsage = */.2, /*ioUsage=*/.2);
- // If singlejar's name ends with .jar, it is Java application, otherwise it is native.
- // TODO(asmundak): once https://github.com/bazelbuild/bazel/issues/2241 is fixed (that is,
- // the native singlejar is used on windows) remove support for the Java implementation
- Artifact singlejar = getSingleJar(ruleContext);
- if (singlejar.getFilename().endsWith(".jar")) {
+ if (!usingNativeSinglejar) {
ruleContext.registerAction(
new SpawnAction.Builder()
.addTransitiveInputs(inputs.build())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index a011948b7c..0fcac01f50 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -392,6 +392,9 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
runProguard || runfilesSupport == null ? null : runfilesSupport.getRunfilesMiddleman())
.setCompression(runProguard ? UNCOMPRESSED : COMPRESSED)
.setLauncher(launcher)
+ .setOneVersionEnforcementLevel(
+ javaConfig.oneVersionEnforcementLevel(),
+ JavaToolchainProvider.fromRuleContext(ruleContext).getOneVersionWhitelist())
.build();
Artifact unstrippedDeployJar =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index 0dd4ab0b87..c4af1dfd93 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -40,6 +40,7 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplic
import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder.Compression;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizationMode;
+import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
@@ -259,7 +260,10 @@ public interface JavaSemantics {
NestedSet<Artifact> classpath,
boolean includeBuildData,
Compression compression,
- Artifact launcher);
+ Artifact launcher,
+ boolean usingNativeSinglejar,
+ OneVersionEnforcementLevel oneVersionEnforcementLevel,
+ Artifact oneVersionWhitelistArtifact);
/**
* Creates the action that writes the Java executable stub script.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
index bd0cd64561..3595728475 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
@@ -93,9 +93,7 @@ public final class OneVersionCheckActionBuilder {
if (enforcementLevel == OneVersionEnforcementLevel.WARNING) {
oneVersionArgsBuilder.add("--succeed_on_found_violations");
}
- oneVersionArgsBuilder.addAll(
- "--inputs",
- VectorArg.of(jarsToCheck).mapped(OneVersionCheckActionBuilder::jarAndTargetArg));
+ oneVersionArgsBuilder.addAll("--inputs", jarAndTargetVectorArg(jarsToCheck));
CustomCommandLine oneVersionArgs = oneVersionArgsBuilder.build();
ruleContext.registerAction(
new SpawnAction.Builder()
@@ -112,6 +110,10 @@ public final class OneVersionCheckActionBuilder {
return outputArtifact;
}
+ public static VectorArg<String> jarAndTargetVectorArg(NestedSet<Artifact> jarsToCheck) {
+ return VectorArg.of(jarsToCheck).mapped(OneVersionCheckActionBuilder::jarAndTargetArg);
+ }
+
private static String jarAndTargetArg(Artifact jar) {
return jar.getExecPathString() + "," + getArtifactOwnerGeneralizedLabel(jar);
}