aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD36
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JarOwner.java52
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java31
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/BUILD2
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/DependencyModule.java61
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/StrictJavaDepsPlugin.java60
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/BUILD2
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptions.java23
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptionsParser.java22
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/BUILD1
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/TurbineOptionsTest.java8
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/BUILD1
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java49
-rw-r--r--third_party/BUILD6
14 files changed, 241 insertions, 113 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
index c9c6b24983..ee748b3f03 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
@@ -17,6 +17,10 @@ java_library(
"InvalidCommandLineException.java",
"OptionsParser.java",
],
+ deps = [
+ ":JarOwner",
+ "//third_party:guava",
+ ],
)
java_library(
@@ -40,9 +44,11 @@ java_library(
["*.java"],
exclude = [
"InvalidCommandLineException.java",
+ "JarOwner.java",
],
),
deps = [
+ ":JarOwner",
":invalid_command_line_exception",
":javac",
"//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/jarhelper",
@@ -86,6 +92,21 @@ java_library(
deps = [],
)
+java_library(
+ name = "JarOwner",
+ srcs = ["JarOwner.java"],
+ visibility = [
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:__subpackages__",
+ "//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:__subpackages__",
+ "//src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine:__subpackages__",
+ ],
+ deps = [
+ "//third_party:auto_value",
+ "//third_party:guava",
+ "//third_party:jsr305",
+ ],
+)
+
load("//tools/build_rules:java_rules_skylark.bzl", "bootstrap_java_library", "bootstrap_java_binary")
bootstrap_java_library(
@@ -113,7 +134,10 @@ bootstrap_java_binary(
name = "bootstrap",
srcs = glob(
["**/*.java"],
- exclude = ["java/com/google/devtools/build/buildjar/javac/testing/**"],
+ exclude = [
+ "java/com/google/devtools/build/buildjar/javac/testing/**",
+ "JarOwner.java",
+ ],
),
main_class = "com.google.devtools.build.buildjar.BazelJavaBuilder",
deps = [
@@ -123,6 +147,16 @@ bootstrap_java_binary(
],
)
+bootstrap_java_library(
+ name = "bootstrap_JarOwner",
+ srcs = ["JarOwner.java"],
+ jars = [
+ "//third_party:jsr305-jars",
+ "//third_party:auto_value-jars",
+ "//third_party:guava-jars",
+ ],
+)
+
filegroup(
name = "srcs",
srcs = glob(["**"]) + [
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JarOwner.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JarOwner.java
new file mode 100644
index 0000000000..5c96d79759
--- /dev/null
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JarOwner.java
@@ -0,0 +1,52 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.buildjar;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Function;
+import javax.annotation.Nullable;
+
+/**
+ * Holds information about the Bazel rule that created a certain jar.
+ *
+ * <p>Rules that use Aspects (http://www.bazel.io/docs/skylark/aspects.html) to compile jars will
+ * result in 'aspect()' being populated.
+ */
+@AutoValue
+public abstract class JarOwner {
+
+ /** A long way to say 'JarOwner::label'. */
+ public static final Function<JarOwner, String> LABEL =
+ new Function<JarOwner, String>() {
+ @Nullable
+ @Override
+ public String apply(@Nullable JarOwner jarOwner) {
+ return jarOwner == null ? null : jarOwner.label();
+ }
+ };
+
+ public abstract String label();
+
+ @Nullable
+ public abstract String aspect();
+
+ public static JarOwner create(String label) {
+ return new AutoValue_JarOwner(label, null);
+ }
+
+ public static JarOwner create(String label, String aspect) {
+ return new AutoValue_JarOwner(label, aspect);
+ }
+}
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java
index 987b80926a..5b0a10d1c1 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java
@@ -16,6 +16,8 @@ package com.google.devtools.build.buildjar;
import static java.nio.charset.StandardCharsets.UTF_8;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -36,10 +38,11 @@ import java.util.Set;
* command-line flags and options files and provides them via getters.
*/
public final class OptionsParser {
+ private static final Splitter SPACE_SPLITTER = Splitter.on(' ');
private final List<String> javacOpts = new ArrayList<>();
- private final Map<String, String> directJarsToTargets = new HashMap<>();
- private final Map<String, String> indirectJarsToTargets = new HashMap<>();
+ private final Map<String, JarOwner> directJarsToTargets = new HashMap<>();
+ private final Map<String, JarOwner> indirectJarsToTargets = new HashMap<>();
private String strictJavaDeps;
@@ -108,15 +111,15 @@ public final class OptionsParser {
case "--direct_dependency":
{
String jar = getArgument(argQueue, arg);
- String target = getArgument(argQueue, arg);
- directJarsToTargets.put(jar, target);
+ JarOwner owner = parseJarOwner(getArgument(argQueue, arg));
+ directJarsToTargets.put(jar, owner);
break;
}
case "--indirect_dependency":
{
String jar = getArgument(argQueue, arg);
- String target = getArgument(argQueue, arg);
- indirectJarsToTargets.put(jar, target);
+ JarOwner owner = parseJarOwner(getArgument(argQueue, arg));
+ indirectJarsToTargets.put(jar, owner);
break;
}
case "--strict_java_deps":
@@ -204,6 +207,18 @@ public final class OptionsParser {
}
}
+ private JarOwner parseJarOwner(String line) {
+ List<String> ownerStringParts = SPACE_SPLITTER.splitToList(line);
+ JarOwner owner;
+ Preconditions.checkState(ownerStringParts.size() == 1 || ownerStringParts.size() == 2);
+ if (ownerStringParts.size() == 1) {
+ owner = JarOwner.create(ownerStringParts.get(0));
+ } else {
+ owner = JarOwner.create(ownerStringParts.get(0), ownerStringParts.get(1));
+ }
+ return owner;
+ }
+
/**
* Pre-processes an argument list, expanding options @filename to read in
* the content of the file and add it to the list of arguments.
@@ -302,11 +317,11 @@ public final class OptionsParser {
return javacOpts;
}
- public Map<String, String> getDirectMappings() {
+ public Map<String, JarOwner> getDirectMappings() {
return directJarsToTargets;
}
- public Map<String, String> getIndirectMappings() {
+ public Map<String, JarOwner> getIndirectMappings() {
return indirectJarsToTargets;
}
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/BUILD
index 4ae7b1f696..f3ae58e9d6 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/BUILD
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/BUILD
@@ -25,6 +25,7 @@ java_library(
srcs = glob(["dependency/*.java"]),
deps = [
":plugins",
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:JarOwner",
"//src/main/protobuf:deps_java_proto",
"//third_party:guava",
"//third_party/java/jdk/langtools:javac",
@@ -76,6 +77,7 @@ bootstrap_java_library(
["**/*.java"],
),
deps = [
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:bootstrap_JarOwner",
"//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:bootstrap_invalid_command_line_exception",
"//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:skylark-deps",
],
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/DependencyModule.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/DependencyModule.java
index 974bec3318..98f9f66549 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/DependencyModule.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/DependencyModule.java
@@ -18,10 +18,10 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.base.Verify;
+import com.google.devtools.build.buildjar.JarOwner;
import com.google.devtools.build.buildjar.javac.plugins.BlazeJavaCompilerPlugin;
import com.google.devtools.build.lib.view.proto.Deps;
import com.google.devtools.build.lib.view.proto.Deps.Dependency.Kind;
-
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
@@ -68,8 +68,8 @@ public final class DependencyModule {
}
private final StrictJavaDeps strictJavaDeps;
- private final Map<String, String> directJarsToTargets;
- private final Map<String, String> indirectJarsToTargets;
+ private final Map<String, JarOwner> directJarsToTargets;
+ private final Map<String, JarOwner> indirectJarsToTargets;
private final boolean strictClasspathMode;
private final Set<String> depsArtifacts;
private final String ruleKind;
@@ -82,16 +82,17 @@ public final class DependencyModule {
private final String fixMessage;
private final Set<String> exemptGenerators;
- DependencyModule(StrictJavaDeps strictJavaDeps,
- Map<String, String> directJarsToTargets,
- Map<String, String> indirectJarsToTargets,
- boolean strictClasspathMode,
- Set<String> depsArtifacts,
- String ruleKind,
- String targetLabel,
- String outputDepsProtoFile,
- String fixMessage,
- Set<String> exemptGenerators) {
+ DependencyModule(
+ StrictJavaDeps strictJavaDeps,
+ Map<String, JarOwner> directJarsToTargets,
+ Map<String, JarOwner> indirectJarsToTargets,
+ boolean strictClasspathMode,
+ Set<String> depsArtifacts,
+ String ruleKind,
+ String targetLabel,
+ String outputDepsProtoFile,
+ String fixMessage,
+ Set<String> exemptGenerators) {
this.strictJavaDeps = strictJavaDeps;
this.directJarsToTargets = directJarsToTargets;
this.indirectJarsToTargets = indirectJarsToTargets;
@@ -160,18 +161,18 @@ public final class DependencyModule {
}
/**
- * Returns the mapping for jars of direct dependencies. The keys are full
- * paths (as seen on the classpath), and the values are build target names.
+ * Returns the mapping for jars of direct dependencies. The keys are full paths (as seen on the
+ * classpath), and the values are build target names.
*/
- public Map<String, String> getDirectMapping() {
+ public Map<String, JarOwner> getDirectMapping() {
return directJarsToTargets;
}
/**
- * Returns the mapping for jars of indirect dependencies. The keys are full
- * paths (as seen on the classpath), and the values are build target names.
+ * Returns the mapping for jars of indirect dependencies. The keys are full paths (as seen on the
+ * classpath), and the values are build target names.
*/
- public Map<String, String> getIndirectMapping() {
+ public Map<String, JarOwner> getIndirectMapping() {
return indirectJarsToTargets;
}
@@ -315,8 +316,8 @@ public final class DependencyModule {
public static class Builder {
private StrictJavaDeps strictJavaDeps = StrictJavaDeps.OFF;
- private final Map<String, String> directJarsToTargets = new HashMap<>();
- private final Map<String, String> indirectJarsToTargets = new HashMap<>();
+ private final Map<String, JarOwner> directJarsToTargets = new HashMap<>();
+ private final Map<String, JarOwner> indirectJarsToTargets = new HashMap<>();
private final Set<String> depsArtifacts = new HashSet<>();
private String ruleKind;
private String targetLabel;
@@ -381,25 +382,13 @@ public final class DependencyModule {
}
/**
- * Adds a direct mapping to the existing map for direct dependencies.
- *
- * @param jar path of jar artifact, as seen on classpath.
- * @param target full name of build target providing the jar.
- * @return this Builder instance.
- */
- public Builder addDirectMapping(String jar, String target) {
- directJarsToTargets.put(jar, target);
- return this;
- }
-
- /**
* Adds direct mappings to the existing map for direct dependencies.
*
* @param directMappings a map of paths of jar artifacts, as seen on classpath, to full names of
* build targets providing the jar.
* @return this Builder instance
*/
- public Builder addDirectMappings(Map<String, String> directMappings) {
+ public Builder addDirectMappings(Map<String, JarOwner> directMappings) {
directJarsToTargets.putAll(directMappings);
return this;
}
@@ -411,7 +400,7 @@ public final class DependencyModule {
* @param target full name of build target providing the jar.
* @return this Builder instance
*/
- public Builder addIndirectMapping(String jar, String target) {
+ public Builder addIndirectMapping(String jar, JarOwner target) {
indirectJarsToTargets.put(jar, target);
return this;
}
@@ -423,7 +412,7 @@ public final class DependencyModule {
* of build targets providing the jar.
* @return this Builder instance
*/
- public Builder addIndirectMappings(Map<String, String> indirectMappings) {
+ public Builder addIndirectMappings(Map<String, JarOwner> indirectMappings) {
indirectJarsToTargets.putAll(indirectMappings);
return this;
}
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/StrictJavaDepsPlugin.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/StrictJavaDepsPlugin.java
index d00bdd8be0..a32976e0de 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/StrictJavaDepsPlugin.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins/dependency/StrictJavaDepsPlugin.java
@@ -18,11 +18,12 @@ import static com.google.devtools.build.buildjar.javac.plugins.dependency.Depend
import static com.google.devtools.build.buildjar.javac.plugins.dependency.ImplicitDependencyExtractor.getPlatformJars;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Ordering;
+import com.google.devtools.build.buildjar.JarOwner;
import com.google.devtools.build.buildjar.javac.plugins.BlazeJavaCompilerPlugin;
import com.google.devtools.build.buildjar.javac.plugins.dependency.DependencyModule.StrictJavaDeps;
import com.google.devtools.build.lib.view.proto.Deps;
import com.google.devtools.build.lib.view.proto.Deps.Dependency;
-
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Symbol;
@@ -35,7 +36,6 @@ import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Log.WriterKind;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@@ -44,8 +44,6 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import java.util.TreeSet;
-
import javax.annotation.Generated;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
@@ -75,7 +73,7 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
private final Set<JCTree> trees;
/** Computed missing dependencies */
- private final Set<String> missingTargets;
+ private final Set<JarOwner> missingTargets;
private static Properties targetMap;
@@ -100,7 +98,7 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
toplevels = new HashSet<>();
trees = new HashSet<>();
targetMap = new Properties();
- missingTargets = new TreeSet<>();
+ missingTargets = new HashSet<>();
}
@Override
@@ -161,8 +159,9 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
if (!missingTargets.isEmpty()) {
StringBuilder missingTargetsStr = new StringBuilder();
- for (String target : missingTargets) {
- missingTargetsStr.append(target);
+ for (JarOwner owner :
+ Ordering.natural().onResultOf(JarOwner.LABEL).immutableSortedCopy(missingTargets)) {
+ missingTargetsStr.append(canonicalizeTarget(owner.label()));
missingTargetsStr.append(" ");
}
String canonicalizedLabel;
@@ -189,12 +188,12 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
*/
private static class CheckingTreeScanner extends TreeScanner {
- private static final String transitiveDepMessage =
+ private static final String TRANSITIVE_DEP_MESSAGE =
"[strict] Using type {0} from an indirect dependency (TOOL_INFO: \"{1}\"). "
+ "See command below **";
/** Lookup for jars coming from transitive dependencies */
- private final Map<String, String> indirectJarsToTargets;
+ private final Map<String, JarOwner> indirectJarsToTargets;
/** All error reporting is done through javac's log, */
private final Log log;
@@ -206,14 +205,14 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
private final StrictJavaDeps strictJavaDepsMode;
/** Missing targets */
- private final Set<String> missingTargets;
+ private final Set<JarOwner> missingTargets;
/** Collect seen direct dependencies and their associated information */
private final Map<String, Deps.Dependency> directDependenciesMap;
/** We only emit one warning/error per class symbol */
private final Set<ClassSymbol> seenClasses = new HashSet<>();
- private final Set<String> seenTargets = new HashSet<>();
+ private final Set<JarOwner> seenTargets = new HashSet<>();
/** The set of jars on the compilation bootclasspath. */
private final Set<String> platformJars;
@@ -224,8 +223,12 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
/** Was the node being visited generated by an exempt annotation processor? */
private boolean isStrictDepsExempt = false;
- public CheckingTreeScanner(DependencyModule dependencyModule, Log log,
- Set<String> missingTargets, Set<String> platformJars, JavaFileManager fileManager) {
+ public CheckingTreeScanner(
+ DependencyModule dependencyModule,
+ Log log,
+ Set<JarOwner> missingTargets,
+ Set<String> platformJars,
+ JavaFileManager fileManager) {
this.indirectJarsToTargets = dependencyModule.getIndirectMapping();
this.strictJavaDepsMode = dependencyModule.getStrictJavaDeps();
this.log = log;
@@ -266,18 +269,27 @@ public final class StrictJavaDepsPlugin extends BlazeJavaCompilerPlugin {
*/
private void collectExplicitDependency(String jarName, JCTree node, Symbol.TypeSymbol sym) {
if (strictJavaDepsMode.isEnabled() && !isStrictDepsExempt) {
- // Does it make sense to emit a warning/error for this pair of (type, target)?
- // We want to emit only one error/warning per target.
- String target = indirectJarsToTargets.get(jarName);
- if (target != null && seenTargets.add(target)) {
- String canonicalTargetName = canonicalizeTarget(target);
- missingTargets.add(canonicalTargetName);
+ // Does it make sense to emit a warning/error for this pair of (type, owner)?
+ // We want to emit only one error/warning per owner.
+ JarOwner owner = indirectJarsToTargets.get(jarName);
+ if (owner != null && seenTargets.add(owner)) {
+ // owner is of the form "//label/of:rule <Aspect name>" where <Aspect name> is optional.
+ String canonicalTargetName = canonicalizeTarget(owner.label());
+ missingTargets.add(owner);
+ String toolInfo =
+ owner.aspect() == null
+ ? canonicalTargetName
+ : String.format("%s with aspect %s", canonicalTargetName, owner.aspect());
if (strictJavaDepsMode == ERROR) {
- log.error(node.pos, "proc.messager",
- MessageFormat.format(transitiveDepMessage, sym, canonicalTargetName));
+ log.error(
+ node.pos,
+ "proc.messager",
+ MessageFormat.format(TRANSITIVE_DEP_MESSAGE, sym, toolInfo));
} else {
- log.warning(node.pos, "proc.messager",
- MessageFormat.format(transitiveDepMessage, sym, canonicalTargetName));
+ log.warning(
+ node.pos,
+ "proc.messager",
+ MessageFormat.format(TRANSITIVE_DEP_MESSAGE, sym, toolInfo));
}
}
}
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/BUILD
index 567080e8f9..5253ec47c6 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/BUILD
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/BUILD
@@ -18,6 +18,7 @@ java_library(
name = "turbine_options",
srcs = ["TurbineOptions.java"],
deps = [
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:JarOwner",
"//third_party:guava",
"//third_party:jsr305",
],
@@ -28,6 +29,7 @@ java_library(
srcs = ["TurbineOptionsParser.java"],
deps = [
":turbine_options",
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:JarOwner",
"//third_party:guava",
"//third_party:jsr305",
],
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptions.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptions.java
index 84c7e7c23e..7aa4e7e874 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptions.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptions.java
@@ -20,7 +20,7 @@ import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-
+import com.google.devtools.build.buildjar.JarOwner;
import javax.annotation.Nullable;
/** Header compilation options. */
@@ -36,8 +36,8 @@ public class TurbineOptions {
private final String tempDir;
private final ImmutableList<String> sourceJars;
private final Optional<String> outputDeps;
- private final ImmutableMap<String, String> directJarsToTargets;
- private final ImmutableMap<String, String> indirectJarsToTargets;
+ private final ImmutableMap<String, JarOwner> directJarsToTargets;
+ private final ImmutableMap<String, JarOwner> indirectJarsToTargets;
private final Optional<String> targetLabel;
private final ImmutableList<String> depsArtifacts;
private final Optional<String> ruleKind;
@@ -54,8 +54,8 @@ public class TurbineOptions {
String tempDir,
ImmutableList<String> sourceJars,
@Nullable String outputDeps,
- ImmutableMap<String, String> directJarsToTargets,
- ImmutableMap<String, String> indirectJarsToTargets,
+ ImmutableMap<String, JarOwner> directJarsToTargets,
+ ImmutableMap<String, JarOwner> indirectJarsToTargets,
@Nullable String targetLabel,
ImmutableList<String> depsArtifacts,
@Nullable String ruleKind,
@@ -135,12 +135,12 @@ public class TurbineOptions {
}
/** The mapping from the path to a direct dependency to its build label. */
- public ImmutableMap<String, String> directJarsToTargets() {
+ public ImmutableMap<String, JarOwner> directJarsToTargets() {
return directJarsToTargets;
}
/** The mapping from the path to an indirect dependency to its build label. */
- public ImmutableMap<String, String> indirectJarsToTargets() {
+ public ImmutableMap<String, JarOwner> indirectJarsToTargets() {
return indirectJarsToTargets;
}
@@ -181,8 +181,9 @@ public class TurbineOptions {
private final ImmutableList.Builder<String> sourceJars = ImmutableList.builder();
private final ImmutableList.Builder<String> bootClassPath = ImmutableList.builder();
private String outputDeps;
- private final ImmutableMap.Builder<String, String> directJarsToTargets = ImmutableMap.builder();
- private final ImmutableMap.Builder<String, String> indirectJarsToTargets =
+ private final ImmutableMap.Builder<String, JarOwner> directJarsToTargets =
+ ImmutableMap.builder();
+ private final ImmutableMap.Builder<String, JarOwner> indirectJarsToTargets =
ImmutableMap.builder();
@Nullable private String targetLabel;
private final ImmutableList.Builder<String> depsArtifacts = ImmutableList.builder();
@@ -259,12 +260,12 @@ public class TurbineOptions {
return this;
}
- public Builder addDirectJarToTarget(String jar, String target) {
+ public Builder addDirectJarToTarget(String jar, JarOwner target) {
directJarsToTargets.put(jar, target);
return this;
}
- public Builder addIndirectJarToTarget(String jar, String target) {
+ public Builder addIndirectJarToTarget(String jar, JarOwner target) {
indirectJarsToTargets.put(jar, target);
return this;
}
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptionsParser.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptionsParser.java
index a3b4723004..5ef5bbe638 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptionsParser.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/TurbineOptionsParser.java
@@ -17,20 +17,22 @@ package com.google.devtools.build.java.turbine;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.base.CharMatcher;
+import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
-
+import com.google.devtools.build.buildjar.JarOwner;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayDeque;
import java.util.Deque;
-
+import java.util.List;
import javax.annotation.Nullable;
/** A command line options parser for {@link TurbineOptions}. */
public class TurbineOptionsParser {
+ private static final Splitter SPACE_SPLITTER = Splitter.on(' ');
/**
* Parses command line options into {@link TurbineOptions}, expanding any {@code @params}
@@ -115,14 +117,14 @@ public class TurbineOptionsParser {
{
String jar = readOne(argumentDeque);
String target = readOne(argumentDeque);
- builder.addDirectJarToTarget(jar, target);
+ builder.addDirectJarToTarget(jar, parseJarOwner(target));
break;
}
case "--indirect_dependency":
{
String jar = readOne(argumentDeque);
String target = readOne(argumentDeque);
- builder.addIndirectJarToTarget(jar, target);
+ builder.addIndirectJarToTarget(jar, parseJarOwner(target));
break;
}
case "--deps_artifacts":
@@ -142,6 +144,18 @@ public class TurbineOptionsParser {
}
}
+ private static JarOwner parseJarOwner(String line) {
+ List<String> ownerStringParts = SPACE_SPLITTER.splitToList(line);
+ JarOwner owner;
+ Preconditions.checkState(ownerStringParts.size() == 1 || ownerStringParts.size() == 2);
+ if (ownerStringParts.size() == 1) {
+ owner = JarOwner.create(ownerStringParts.get(0));
+ } else {
+ owner = JarOwner.create(ownerStringParts.get(0), ownerStringParts.get(1));
+ }
+ return owner;
+ }
+
/** Returns the value of an option, or {@code null}. */
@Nullable
private static String readOne(Deque<String> argumentDeque) {
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/BUILD b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/BUILD
index 317b03b2ae..32c3611eeb 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/BUILD
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/BUILD
@@ -16,6 +16,7 @@ java_test(
srcs = ["TurbineOptionsTest.java"],
tags = ["jdk8"],
deps = [
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:JarOwner",
"//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:turbine_options",
"//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:turbine_options_parser",
"//third_party:guava",
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/TurbineOptionsTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/TurbineOptionsTest.java
index a29ed27c01..ef2fa0e417 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/TurbineOptionsTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/TurbineOptionsTest.java
@@ -17,6 +17,7 @@ package com.google.devtools.build.java.turbine;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
+import com.google.devtools.build.buildjar.JarOwner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
@@ -129,12 +130,13 @@ public class TurbineOptionsTest {
assertThat(options.targetLabel()).hasValue("//java/com/google/test");
assertThat(options.directJarsToTargets())
- .containsExactlyEntriesIn(ImmutableMap.of("blaze-out/foo/libbar.jar", "//foo/bar"));
+ .containsExactlyEntriesIn(
+ ImmutableMap.of("blaze-out/foo/libbar.jar", JarOwner.create("//foo/bar")));
assertThat(options.indirectJarsToTargets())
.containsExactlyEntriesIn(
ImmutableMap.of(
- "blaze-out/foo/libbaz1.jar", "//foo/baz1",
- "blaze-out/foo/libbaz2.jar", "//foo/baz2"));
+ "blaze-out/foo/libbaz1.jar", JarOwner.create("//foo/baz1"),
+ "blaze-out/foo/libbaz2.jar", JarOwner.create("//foo/baz2")));
assertThat(options.depsArtifacts()).containsExactly("foo.jdeps", "bar.jdeps");
}
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/BUILD b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/BUILD
index 2127783f7f..9e2cd2be1a 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/BUILD
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/BUILD
@@ -16,6 +16,7 @@ java_test(
],
tags = ["jdk8"],
deps = [
+ "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:JarOwner",
"//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:turbine_options",
"//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac:javac_turbine",
"//src/main/protobuf:deps_java_proto",
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
index 0f20f16112..d657ab0fa8 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
@@ -24,11 +24,11 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.io.ByteStreams;
+import com.google.devtools.build.buildjar.JarOwner;
import com.google.devtools.build.java.turbine.TurbineOptions;
import com.google.devtools.build.java.turbine.javac.JavacTurbine.Result;
import com.google.devtools.build.lib.view.proto.Deps;
import com.google.devtools.build.lib.view.proto.Deps.Dependency;
-
import com.sun.source.tree.LiteralTree;
import com.sun.source.util.JavacTask;
import com.sun.source.util.TaskEvent;
@@ -39,17 +39,6 @@ import com.sun.tools.javac.api.ClientCodeWrapper.Trusted;
import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Context;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.util.Textifier;
-import org.objectweb.asm.util.TraceClassVisitor;
-
import java.io.BufferedInputStream;
import java.io.IOError;
import java.io.IOException;
@@ -75,7 +64,6 @@ import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
-
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
@@ -88,6 +76,15 @@ import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardLocation;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.util.Textifier;
+import org.objectweb.asm.util.TraceClassVisitor;
/** Unit tests for {@link JavacTurbine}. */
@RunWith(JUnit4.class)
@@ -408,9 +405,9 @@ public class JavacTurbineTest {
optionsBuilder.addClassPathEntries(
ImmutableList.of(libA.toString(), libB.toString(), libC.toString()));
optionsBuilder.addAllDepsArtifacts(ImmutableList.of(depsA.toString()));
- optionsBuilder.addDirectJarToTarget(libA.toString(), "//lib:a");
- optionsBuilder.addDirectJarToTarget(libB.toString(), "//lib:b");
- optionsBuilder.addIndirectJarToTarget(libC.toString(), "//lib:c");
+ optionsBuilder.addDirectJarToTarget(libA.toString(), JarOwner.create("//lib:a"));
+ optionsBuilder.addDirectJarToTarget(libB.toString(), JarOwner.create("//lib:b"));
+ optionsBuilder.addIndirectJarToTarget(libC.toString(), JarOwner.create("//lib:c"));
optionsBuilder.setTargetLabel("//my:target");
addSourceLines(
@@ -543,10 +540,10 @@ public class JavacTurbineTest {
optionsBuilder.addClassPathEntries(
ImmutableList.of(libA.toString(), libB.toString(), libC.toString(), libD.toString()));
optionsBuilder.addAllDepsArtifacts(ImmutableList.of(depsA.toString()));
- optionsBuilder.addDirectJarToTarget(libA.toString(), "//lib:a");
- optionsBuilder.addIndirectJarToTarget(libB.toString(), "//lib:b");
- optionsBuilder.addIndirectJarToTarget(libC.toString(), "//lib:c");
- optionsBuilder.addIndirectJarToTarget(libD.toString(), "//lib:d");
+ optionsBuilder.addDirectJarToTarget(libA.toString(), JarOwner.create("//lib:a"));
+ optionsBuilder.addIndirectJarToTarget(libB.toString(), JarOwner.create("//lib:b"));
+ optionsBuilder.addIndirectJarToTarget(libC.toString(), JarOwner.create("//lib:c"));
+ optionsBuilder.addIndirectJarToTarget(libD.toString(), JarOwner.create("//lib:d"));
optionsBuilder.setTargetLabel("//my:target");
addSourceLines(
@@ -635,10 +632,10 @@ public class JavacTurbineTest {
optionsBuilder.addClassPathEntries(
ImmutableList.of(libA.toString(), libB.toString(), libC.toString(), libD.toString()));
optionsBuilder.addAllDepsArtifacts(ImmutableList.of(depsA.toString()));
- optionsBuilder.addDirectJarToTarget(libA.toString(), "//lib:a");
- optionsBuilder.addIndirectJarToTarget(libB.toString(), "//lib:b");
- optionsBuilder.addIndirectJarToTarget(libC.toString(), "//lib:c");
- optionsBuilder.addIndirectJarToTarget(libD.toString(), "//lib:d");
+ optionsBuilder.addDirectJarToTarget(libA.toString(), JarOwner.create("//lib:a"));
+ optionsBuilder.addIndirectJarToTarget(libB.toString(), JarOwner.create("//lib:b"));
+ optionsBuilder.addIndirectJarToTarget(libC.toString(), JarOwner.create("//lib:c"));
+ optionsBuilder.addIndirectJarToTarget(libD.toString(), JarOwner.create("//lib:d"));
optionsBuilder.setTargetLabel("//my:target");
addSourceLines(
@@ -1231,7 +1228,7 @@ public class JavacTurbineTest {
"}");
optionsBuilder.addClassPathEntries(Collections.singleton(deps.toString()));
- optionsBuilder.addDirectJarToTarget(deps.toString(), "//deps");
+ optionsBuilder.addDirectJarToTarget(deps.toString(), JarOwner.create("//deps"));
compile();
Map<String, byte[]> outputs = collectOutputs();
@@ -1252,7 +1249,7 @@ public class JavacTurbineTest {
"import " + Lib.class.getCanonicalName() + ";",
"class Hello extends Lib {}");
- optionsBuilder.addIndirectJarToTarget(lib.toString(), "//lib");
+ optionsBuilder.addIndirectJarToTarget(lib.toString(), JarOwner.create("//lib"));
optionsBuilder.addClassPathEntries(ImmutableList.of(lib.toString()));
optionsBuilder.addSources(ImmutableList.copyOf(Iterables.transform(sources, TO_STRING)));
diff --git a/third_party/BUILD b/third_party/BUILD
index 87c45bfdb4..bedcb021f5 100644
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -220,6 +220,12 @@ java_import(
jars = ["auto/auto-value-1.2.jar"],
)
+# For bootstrapping JavaBuilder
+filegroup(
+ name = "auto_value-jars",
+ srcs = ["auto/auto-value-1.2.jar"],
+)
+
java_library(
name = "dagger",
exported_plugins = [":dagger_plugin"],