diff options
author | Googler <noreply@google.com> | 2017-11-10 00:59:09 +0100 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2017-11-10 23:27:43 +0100 |
commit | d76b395e9f1062a7dafce9fcac9fb85a64ed1bfa (patch) | |
tree | c6de6b6d1c2632d39b728c016358a0fa0b68d486 /src/main/java/com/google/devtools/build/lib/rules | |
parent | d92053661c687bf8d342b6030b8c7427e7c4139b (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/build/lib/rules')
4 files changed, 83 insertions, 12 deletions
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); } |