# ------------------------------------------------------------------ # 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 # ------------------------------------------------------------------ import ctypes.util import os from PyInstaller.depend.utils import _resolveCtypesImports from PyInstaller.compat import is_cygwin, getenv from PyInstaller.utils.hooks import logger # Include glob for library lookup in run-time hook. hiddenimports = ['glob'] # https://github.com/walac/pyusb/blob/master/docs/faq.rst # https://github.com/walac/pyusb/blob/master/docs/tutorial.rst binaries = [] # Running usb.core.find() in this script crashes Ubuntu 14.04LTS, # let users circumvent pyusb discovery with an environment variable. skip_pyusb_discovery = \ bool(getenv('PYINSTALLER_USB_HOOK_SKIP_PYUSB_DISCOVERY')) # Try to use pyusb's library locator. if not skip_pyusb_discovery: import usb.core import usb.backend try: # get the backend symbols before find backend_contents_before_discovery = set(dir(usb.backend)) # perform find, which will load a usb library if found usb.core.find() # get the backend symbols which have been added (loaded) backends = set(dir(usb.backend)) - backend_contents_before_discovery # gather the libraries from the loaded backends backend_lib_basenames = [] for usblib in [getattr(usb.backend, be)._lib for be in backends]: if usblib is not None: # OSX returns the full path, Linux only the filename. # save the basename and reconstruct the path after gathering. backend_lib_basenames.append(os.path.basename(usblib._name)) # try to resolve the library names to absolute paths. binaries = _resolveCtypesImports(backend_lib_basenames) except (ValueError, usb.core.USBError) as exc: logger.warning("%s", exc) # If pyusb didn't find a backend, manually search for usb libraries. if not binaries: # NOTE: Update these lists when adding further libs. if is_cygwin: libusb_candidates = ['cygusb-1.0-0.dll', 'cygusb0.dll'] else: libusb_candidates = [ # libusb10 'usb-1.0', 'usb', 'libusb-1.0', # libusb01 'usb-0.1', 'libusb0', # openusb 'openusb', ] backend_library_basenames = [] for candidate in libusb_candidates: libname = ctypes.util.find_library(candidate) if libname is not None: backend_library_basenames.append(os.path.basename(libname)) if backend_library_basenames: binaries = _resolveCtypesImports(backend_library_basenames) # Validate and normalize the first found usb library. if binaries: # `_resolveCtypesImports` returns a 3-tuple, but `binaries` are only # 2-tuples, so remove the last element: assert len(binaries[0]) == 3 binaries = [(binaries[0][1], '.')]