From d76b395e9f1062a7dafce9fcac9fb85a64ed1bfa Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 10 Nov 2017 00:59:09 +0100 Subject: 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 --- src/main/java/com/google/devtools/build/lib/BUILD | 2 +- .../lib/bazel/rules/java/BazelJavaSemantics.java | 21 +++++- .../build/lib/rules/java/DeployArchiveBuilder.java | 78 +++++++++++++++++++--- .../devtools/build/lib/rules/java/JavaBinary.java | 3 + .../build/lib/rules/java/JavaSemantics.java | 6 +- .../rules/java/OneVersionCheckActionBuilder.java | 8 ++- 6 files changed, 102 insertions(+), 16 deletions(-) (limited to 'src/main/java/com/google/devtools') 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 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 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 deployManifestLines, + Iterable buildInfoFiles, + ImmutableList classpathResources, + NestedSet 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 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 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 jarAndTargetVectorArg(NestedSet jarsToCheck) { + return VectorArg.of(jarsToCheck).mapped(OneVersionCheckActionBuilder::jarAndTargetArg); + } + private static String jarAndTargetArg(Artifact jar) { return jar.getExecPathString() + "," + getArtifactOwnerGeneralizedLabel(jar); } -- cgit v1.2.3