From 0912e5615d20801ba81fc6213a175979613970e5 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 30 Nov 2023 11:34:27 +0000 Subject: [PATCH] pyinstaller build: follow-up: dirty hack for duplicate plugins Ah ok, I give up for now... the prev does not really work. The prior commit works on Windows but not on macOS. On Windows, it would package all plugins as code and only as code. On MacOS however, it would not package any plugins at all. And with this commit, where I mark the plugins folder to be packaged as *data*, it packages all plugins as *both* code and data. Not sure why. Let's just package all plugins as both code and data, and ignore the code instances explicitly... --- contrib/build-wine/deterministic.spec | 1 + contrib/osx/osx.spec | 1 + electrum/plugin.py | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/contrib/build-wine/deterministic.spec b/contrib/build-wine/deterministic.spec index 92204104d..23fe939ff 100644 --- a/contrib/build-wine/deterministic.spec +++ b/contrib/build-wine/deterministic.spec @@ -29,6 +29,7 @@ datas = [ (home+'electrum/wordlist/english.txt', 'electrum/wordlist'), (home+'electrum/wordlist/slip39.txt', 'electrum/wordlist'), (home+'electrum/locale', 'electrum/locale'), + (home+'electrum/plugins', 'electrum/plugins'), (home+'electrum/gui/icons', 'electrum/gui/icons'), ] datas += collect_data_files('electrum.plugins') diff --git a/contrib/osx/osx.spec b/contrib/osx/osx.spec index d8433c36f..143d7602f 100644 --- a/contrib/osx/osx.spec +++ b/contrib/osx/osx.spec @@ -29,6 +29,7 @@ datas = [ (electrum + PYPKG + '/wordlist/english.txt', PYPKG + '/wordlist'), (electrum + PYPKG + '/wordlist/slip39.txt', PYPKG + '/wordlist'), (electrum + PYPKG + '/locale', PYPKG + '/locale'), + (electrum + PYPKG + '/plugins', PYPKG + '/plugins'), (electrum + PYPKG + '/gui/icons', PYPKG + '/gui/icons'), ] datas += collect_data_files('electrum.plugins') diff --git a/electrum/plugin.py b/electrum/plugin.py index 4be5d323d..e24a8effb 100644 --- a/electrum/plugin.py +++ b/electrum/plugin.py @@ -82,6 +82,11 @@ class Plugins(DaemonThread): cls._all_found_plugins = dict() iter_modules = list(pkgutil.iter_modules([cls.pkgpath])) for loader, name, ispkg in iter_modules: + # FIXME pyinstaller binaries are packaging each built-in plugin twice: + # once as data and once as code. To honor the "no duplicates" rule below, + # we exclude the ones packaged as *code*, here: + if loader.__class__.__qualname__ == "FrozenImporter": + continue full_name = f'electrum.plugins.{name}' spec = importlib.util.find_spec(full_name) if spec is None: # pkgutil found it but importlib can't ?!