package(default_visibility = ["//src:__subpackages__"])

java_binary(
    name = "JavaBuilder",
    srcs = glob(["java/com/google/devtools/build/buildjar/**/*.java"]),
    main_class = "com.google.devtools.build.buildjar.BazelJavaBuilder",
    deps = [
        "//src/main/protobuf:proto_deps",
        "//src/main/protobuf:proto_java_compilation",
        "//src/main/protobuf:proto_worker_protocol",
        "//third_party:error_prone",
        "//third_party:guava",
        "//third_party:jsr305",
        "//third_party:protobuf",
        "//tools/jdk:langtools-neverlink",
    ],
)

# Exports $(locations //tools/defaults:javac_bootclasspath) to the java world.
genrule(
    name = "javac-bootclasspath-locations",
    srcs = ["//tools/defaults:javac_bootclasspath"],
    outs = ["java/com/google/devtools/build/java/bazel/JavacBootclasspathLocations.java"],
    cmd = """
declare -a paths=($(SRCS)) && paths=($${paths[@]#$(GENDIR)/}) &&
IFS=: &&
cat > $@ <<EOF
package com.google.devtools.build.java.bazel;
public class JavacBootclasspathLocations {
  public static final String BOOTCLASSPATH = "$${paths[*]}";
}
EOF
""",
)

# Provides java-level access to //tools/defaults:javac_bootclasspath
# as defined by blaze's --javac_bootclasspath flag
java_library(
    name = "javac-bootclasspath-locations-lib",
    srcs = [":javac-bootclasspath-locations"],
    visibility = ["//visibility:private"],
)

java_library(
    name = "JavacBootclasspath",
    srcs = ["java/com/google/devtools/build/java/bazel/JavacBootclasspath.java"],
    data = ["//tools/defaults:javac_bootclasspath"],
    visibility = ["//visibility:public"],
    deps = [":javac-bootclasspath-locations-lib"],
)

# Exports $(location //tools/defaults:java_langtools) to the java world.
genrule(
    name = "java-langtools-location",
    srcs = ["//tools/defaults:java_langtools"],
    outs = ["java/com/google/devtools/build/java/bazel/JavaLangtoolsLocation.java"],
    cmd = """
path=$(SRCS) && path=$${path#$(GENDIR)/} &&
cat > $@ <<EOF
package com.google.devtools.build.java.bazel;
public class JavaLangtoolsLocation {
  public static final String FILE = "$${path}";
}
EOF
""",
)

# Provides java-level access to //tools/defaults:java_langtools
# as defined by bazel's --java_langtools flag
java_library(
    name = "java-langtools-location-lib",
    srcs = [":java-langtools-location"],
    visibility = ["//visibility:private"],
)

java_library(
    name = "JavaLangtools",
    srcs = ["java/com/google/devtools/build/java/bazel/JavaLangtools.java"],
    data = ["//tools/defaults:java_langtools"],
    visibility = ["//visibility:public"],
    deps = [":java-langtools-location-lib"],
)

# Utility to export javacopts to the java world from the default javabuilder (a
# java_binary deploy jar).
java_binary(
    name = "JavaBuilderConfigGenerator",
    srcs = ["java/com/google/devtools/build/java/bazel/JavaBuilderConfigGenerator.java"],
    main_class = "com.google.devtools.build.java.bazel.JavaBuilderConfigGenerator",
    deps = [
        "//src/main/java:java-toolchain-parser",
        "//third_party:guava",
    ],
)

# Exports the default javacopts to the java world from the default javabuilder
# (a java_binary deploy jar).
# We could put any java target as scope and in deps here.
genquery(
    name = "java_toolchain_content",
    expression = "kind(java_toolchain, deps(//tools/defaults:java_toolchain))",
    opts = ["--output=proto"],
    scope = ["//tools/defaults:java_toolchain"],
)

genrule(
    name = "javabuilder-javacopts",
    srcs = [":java_toolchain_content"],
    outs = ["java/com/google/devtools/build/java/bazel/JavaBuilderJavacOpts.java"],
    cmd = "$(location :JavaBuilderConfigGenerator) $< > $@",
    tools = [":JavaBuilderConfigGenerator"],
)

# Provides java-level access to the default javacopts in the current
# JavaBuilder release as defined by bazel's --javabuilder_top flag
java_library(
    name = "javabuilder-javacopts-lib",
    srcs = [":javabuilder-javacopts"],
    visibility = ["//visibility:private"],
)

java_library(
    name = "JavaBuilderConfig",
    srcs = ["java/com/google/devtools/build/java/bazel/JavaBuilderConfig.java"],
    data = ["//tools/defaults:javabuilder"],
    deps = [":javabuilder-javacopts-lib"],
)

# Provides programmatic access to a bazel compatible javac.
# Use this instead of ToolProvider.getSystemJavaCompiler().
java_library(
    name = "BazelJavaCompiler",
    srcs = ["java/com/google/devtools/build/java/bazel/BazelJavaCompiler.java"],
    data = ["//tools/defaults:java_langtools"],
    visibility = [
        "//src:__subpackages__",
        "//third_party/ijar:__subpackages__",
    ],
    deps = [
        ":JavaBuilderConfig",
        ":JavaLangtools",
        ":JavacBootclasspath",
    ],
)

# Command line version of BazelJavaCompiler, interface-compatible
# with the javac command, for use with ant, for example.
java_library(
    name = "BazelJavac",
    srcs = ["java/com/google/devtools/build/java/bazel/BazelJavac.java"],
    deps = [":BazelJavaCompiler"],
)

# JarHelper library for GenClass so it can create the gen jar.
java_library(
    name = "jarhelper",
    srcs = [
        "java/com/google/devtools/build/buildjar/JarCreator.java",
        "java/com/google/devtools/build/buildjar/JarHelper.java",
    ],
    visibility = [
        "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/genclass:__pkg__",
    ],
    deps = [
        "//third_party:guava",
    ],
)

# For the -Xbootclasspath option of the java_test of buildjar
genrule(
    name = "langtools-test",
    testonly = 1,
    srcs = ["//tools/defaults:java_langtools"],
    outs = ["langtools-test.jar"],
    cmd = "cp $< $@",
)

java_test(
    name = "BazelJavaCompilerTest",
    size = "small",
    srcs = ["javatests/com/google/devtools/build/java/bazel/BazelJavaCompilerTest.java"],
    args = ["com.google.devtools.build.java.bazel.BazelJavaCompilerTest"],
    jvm_flags = [
        # Simulates how Bazel invokes JavaBuilder
        "-Xbootclasspath/p:$${TEST_SRCDIR}/src/java_tools/buildjar/langtools-test.jar",
    ],
    deps = [
        ":BazelJavaCompiler",
        ":langtools-test",
        "//third_party:guava",
        "//third_party:junit4",
        "//third_party:truth",
    ],
)

#
# Bootstrapping using Skylark rules
#
load("/tools/build_rules/java_rules_skylark", "bootstrap_java_library", "bootstrap_java_binary")

bootstrap_java_library(
    name = "skylark-deps",
    jars = [
        "//third_party:error_prone-jars",
        "//third_party:guava-jars",
        "//third_party:jsr305-jars",
        "//third_party:protobuf-jars",
    ],
    neverlink_jars = ["//tools/defaults:java_langtools"],
    srcjars = [
        "//src/main/protobuf:proto_deps_srcjar",
        "//src/main/protobuf:proto_worker_protocol_srcjar",
        "//src/main/protobuf:proto_java_compilation_srcjar",
    ],
)

bootstrap_java_binary(
    name = "bootstrap",
    srcs = glob(["java/com/google/devtools/build/buildjar/**/*.java"]),
    main_class = "com.google.devtools.build.buildjar.BazelJavaBuilder",
    visibility = ["//visibility:public"],
    deps = [":skylark-deps"],
)

bootstrap_java_binary(
    name = "bootstrap_genclass",
    srcs = glob(["java/com/google/devtools/build/buildjar/genclass/*.java"]),
    main_class = "com.google.devtools.build.buildjar.genclass.GenClass",
    visibility = ["//visibility:public"],
    deps = [":skylark-deps"],
)
