# ------------------------------------------------------------------ # 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 # ------------------------------------------------------------------ """ Hook for PyZMQ. Cython based Python bindings for messaging library ZeroMQ. http://www.zeromq.org/ """ import os import glob from PyInstaller.utils.hooks import collect_submodules from PyInstaller.utils.hooks import is_module_satisfies, get_module_file_attribute from PyInstaller.compat import is_win binaries = [] datas = [] hiddenimports = ['zmq.utils.garbage'] # PyZMQ comes with two backends, cython and cffi. Calling collect_submodules() # on zmq.backend seems to trigger attempt at compilation of C extension # module for cffi backend, which will fail if ZeroMQ development files # are not installed on the system. On non-English locales, the resulting # localized error messages may cause UnicodeDecodeError. Collecting each # backend individually, however, does not seem to cause any problems. hiddenimports += ['zmq.backend'] # cython backend hiddenimports += collect_submodules('zmq.backend.cython') # cffi backend: contains extra data that needs to be collected # (e.g., _cdefs.h) # # NOTE: the cffi backend requires compilation of C extension at runtime, # which appears to be broken in frozen program. So avoid collecting # it altogether... if False: from PyInstaller.utils.hooks import collect_data_files hiddenimports += collect_submodules('zmq.backend.cffi') datas += collect_data_files('zmq.backend.cffi', excludes=['**/__pycache__', ]) # Starting with pyzmq 22.0.0, the DLLs in Windows wheel are located in # site-packages/pyzmq.libs directory along with a .load_order file. This # file is required on python 3.7 and earlier. On later versions of python, # the pyzmq.libs is required to exist. if is_win and is_module_satisfies('pyzmq >= 22.0.0'): zmq_root = os.path.dirname(get_module_file_attribute('zmq')) libs_dir = os.path.join(zmq_root, os.path.pardir, 'pyzmq.libs') # .load_order file (22.0.3 replaced underscore with dash and added # version suffix on this file, hence the glob) load_order_file = glob.glob(os.path.join(libs_dir, '.load*')) datas += [(filename, 'pyzmq.libs') for filename in load_order_file] # We need to collect DLLs into _MEIPASS, to avoid duplication due to # subsequent binary analysis dll_files = glob.glob(os.path.join(libs_dir, "*.dll")) binaries += [(dll_file, '.') for dll_file in dll_files]