# TensorFlow Lite for iOS

load("@bazel_skylib//rules:build_test.bzl", "build_test")
load(
    "//tensorflow/lite/ios:ios.bzl",
    "TFL_MINIMUM_OS_VERSION",
    "strip_common_include_path_prefix",
    "tflite_ios_static_framework",
)
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_static_framework")

package(
    default_visibility = [
        "//tensorflow/lite:__subpackages__",
    ],
    licenses = ["notice"],  # Apache 2.0
)

sh_binary(
    name = "hide_symbols_with_allowlist",
    srcs = [
        "hide_symbols_with_allowlist.sh",
    ],
    visibility = [
        "//tensorflow/lite:__subpackages__",
        "//tensorflow_lite_support:__subpackages__",
    ],
)

strip_common_include_path_prefix(
    name = "strip_common_include_path_core",
    hdr_labels = [
        "//tensorflow/lite/c:c_api.h",
        "//tensorflow/lite/delegates/xnnpack:xnnpack_delegate.h",
    ],
)

strip_common_include_path_prefix(
    name = "strip_common_include_path_subspecs",
    hdr_labels = [
        "//tensorflow/lite/delegates/coreml:coreml_delegate.h",
        "//tensorflow/lite/delegates/gpu:metal_delegate.h",
    ],
    prefix = "TensorFlowLiteC/",
)

# bazel build -c opt --config=ios_fat //tensorflow/lite/ios:TensorFlowLiteC_framework
tflite_ios_static_framework(
    name = "TensorFlowLiteC_framework",
    hdrs = [
        ":c_api.h",
        ":xnnpack_delegate.h",
        "//tensorflow/lite/c:common.h",
    ],
    allowlist_symbols_file = ":allowlist_TensorFlowLiteC.txt",
    bundle_name = "TensorFlowLiteC",
    minimum_os_version = TFL_MINIMUM_OS_VERSION,
    deps = [
        ":tensorflow_lite_c",
    ],
)

# This target builds the flex delegate as a separate static framework, which
# does not include the TensorFlow Lite runtime. As this target does not contain
# TensorFlow Lite runtime, it is intended to be linked along with the
# TensorFlowLiteC framework above in a composable way.
#
# The flex delegate cannot be built for i386, so it can't be built with ios_fat
# config.
#
# bazel build -c opt --config=ios --ios_multi_cpus=armv7,arm64,x86_64 //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework
ios_static_framework(
    name = "TensorFlowLiteSelectTfOps_framework",
    avoid_deps = ["//tensorflow/lite/c:common"],
    bundle_name = "TensorFlowLiteSelectTfOps",
    minimum_os_version = TFL_MINIMUM_OS_VERSION,
    deps = [
        "//tensorflow/lite/delegates/flex:delegate",
    ],
)

# This target builds the Core ML delegate as a separate static framework, which
# does not include the TensorFlow Lite runtime. As this target does not contain
# TensorFlow Lite runtime, it is intended to be linked along with the
# TensorFlowLiteC framework above in a composable way.
#
# bazel build -c opt --config=ios_fat //tensorflow/lite/ios:TensorFlowLiteCCoreML_framework
tflite_ios_static_framework(
    name = "TensorFlowLiteCCoreML_framework",
    hdrs = [
        ":coreml_delegate.h",
    ],
    allowlist_symbols_file = ":allowlist_TensorFlowLiteCCoreML.txt",
    bundle_name = "TensorFlowLiteCCoreML",
    minimum_os_version = TFL_MINIMUM_OS_VERSION,
    deps = [
        "//tensorflow/lite/delegates/coreml:coreml_delegate",
    ],
)

# This target builds the Metal delegate as a separate static framework, which
# does not include the TensorFlow Lite runtime. As this target does not contain
# TensorFlow Lite runtime, it is intended to be linked along with the
# TensorFlowLiteC framework above in a composable way.
#
# bazel build -c opt --config=ios_fat //tensorflow/lite/ios:TensorFlowLiteCMetal_framework
tflite_ios_static_framework(
    name = "TensorFlowLiteCMetal_framework",
    hdrs = [
        ":metal_delegate.h",
    ],
    allowlist_symbols_file = ":allowlist_TensorFlowLiteCMetal.txt",
    bundle_name = "TensorFlowLiteCMetal",
    minimum_os_version = TFL_MINIMUM_OS_VERSION,
    deps = [
        "//tensorflow/lite/delegates/gpu:metal_delegate",
    ],
)

cc_library(
    name = "tensorflow_lite_c",
    hdrs = [
        "//tensorflow/lite/c:c_api.h",
        "//tensorflow/lite/c:c_api_types.h",
        "//tensorflow/lite/c:common.h",
        "//tensorflow/lite/delegates/xnnpack:xnnpack_delegate.h",
    ],
    tags = [
        "nobuilder",
        "swift_module=TensorFlowLiteC",
    ],
    deps = [
        "//tensorflow/lite/c:c_api",
        "//tensorflow/lite/c:common",
        "//tensorflow/lite/delegates/xnnpack:xnnpack_delegate",
    ],
)

# Used for building TensorFlowLiteC framework.
build_test(
    name = "framework_build_test",
    # build_test targets are not meant to be run with sanitizers.
    tags = [
        "noasan",
        "nomsan",
        "notsan",
    ],
    targets = [
        ":TensorFlowLiteCCoreML_framework",
        ":TensorFlowLiteCMetal_framework",
        ":TensorFlowLiteC_framework",
        ":TensorFlowLiteSelectTfOps_framework",
    ],
)
