e455677284
In `build-electrum-git.sh`, the `-w` CLI arg is removed: it was apparently ignored as we are using a .spec file, and pyinstaller 5.0+ is now raising a hard error (see https://github.com/pyinstaller/pyinstaller/issues/6660). ``` option(s) not allowed: --console/--nowindowed/--windowed/--noconsole makespec options not valid when a .spec file is given ``` ----- In ecc_fast.py, we don't sys.exit() anymore as pyinstaller 5.0+ tries to import electrum during the Analysis phase. see https://github.com/pyinstaller/pyinstaller/pull/6171 ``` 57912 INFO: Looking for dynamic libraries 1746 INFO: gettext setting initial language to None 1932 ERROR: libsecp256k1 library failed to load. exceptions: [FileNotFoundError("Could not find module 'C:\\python3\\lib\\site-packages\\electrum\\libsecp256k1-2.dll' (or one of its depende ncies). Try using the full path with constructor syntax."), FileNotFoundError("Could not find module 'C:\\python3\\lib\\site-packages\\electrum\\libsecp256k1-1.dll' (or one of its dependenc ies). Try using the full path with constructor syntax."), FileNotFoundError("Could not find module 'C:\\python3\\lib\\site-packages\\electrum\\libsecp256k1-0.dll' (or one of its dependencie s). Try using the full path with constructor syntax."), FileNotFoundError("Could not find module 'libsecp256k1-2.dll' (or one of its dependencies). Try using the full path with constructor syntax."), FileNotFoundError("Could not find module 'libsecp256k1-1.dll' (or one of its dependencies). Try using the full path with constructor syntax."), FileNotFoundError("Could not find module 'libsecp256k1-0.dll' (or one of its dependencies). Try using the full path with constructor syntax.")] Traceback (most recent call last): File "C:\python3\lib\runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\python3\lib\runpy.py", line 86, in _run_code exec(code, run_globals) File "C:\python3\scripts\pyinstaller.exe\__main__.py", line 7, in <module> File "C:\python3\lib\site-packages\PyInstaller\__main__.py", line 194, in _console_script_run run() File "C:\python3\lib\site-packages\PyInstaller\__main__.py", line 180, in run run_build(pyi_config, spec_file, **vars(args)) File "C:\python3\lib\site-packages\PyInstaller\__main__.py", line 61, in run_build PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) File "C:\python3\lib\site-packages\PyInstaller\building\build_main.py", line 1006, in main build(specfile, distpath, workpath, clean_build) File "C:\python3\lib\site-packages\PyInstaller\building\build_main.py", line 928, in build exec(code, spec_namespace) File "deterministic.spec", line 55, in <module> a = Analysis([home+'run_electrum', File "C:\python3\lib\site-packages\PyInstaller\building\build_main.py", line 428, in __init__ self.__postinit__() File "C:\python3\lib\site-packages\PyInstaller\building\datastruct.py", line 184, in __postinit__ self.assemble() File "C:\python3\lib\site-packages\PyInstaller\building\build_main.py", line 736, in assemble isolated.call(find_binary_dependencies, self.binaries, self.binding_redirects, collected_packages) File "C:\python3\lib\site-packages\PyInstaller\isolated\_parent.py", line 372, in call return isolated.call(function, *args, **kwargs) File "C:\python3\lib\site-packages\PyInstaller\isolated\_parent.py", line 302, in call raise RuntimeError(f"Child process call to {function.__name__}() failed with:\n" + output) RuntimeError: Child process call to find_binary_dependencies() failed with: File "C:\python3\lib\site-packages\PyInstaller\isolated\_child.py", line 63, in run_next_command output = function(*args, **kwargs) File "C:\python3\lib\site-packages\PyInstaller\building\build_main.py", line 177, in find_binary_dependencies __import__(package) File "C:\python3\lib\site-packages\electrum\__init__.py", line 20, in <module> from .wallet import Wallet File "C:\python3\lib\site-packages\electrum\wallet.py", line 53, in <module> from .bip32 import BIP32Node, convert_bip32_intpath_to_strpath, convert_bip32_strpath_to_intpath File "C:\python3\lib\site-packages\electrum\bip32.py", line 11, in <module> from . import constants File "C:\python3\lib\site-packages\electrum\constants.py", line 30, in <module> from . import bitcoin File "C:\python3\lib\site-packages\electrum\bitcoin.py", line 35, in <module> from . import ecc File "C:\python3\lib\site-packages\electrum\ecc.py", line 39, in <module> from .ecc_fast import _libsecp256k1, SECP256K1_EC_UNCOMPRESSED File "C:\python3\lib\site-packages\electrum\ecc_fast.py", line 151, in <module> sys.exit(f"Error: Failed to load libsecp256k1.") SystemExit: Error: Failed to load libsecp256k1. 🗯 ERROR: build-electrum-git failed ``` Also, the -OO flag is removed from wine python, for similar reasons: pyinstaller imports electrum, and in electrum/__init__.py, we raise if -O is used: https://github.com/spesmilo/electrum/blob/9b1fb0e5fed402c81e01185cc79ec1a8722d173d/electrum/__init__.py#L40
103 lines
4.1 KiB
Bash
Executable File
103 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
PYINSTALLER_REPO="https://github.com/pyinstaller/pyinstaller.git"
|
|
PYINSTALLER_COMMIT="413cce49ff28d87fad4472f4953489226ec90c84"
|
|
# ^ tag "v5.11.0"
|
|
|
|
PYTHON_VERSION=3.10.11
|
|
|
|
|
|
# Let's begin!
|
|
set -e
|
|
|
|
here="$(dirname "$(readlink -e "$0")")"
|
|
|
|
. "$CONTRIB"/build_tools_util.sh
|
|
|
|
info "Booting wine."
|
|
wine 'wineboot'
|
|
|
|
|
|
cd "$CACHEDIR"
|
|
mkdir -p $WINEPREFIX/drive_c/tmp
|
|
|
|
info "Installing Python."
|
|
# note: you might need "sudo apt-get install dirmngr" for the following
|
|
# keys from https://www.python.org/downloads/#pubkeys
|
|
KEYRING_PYTHON_DEV="keyring-electrum-build-python-dev.gpg"
|
|
gpg --no-default-keyring --keyring $KEYRING_PYTHON_DEV --import "$here"/gpg_keys/7ED10B6531D7C8E1BC296021FC624643487034E5.asc
|
|
if [ "$WIN_ARCH" = "win32" ] ; then
|
|
PYARCH="win32"
|
|
elif [ "$WIN_ARCH" = "win64" ] ; then
|
|
PYARCH="amd64"
|
|
else
|
|
fail "unexpected WIN_ARCH: $WIN_ARCH"
|
|
fi
|
|
PYTHON_DOWNLOADS="$CACHEDIR/python$PYTHON_VERSION"
|
|
mkdir -p "$PYTHON_DOWNLOADS"
|
|
for msifile in core dev exe lib pip tools; do
|
|
echo "Installing $msifile..."
|
|
download_if_not_exist "$PYTHON_DOWNLOADS/${msifile}.msi" "https://www.python.org/ftp/python/$PYTHON_VERSION/$PYARCH/${msifile}.msi"
|
|
download_if_not_exist "$PYTHON_DOWNLOADS/${msifile}.msi.asc" "https://www.python.org/ftp/python/$PYTHON_VERSION/$PYARCH/${msifile}.msi.asc"
|
|
verify_signature "$PYTHON_DOWNLOADS/${msifile}.msi.asc" $KEYRING_PYTHON_DEV || fail "invalid sig for ${msifile}.msi"
|
|
wine msiexec /i "$PYTHON_DOWNLOADS/${msifile}.msi" /qb TARGETDIR=$WINE_PYHOME || fail "wine msiexec failed for ${msifile}.msi"
|
|
done
|
|
|
|
break_legacy_easy_install
|
|
|
|
info "Installing build dependencies."
|
|
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-warn-script-location \
|
|
--cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements-build-base.txt
|
|
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-binary :all: --no-warn-script-location \
|
|
--cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements-build-wine.txt
|
|
|
|
|
|
# copy already built DLLs
|
|
cp "$DLL_TARGET_DIR"/libsecp256k1-*.dll $WINEPREFIX/drive_c/tmp/ || fail "Could not copy libsecp to its destination"
|
|
cp "$DLL_TARGET_DIR/libzbar-0.dll" $WINEPREFIX/drive_c/tmp/ || fail "Could not copy libzbar to its destination"
|
|
cp "$DLL_TARGET_DIR/libusb-1.0.dll" $WINEPREFIX/drive_c/tmp/ || fail "Could not copy libusb to its destination"
|
|
|
|
|
|
info "Building PyInstaller."
|
|
# we build our own PyInstaller boot loader as the default one has high
|
|
# anti-virus false positives
|
|
(
|
|
if [ "$WIN_ARCH" = "win32" ] ; then
|
|
PYINST_ARCH="32bit"
|
|
elif [ "$WIN_ARCH" = "win64" ] ; then
|
|
PYINST_ARCH="64bit"
|
|
else
|
|
fail "unexpected WIN_ARCH: $WIN_ARCH"
|
|
fi
|
|
if [ -f "$CACHEDIR/pyinstaller/PyInstaller/bootloader/Windows-$PYINST_ARCH-intel/runw.exe" ]; then
|
|
info "pyinstaller already built, skipping"
|
|
exit 0
|
|
fi
|
|
cd "$WINEPREFIX/drive_c/electrum"
|
|
ELECTRUM_COMMIT_HASH=$(git rev-parse HEAD)
|
|
cd "$CACHEDIR"
|
|
rm -rf pyinstaller
|
|
mkdir pyinstaller
|
|
cd pyinstaller
|
|
# Shallow clone
|
|
git init
|
|
git remote add origin $PYINSTALLER_REPO
|
|
git fetch --depth 1 origin $PYINSTALLER_COMMIT
|
|
git checkout -b pinned "${PYINSTALLER_COMMIT}^{commit}"
|
|
rm -fv PyInstaller/bootloader/Windows-*/run*.exe || true
|
|
# add reproducible randomness. this ensures we build a different bootloader for each commit.
|
|
# if we built the same one for all releases, that might also get anti-virus false positives
|
|
echo "const char *electrum_tag = \"tagged by Electrum@$ELECTRUM_COMMIT_HASH\";" >> ./bootloader/src/pyi_main.c
|
|
pushd bootloader
|
|
# cross-compile to Windows using host python
|
|
python3 ./waf all CC="${GCC_TRIPLET_HOST}-gcc" \
|
|
CFLAGS="-static"
|
|
popd
|
|
# sanity check bootloader is there:
|
|
[[ -e "PyInstaller/bootloader/Windows-$PYINST_ARCH-intel/runw.exe" ]] || fail "Could not find runw.exe in target dir!"
|
|
) || fail "PyInstaller build failed"
|
|
info "Installing PyInstaller."
|
|
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-warn-script-location ./pyinstaller
|
|
|
|
info "Wine is configured."
|