diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JavaLibraryBuildRequest.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JavaLibraryBuildRequest.java index ece6484ba2880f..7d5b77c15a65ab 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JavaLibraryBuildRequest.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/JavaLibraryBuildRequest.java @@ -55,6 +55,7 @@ public final class JavaLibraryBuildRequest { /** Resource files that should be put in the root of the output jar. */ private final ImmutableList rootResourceFiles; + private final String sourcePath; private final String classPath; private final String bootClassPath; private final String extdir; @@ -152,6 +153,7 @@ public JavaLibraryBuildRequest( this.resourceJars = ImmutableList.copyOf(optionsParser.getResourceJars()); this.rootResourceFiles = ImmutableList.copyOf(optionsParser.getRootResourceFiles()); this.classPath = optionsParser.getClassPath(); + this.sourcePath = optionsParser.getSourcePath(); this.bootClassPath = optionsParser.getBootClassPath(); this.extdir = optionsParser.getExtdir(); this.processorPath = optionsParser.getProcessorPath(); @@ -197,6 +199,10 @@ public String getSourceGenDir() { return sourceGenDir; } + public String getSourcePath() { + return sourcePath; + } + public String getGeneratedSourcesOutputJar() { return generatedSourcesOutputJar; } @@ -293,6 +299,7 @@ public BlazeJavacArguments toBlazeJavacArguments(final String classPath) { .javacOptions(makeJavacArguments()) .sourceFiles(ImmutableList.copyOf(getSourceFiles())) .processors(null) + .sourcePath(toPaths(getSourcePath())) .sourceOutput(getSourceGenDir() != null ? Paths.get(getSourceGenDir()) : null) .processorPath(toPaths(getProcessorPath())) .plugins(getPlugins()) 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 7815284fd6d7fb..a2556b17bf4466 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 @@ -65,6 +65,7 @@ public final class OptionsParser { private final List rootResourceFiles = new ArrayList<>(); private String classPath = ""; + private String sourcePath; private String bootClassPath; private String extdir; @@ -109,6 +110,7 @@ private void processCommandlineArgs(Deque argQueue) throws InvalidComman // terminator to the passed arguments. collectFlagArguments(javacOpts, argQueue, "--"); bootClassPathFromJavacOpts(); + sourcePathFromJavacOpts(); break; case "--direct_dependency": { @@ -169,6 +171,10 @@ private void processCommandlineArgs(Deque argQueue) throws InvalidComman case "--classpath": classPath = getArgument(argQueue, arg); break; + // TODO(#970): Consider wether we want to use --sourcepath for resolving of #970. + case "--sourcepath": + sourcePath = getArgument(argQueue, arg); + break; case "--bootclasspath": bootClassPath = getArgument(argQueue, arg); break; @@ -332,6 +338,19 @@ private void bootClassPathFromJavacOpts() { } } + // TODO(#970): Delete that function (either set --sourcepath from Bazel or just drop support). + private void sourcePathFromJavacOpts() { + Iterator it = javacOpts.iterator(); + while (it.hasNext()) { + String curr = it.next(); + if (curr.equals("-sourcepath") && it.hasNext()) { + it.remove(); + sourcePath = it.next(); + it.remove(); + } + } + } + public List getJavacOpts() { return javacOpts; } @@ -408,6 +427,10 @@ public String getBootClassPath() { return bootClassPath; } + public String getSourcePath() { + return sourcePath; + } + public String getExtdir() { return extdir; } diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacArguments.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacArguments.java index 06c3e1c8eef307..f4da51ca7ac2a1 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacArguments.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacArguments.java @@ -42,6 +42,9 @@ public abstract class BlazeJavacArguments { /** The compilation bootclasspath. */ public abstract ImmutableList bootClassPath(); + /** The compilation source path. */ + public abstract ImmutableList sourcePath(); + /** The classpath to load processors from. */ public abstract ImmutableList processorPath(); @@ -68,6 +71,7 @@ public static Builder builder() { .bootClassPath(ImmutableList.of()) .javacOptions(ImmutableList.of()) .sourceFiles(ImmutableList.of()) + .sourcePath(ImmutableList.of()) .processors(null) .sourceOutput(null) .processorPath(ImmutableList.of()) @@ -85,6 +89,8 @@ public interface Builder { Builder javacOptions(ImmutableList javacOptions); + Builder sourcePath(ImmutableList sourcePath); + Builder sourceFiles(ImmutableList sourceFiles); Builder processors(ImmutableList processors); diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacMain.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacMain.java index ad55b68e691e8f..1cd55846562d03 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacMain.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/BlazeJavacMain.java @@ -168,7 +168,7 @@ private static void setLocations(JavacFileManager fileManager, BlazeJavacArgumen fileManager.setLocationFromPaths(StandardLocation.CLASS_PATH, arguments.classPath()); fileManager.setLocationFromPaths( StandardLocation.CLASS_OUTPUT, ImmutableList.of(arguments.classOutput())); - fileManager.setLocationFromPaths(StandardLocation.SOURCE_PATH, ImmutableList.of()); + fileManager.setLocationFromPaths(StandardLocation.SOURCE_PATH, arguments.sourcePath()); // TODO(cushon): require an explicit bootclasspath Iterable bootClassPath = arguments.bootClassPath(); if (!Iterables.isEmpty(bootClassPath)) { diff --git a/src/test/shell/bazel/bazel_java_test.sh b/src/test/shell/bazel/bazel_java_test.sh index 1ce5184eddf36e..df5eae4ec96b87 100755 --- a/src/test/shell/bazel/bazel_java_test.sh +++ b/src/test/shell/bazel/bazel_java_test.sh @@ -105,6 +105,45 @@ function test_build_hello_world() { bazel build //java/main:main &> $TEST_log || fail "build failed" } +# Regression test for #2606: support for passing -sourcepath +# TODO(#2606): Update when a final solution is found for #2606. +function test_build_with_sourcepath() { + mkdir -p g + cat >g/A.java <<'EOF' +package g; +public class A { + public A() { + new B(); + } +} +EOF + + cat >g/B.java <<'EOF' +package g; +public class B { + public B() { + } +} +EOF + + cat >g/BUILD <<'EOF' +genrule( + name = "stub", + srcs = ["B.java"], + outs = ["B.jar"], + cmd = "zip $@ $(SRCS)", +) + +java_library( + name = "test", + srcs = ["A.java"], + javacopts = ["-sourcepath $(GENDIR)/$(location :stub)", "-implicit:none"], + deps = [":stub"] +) +EOF + bazel build //g:test >$TEST_log || fail "Failed to build //g:test" +} + # Runfiles is disabled by default on Windows, but we can test it on Unix by # adding flag --experimental_enable_runfiles=0 function test_build_and_run_hello_world_without_runfiles() {