# Description: Bazel's Starlark interpreter
#
# This BUILD file defines two java_library rules that
# define a single Java package in two parts,
# the Starlark parser and evaluator.
# Eventually the Java package will be split in two,
# but splitting only the build rules helps enforce
# that only evaluator -> frontend dependencies are permitted,
# without the churn to clients of renaming classes one at a time
# as they move between two different Java packages.
#
# Until the split, clients should depend only on
# //third_party/bazel/src/main/java/com/google/devtools/build/lib:syntax,
# which is a facade for the complete package.

load("@rules_java//java:defs.bzl", "java_library")

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

licenses(["notice"])  # Apache 2.0

filegroup(
    name = "srcs",
    srcs = glob(["**"]),
    visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"],
)

# The Starlark frontend (syntax, scanner, parser, resolver)
java_library(
    name = "frontend",
    srcs = [
        "Argument.java",
        "AssignmentStatement.java",
        "BinaryOperatorExpression.java",
        "CallExpression.java",
        "Comment.java",
        "Comprehension.java",
        "ConditionalExpression.java",
        "DefStatement.java",
        "DictExpression.java",
        "DotExpression.java",
        "Expression.java",
        "ExpressionStatement.java",
        "FileLocations.java",
        "FileOptions.java",
        "FlowStatement.java",
        "ForStatement.java",
        "Identifier.java",
        "IfStatement.java",
        "IndexExpression.java",
        "IntegerLiteral.java",
        "Lexer.java",
        "ListExpression.java",
        "LoadStatement.java",
        "Location.java",
        "Node.java",
        "NodePrinter.java",
        "NodeVisitor.java",
        "Parameter.java",
        "Parser.java",
        "ParserInput.java",
        "Resolver.java",
        "ReturnStatement.java",
        "SliceExpression.java",
        "StarlarkFile.java",
        "Statement.java",
        "StringLiteral.java",
        "SyntaxError.java",
        "TokenKind.java",
        "UnaryOperatorExpression.java",
    ],
    deps = [
        # Do not add Bazel or Google dependencies here!
        "//src/main/java/net/starlark/java/spelling",
        "//third_party:auto_value",
        "//third_party:guava",
        "//third_party:jsr305",
    ],
)

# The Starlark evaluator
java_library(
    name = "evaluator",
    srcs = [
        "BuiltinCallable.java",
        "CallUtils.java",
        "ClassObject.java",
        "CpuProfiler.java",
        "Debug.java",
        "Dict.java",
        "Eval.java",
        "EvalException.java",
        "EvalUtils.java",
        "FlagGuardedValue.java",
        "FormatParser.java",
        "HasBinary.java",
        "JNI.java",
        "MethodDescriptor.java",
        "MethodLibrary.java",
        "Module.java",
        "Mutability.java",
        "NoneType.java",
        "ParamDescriptor.java",
        "Printer.java",
        "RangeList.java",
        "Sequence.java",
        "Starlark.java",
        "StarlarkCallable.java",
        "StarlarkFunction.java",
        "StarlarkIndexable.java",
        "StarlarkIterable.java",
        "StarlarkList.java",
        "StarlarkSemantics.java",
        "StarlarkThread.java",
        "StarlarkValue.java",
        "StringModule.java",
        "Tuple.java",
    ],
    deps = [
        ":frontend",
        # Do not add Bazel or Google dependencies here!
        "//src/main/java/net/starlark/java/annot",
        "//src/main/java/net/starlark/java/spelling",
        "//third_party:auto_value",
        "//third_party:guava",
        "//third_party:jsr305",
        "//third_party/protobuf:protobuf_java",
    ],
)

# Dynamic library for Starlark CPU profiler.
# The application or test must arrange for the library to be added
# to the java.library.path directory (e.g. by 'java -Djava.library.path=<dir>').
# What a mess.
filegroup(
    name = "cpu_profiler",
    srcs = select({
        "//src/conditions:darwin": [":libcpu_profiler.dylib"],
        "//src/conditions:windows": [":cpu_profiler.dll"],
        "//conditions:default": [":libcpu_profiler.so"],  # POSIX
    }),
)

genrule(
    name = "cpu_profiler_darwin",
    srcs = ["libcpu_profiler.so"],
    outs = ["libcpu_profiler.dylib"],
    cmd = "cp $< $@",
    visibility = ["//visibility:private"],
)

genrule(
    name = "cpu_profiler_windows",
    srcs = ["libcpu_profiler.so"],
    outs = ["cpu_profiler.dll"],
    cmd = "cp $< $@",
    visibility = ["//visibility:private"],
)

# The C++ portion of the Starlark CPU profiler.
cc_binary(
    name = "libcpu_profiler.so",
    srcs = select({
        "//src/conditions:darwin": ["cpu_profiler_posix.cc"],
        # There is no config_setting for Linux.
        # See https://github.com/bazelbuild/bazel/issues/11107
        "//src/conditions:linux_aarch64": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_arm": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_ppc": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_s390x": ["cpu_profiler_posix.cc"],
        "//src/conditions:linux_x86_64": ["cpu_profiler_posix.cc"],
        "//conditions:default": ["cpu_profiler_unimpl.cc"],
    }),
    linkshared = 1,
    visibility = ["//visibility:private"],
    deps = ["@bazel_tools//tools/jdk:jni"],
)
