# ------------------------------------------------------------------
|
# Copyright (c) 2020 PyInstaller Development Team.
|
#
|
# This file is distributed under the terms of the GNU General Public
|
# License (version 2.0 or later).
|
#
|
# The full license is available in LICENSE.GPL.txt, distributed with
|
# this software.
|
#
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
# ------------------------------------------------------------------
|
|
from PyInstaller.utils.hooks import is_module_satisfies, \
|
collect_submodules, collect_data_files
|
|
tf_pre_1_15_0 = is_module_satisfies("tensorflow < 1.15.0")
|
tf_post_1_15_0 = is_module_satisfies("tensorflow >= 1.15.0")
|
tf_pre_2_0_0 = is_module_satisfies("tensorflow < 2.0.0")
|
tf_pre_2_2_0 = is_module_satisfies("tensorflow < 2.2.0")
|
|
|
# Exclude from data collection:
|
# - development headers in include subdirectory
|
# - XLA AOT runtime sources
|
# - libtensorflow_framework and libtensorflow_cc (since TF 2.12) shared libraries (to avoid duplication)
|
# - import library (.lib) files (Windows-only)
|
data_excludes = [
|
"include",
|
"xla_aot_runtime_src",
|
"libtensorflow_framework.*",
|
"libtensorflow_cc.*",
|
"**/*.lib",
|
]
|
|
# Under tensorflow 2.3.0 (the most recent version at the time of writing),
|
# _pywrap_tensorflow_internal extension module ends up duplicated; once
|
# as an extension, and once as a shared library. In addition to increasing
|
# program size, this also causes problems on macOS, so we try to prevent
|
# the extension module "variant" from being picked up.
|
#
|
# See pyinstaller/pyinstaller-hooks-contrib#49 for details.
|
excluded_submodules = ['tensorflow.python._pywrap_tensorflow_internal']
|
|
|
def _submodules_filter(x):
|
return x not in excluded_submodules
|
|
|
if tf_pre_1_15_0:
|
# 1.14.x and earlier: collect everything from tensorflow
|
hiddenimports = collect_submodules('tensorflow',
|
filter=_submodules_filter)
|
datas = collect_data_files('tensorflow', excludes=data_excludes)
|
elif tf_post_1_15_0 and tf_pre_2_2_0:
|
# 1.15.x - 2.1.x: collect everything from tensorflow_core
|
hiddenimports = collect_submodules('tensorflow_core',
|
filter=_submodules_filter)
|
datas = collect_data_files('tensorflow_core', excludes=data_excludes)
|
|
# Under 1.15.x, we seem to fail collecting a specific submodule,
|
# and need to add it manually...
|
if tf_post_1_15_0 and tf_pre_2_0_0:
|
hiddenimports += \
|
['tensorflow_core._api.v1.compat.v2.summary.experimental']
|
else:
|
# 2.2.0 and newer: collect everything from tensorflow again
|
hiddenimports = collect_submodules('tensorflow',
|
filter=_submodules_filter)
|
datas = collect_data_files('tensorflow', excludes=data_excludes)
|
|
# From 2.6.0 on, we also need to explicitly collect keras (due to
|
# lazy mapping of tensorflow.keras.xyz -> keras.xyz)
|
if is_module_satisfies("tensorflow >= 2.6.0"):
|
hiddenimports += collect_submodules('keras')
|
|
excludedimports = excluded_submodules
|
|
# Suppress warnings for missing hidden imports generated by this hook.
|
# Requires PyInstaller > 5.1 (with pyinstaller/pyinstaller#6914 merged); no-op otherwise.
|
warn_on_missing_hiddenimports = False
|