From eaca795c24c1212f97b1e17a4fb9c67c9d858bc4 Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Wed, 22 Apr 2020 14:38:57 -0700 Subject: [PATCH] Ensure TFLite shared libs have resolved symbols Ensure all TFLite binary targets have fully resolved symbols at link time. Also enabling building of .dylib targets for iOS. PiperOrigin-RevId: 307902313 Change-Id: I6ec48fbd7e8f51b8b786eba9d13118cb51638fde --- tensorflow/lite/build_def.bzl | 9 +++++++++ tensorflow/lite/c/BUILD | 4 +++- tensorflow/lite/java/BUILD | 10 ++++++++-- tensorflow/tensorflow.bzl | 4 ++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/tensorflow/lite/build_def.bzl b/tensorflow/lite/build_def.bzl index f372e69df00..435d29a65c6 100644 --- a/tensorflow/lite/build_def.bzl +++ b/tensorflow/lite/build_def.bzl @@ -132,6 +132,7 @@ def tflite_jni_binary( "//conditions:default": [ "-Wl,--version-script,$(location {})".format(linkscript), "-Wl,-soname," + name, + "-z defs", # Prevent unresolved symbols. ], }) native.cc_binary( @@ -156,6 +157,14 @@ def tflite_cc_shared_object( per_os_targets = False, tags = None): """Builds a shared object for TFLite.""" + linkopts = linkopts + select({ + clean_dep("//tensorflow:ios"): [], + clean_dep("//tensorflow:macos"): [], + clean_dep("//tensorflow:windows"): [], + "//conditions:default": [ + "-z defs", # Prevent unresolved symbols. + ], + }) tf_cc_shared_object( name = name, copts = copts, diff --git a/tensorflow/lite/c/BUILD b/tensorflow/lite/c/BUILD index e1702d40d5a..939a62c1d48 100644 --- a/tensorflow/lite/c/BUILD +++ b/tensorflow/lite/c/BUILD @@ -22,12 +22,14 @@ package( tflite_cc_shared_object( name = "tensorflowlite_c", linkopts = select({ + "//tensorflow:ios": [ + "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)", + ], "//tensorflow:macos": [ "-Wl,-exported_symbols_list,$(location //tensorflow/lite/c:exported_symbols.lds)", ], "//tensorflow:windows": [], "//conditions:default": [ - "-z defs", "-Wl,--version-script,$(location //tensorflow/lite/c:version_script.lds)", ], }), diff --git a/tensorflow/lite/java/BUILD b/tensorflow/lite/java/BUILD index 857974ecce2..babda4f1161 100644 --- a/tensorflow/lite/java/BUILD +++ b/tensorflow/lite/java/BUILD @@ -91,9 +91,15 @@ android_library( proguard_specs = ["proguard.flags"], deps = [ ":tensorflowlite_java", - ":tensorflowlite_native_gpu", "@org_checkerframework_qual", - ], + ] + select({ + # For non-Android builds (e.g., Robolectric), it can be useful to build + # the Java library but not actually use/link the full native impl. + "//tensorflow:android": [ + ":tensorflowlite_native_gpu", + ], + "//conditions:default": [], + }), ) android_library( diff --git a/tensorflow/tensorflow.bzl b/tensorflow/tensorflow.bzl index 25c2b57e026..f7912c55671 100644 --- a/tensorflow/tensorflow.bzl +++ b/tensorflow/tensorflow.bzl @@ -615,6 +615,9 @@ def tf_cc_shared_object( linkshared = 1, data = data + data_extra, linkopts = linkopts + _rpath_linkopts(name_os_full) + select({ + clean_dep("//tensorflow:ios"): [ + "-Wl,-install_name,@rpath/" + soname, + ], clean_dep("//tensorflow:macos"): [ "-Wl,-install_name,@rpath/" + soname, ], @@ -632,6 +635,7 @@ def tf_cc_shared_object( native.filegroup( name = name, srcs = select({ + "//tensorflow:ios": [":lib%s%s.dylib" % (name, longsuffix)], "//tensorflow:windows": [":%s.dll" % (name)], "//tensorflow:macos": [":lib%s%s.dylib" % (name, longsuffix)], "//conditions:default": [":lib%s.so%s" % (name, longsuffix)],