# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

load("//tools/build_defs/oss:yoga_defs.bzl", "ANDROID", "CXX_LIBRARY_WHITELIST", "FBJNI_JAVA_TARGET", "FBJNI_TARGET", "JNI_TARGET", "JSR_305_TARGET", "JUNIT_TARGET", "PROGRUARD_ANNOTATIONS_TARGET", "SOLOADER_TARGET", "yoga_cxx_lib", "yoga_cxx_library", "yoga_dep", "yoga_java_binary", "yoga_java_library", "yoga_java_test")

CXX_LIBRARY_WHITELIST_FOR_TESTS = CXX_LIBRARY_WHITELIST + [
    yoga_cxx_lib("testutil:jni"),
    yoga_cxx_lib("testutil:testutil"),
]

YOGA_JAVA_IMPLEMENTATION_FILES = [
    "com/facebook/yoga/*JNI*.java",
    "com/facebook/yoga/*Factory.java",
    "com/facebook/yoga/YogaNative.java",
]

yoga_cxx_library(
    name = "jni",
    srcs = glob(["jni/*.cpp"]),
    header_namespace = "yoga/java",
    exported_headers = glob(["jni/*.h"]),
    allow_jni_merging = True,
    compiler_flags = [
        "-fno-omit-frame-pointer",
        "-fexceptions",
        "-fvisibility=hidden",
        "-ffunction-sections",
        "-fdata-sections",
        "-fPIC",
        "-Wall",
        "-Werror",
        "-Os",
        "-std=c++11",
    ],
    platforms = ANDROID,
    preprocessor_flags = [
        "-DFBJNI_WITH_FAST_CALLS",
    ],
    soname = "libyoga.$(ext)",
    visibility = ["PUBLIC"],
    deps = [
        FBJNI_TARGET,
        JNI_TARGET,
        yoga_dep(":yoga"),
    ],
)

yoga_java_library(
    name = "java-interface",
    srcs = glob(
        ["com/facebook/yoga/*.java"],
        exclude = YOGA_JAVA_IMPLEMENTATION_FILES,
    ),
    required_for_source_only_abi = True,
    source = "1.7",
    target = "1.7",
    visibility = ["PUBLIC"],
    deps = [
        JSR_305_TARGET,
        PROGRUARD_ANNOTATIONS_TARGET,
    ],
)

yoga_java_library(
    name = "java-impl",
    srcs = glob(YOGA_JAVA_IMPLEMENTATION_FILES),
    required_for_source_only_abi = True,
    source = "1.7",
    target = "1.7",
    deps = [
        ":java-interface",
        ":jni",
        FBJNI_JAVA_TARGET,
        JSR_305_TARGET,
        PROGRUARD_ANNOTATIONS_TARGET,
        SOLOADER_TARGET,
    ],
)

yoga_java_library(
    name = "java",
    required_for_source_only_abi = True,
    source = "1.7",
    target = "1.7",
    tests = [
        yoga_dep("java:tests"),
    ],
    visibility = ["PUBLIC"],
    exported_deps = [
        ":java-impl",
        ":java-interface",
    ],
)

yoga_java_test(
    name = "tests",
    srcs = glob(["tests/**/*.java"]),
    cxx_library_whitelist = CXX_LIBRARY_WHITELIST_FOR_TESTS,
    use_cxx_libraries = True,
    visibility = ["PUBLIC"],
    deps = [
        ":java",
        yoga_dep("testutil:java"),
        JUNIT_TARGET,
    ],
)

yoga_java_binary(
    name = "yoga",
    deps = [
        ":java",
        FBJNI_JAVA_TARGET,
    ],
)
