#!/bin/bash NAME_ROOT=electrum export PYTHONDONTWRITEBYTECODE=1 # don't create __pycache__/ folders with .pyc files # Let's begin! set -e . "$CONTRIB"/build_tools_util.sh pushd $WINEPREFIX/drive_c/electrum VERSION=$(git describe --tags --dirty --always) info "Last commit: $VERSION" # Load electrum-locale for this release git submodule update --init LOCALE="$WINEPREFIX/drive_c/electrum/electrum/locale/" # we want the binary to have only compiled (.mo) locale files; not source (.po) files rm -rf "$LOCALE" "$CONTRIB/build_locale.sh" "$CONTRIB/deterministic-build/electrum-locale/locale/" "$LOCALE" find -exec touch -h -d '2000-11-11T11:11:11+00:00' {} + popd # opt out of compiling C extensions export AIOHTTP_NO_EXTENSIONS=1 export YARL_NO_EXTENSIONS=1 export MULTIDICT_NO_EXTENSIONS=1 export FROZENLIST_NO_EXTENSIONS=1 info "Installing requirements..." $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.txt info "Installing dependencies specific to binaries..." # TODO use "--no-binary :all:" (but we don't have a C compiler...) $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-binaries.txt info "Installing hardware wallet requirements..." # TODO use "--no-binary :all:" (but we don't have a C compiler...) $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-hw.txt pushd $WINEPREFIX/drive_c/electrum # see https://github.com/pypa/pip/issues/2195 -- pip makes a copy of the entire directory info "Pip installing Electrum. This might take a long time if the project folder is large." $WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-warn-script-location . popd rm -rf dist/ # build standalone and portable versions info "Running pyinstaller..." ELECTRUM_CMDLINE_NAME="$NAME_ROOT-$VERSION" wine "$WINE_PYHOME/scripts/pyinstaller.exe" --noconfirm --ascii --clean -w deterministic.spec # set timestamps in dist, in order to make the installer reproducible pushd dist find -exec touch -h -d '2000-11-11T11:11:11+00:00' {} + popd info "building NSIS installer" # $VERSION could be passed to the electrum.nsi script, but this would require some rewriting in the script itself. wine "$WINEPREFIX/drive_c/Program Files (x86)/NSIS/makensis.exe" /DPRODUCT_VERSION=$VERSION electrum.nsi cd dist mv electrum-setup.exe $NAME_ROOT-$VERSION-setup.exe cd .. info "Padding binaries to 8-byte boundaries, and fixing COFF image checksum in PE header" # note: 8-byte boundary padding is what osslsigncode uses: # https://github.com/mtrojnar/osslsigncode/blob/6c8ec4427a0f27c145973450def818e35d4436f6/osslsigncode.c#L3047 ( cd dist for binary_file in ./*.exe; do info ">> fixing $binary_file..." # code based on https://github.com/erocarrera/pefile/blob/bbf28920a71248ed5c656c81e119779c131d9bd4/pefile.py#L5877 python3 <> 32) if checksum > 2 ** 32: checksum = (checksum & 0xffffffff) + (checksum >> 32) checksum = (checksum & 0xffff) + (checksum >> 16) checksum = (checksum) + (checksum >> 16) checksum = checksum & 0xffff checksum += len(binary) # Set the checksum binary[checksum_offset : checksum_offset + 4] = int.to_bytes(checksum, byteorder="little", length=4) with open(pe_file, "wb") as f: f.write(binary) EOF done ) sha256sum dist/electrum*.exe