diff --git a/tensorflow/core/kernels/BUILD b/tensorflow/core/kernels/BUILD index e49dbe7dd95..c0a33232f8c 100644 --- a/tensorflow/core/kernels/BUILD +++ b/tensorflow/core/kernels/BUILD @@ -6448,6 +6448,7 @@ cc_library( "//tensorflow/core/platform:strong_hash", "//third_party/eigen3", "//third_party/fft2d:fft2d_headers", + "//third_party/icu/data:conversion_data", "@com_google_absl//absl/base", "@com_google_protobuf//:protobuf", "@fft2d", diff --git a/tensorflow/lite/delegates/flex/build_def.bzl b/tensorflow/lite/delegates/flex/build_def.bzl index 5826e1f83cd..53854463627 100644 --- a/tensorflow/lite/delegates/flex/build_def.bzl +++ b/tensorflow/lite/delegates/flex/build_def.bzl @@ -20,6 +20,7 @@ load( "tflite_jni_linkopts", ) load("@build_bazel_rules_android//android:rules.bzl", "android_library") +load("//tensorflow/lite:special_rules.bzl", "flex_portable_tensorflow_deps") def generate_flex_kernel_header( name, @@ -130,13 +131,7 @@ def tflite_flex_cc_library( clean_dep("//tensorflow/core/kernels:android_all_ops_textual_hdrs"), ], visibility = visibility, - deps = [ - "@com_google_absl//absl/strings:str_format", - "//third_party/fft2d:fft2d_headers", - "//third_party/eigen3", - "@com_google_absl//absl/types:optional", - "@gemmlowp", - "@icu//:common", + deps = flex_portable_tensorflow_deps() + [ clean_dep("//tensorflow/core:protos_all_cc"), clean_dep("//tensorflow/core:portable_tensorflow_lib_lite"), clean_dep("//tensorflow/core/platform:strong_hash"), diff --git a/tensorflow/lite/experimental/ios/BUILD.apple b/tensorflow/lite/experimental/ios/BUILD.apple index 11868fe044d..cce0c4df883 100644 --- a/tensorflow/lite/experimental/ios/BUILD.apple +++ b/tensorflow/lite/experimental/ios/BUILD.apple @@ -71,6 +71,7 @@ tflite_ios_static_framework( # bazel build -c opt --config=ios --ios_multi_cpus=armv7,arm64,x86_64 //tensorflow/lite/experimental/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 = [ diff --git a/tensorflow/lite/interpreter_builder.cc b/tensorflow/lite/interpreter_builder.cc index 6eaf3eaadc8..4249c85238e 100644 --- a/tensorflow/lite/interpreter_builder.cc +++ b/tensorflow/lite/interpreter_builder.cc @@ -47,6 +47,20 @@ limitations under the License. #endif #endif +// TODO(b/139446230): Move to portable platform header. +#if defined(__ANDROID__) +#define TFLITE_IS_MOBILE_PLATFORM +#endif // defined(__ANDROID__) + +#if defined(__APPLE__) +#include "TargetConditionals.h" +#if TARGET_IPHONE_SIMULATOR +#define TFLITE_IS_MOBILE_PLATFORM +#elif TARGET_OS_IPHONE +#define TFLITE_IS_MOBILE_PLATFORM +#endif +#endif // defined(__APPLE__) + namespace tflite { namespace { @@ -129,9 +143,16 @@ const char* kEmptyTensorName = ""; // For flex delegate, see also the strong override in // lite/delegates/flex/delegate.cc. TFLITE_ATTRIBUTE_WEAK Interpreter::TfLiteDelegatePtr AcquireFlexDelegate() { -#if !defined(__ANDROID__) - // If _pywrap_tensorflow_internal.so is available, use - // TF_AcquireFlexDelegate() to initialize flex delegate. + auto acquire_flex_delegate_func = + reinterpret_cast( + SharedLibrary::GetSymbol("TF_AcquireFlexDelegate")); + if (acquire_flex_delegate_func) { + return acquire_flex_delegate_func(); + } + +#if !defined(TFLITE_IS_MOBILE_PLATFORM) + // Load TF_AcquireFlexDelegate() from _pywrap_tensorflow_internal.so if it is + // available. const char* filename_pywrap_tensorflow_internal = #if defined(_WIN32) "_pywrap_tensorflow_internal.pyd"; @@ -143,15 +164,16 @@ TFLITE_ATTRIBUTE_WEAK Interpreter::TfLiteDelegatePtr AcquireFlexDelegate() { void* lib_tf_internal = SharedLibrary::LoadLibrary(filename_pywrap_tensorflow_internal); if (lib_tf_internal) { - auto TF_AcquireFlexDelegate = + acquire_flex_delegate_func = reinterpret_cast( SharedLibrary::GetLibrarySymbol(lib_tf_internal, "TF_AcquireFlexDelegate")); - if (TF_AcquireFlexDelegate) { - return TF_AcquireFlexDelegate(); + if (acquire_flex_delegate_func) { + return acquire_flex_delegate_func(); } } -#endif +#endif // !defined(TFLITE_IS_MOBILE_PLATFORM) + return Interpreter::TfLiteDelegatePtr(nullptr, [](TfLiteDelegate*) {}); } diff --git a/tensorflow/lite/special_rules.bzl b/tensorflow/lite/special_rules.bzl index 68143c976f4..2b80b2ef9c1 100644 --- a/tensorflow/lite/special_rules.bzl +++ b/tensorflow/lite/special_rules.bzl @@ -77,3 +77,16 @@ def tflite_schema_utils_friends(): # Its usage should be rare, and is often abused by tools that are doing # Flatbuffer creation/manipulation in unofficially supported ways." return ["//..."] + +def flex_portable_tensorflow_deps(): + """Returns dependencies for building portable tensorflow in Flex delegate.""" + + return [ + "//third_party/fft2d:fft2d_headers", + "//third_party/eigen3", + "@com_google_absl//absl/types:optional", + "@com_google_absl//absl/strings:str_format", + "@gemmlowp", + "@icu//:common", + "//third_party/icu/data:conversion_data", + ]