tMerge pull request #3814 from bauerj/macos-build - electrum - Electrum Bitcoin wallet (HTM) git clone https://git.parazyd.org/electrum (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules --- (DIR) commit 146f2dd56839619dfac4f83080a1d03fbf445531 (DIR) parent 08bf966f32219bfec94d3ba942ac921b35053efd (HTM) Author: ThomasV <thomasv@electrum.org> Date: Wed, 7 Feb 2018 17:14:29 +0100 Merge pull request #3814 from bauerj/macos-build Update macOS build Diffstat: M README.rst | 12 ++---------- A contrib/build-osx/README.md | 17 +++++++++++++++++ A contrib/build-osx/make_osx | 75 +++++++++++++++++++++++++++++++ A contrib/build-osx/osx.spec | 87 +++++++++++++++++++++++++++++++ D contrib/make_osx | 6 ------ D contrib/osx.spec | 87 ------------------------------- 6 files changed, 181 insertions(+), 103 deletions(-) --- (DIR) diff --git a/README.rst b/README.rst t@@ -93,20 +93,12 @@ This directory contains the python dependencies used by Electrum. Mac OS X / macOS -------- -:: - - # On MacPorts installs: - sudo python3 setup-release.py py2app - - # On Homebrew installs: - ARCHFLAGS="-arch i386 -arch x86_64" sudo python3 setup-release.py py2app --includes sip - - sudo hdiutil create -fs HFS+ -volname "Electrum" -srcfolder dist/Electrum.app dist/electrum-VERSION-macosx.dmg +See `contrib/build-osx/`. Windows ------- -See `contrib/build-wine/README` file. +See `contrib/build-wine/`. Android (DIR) diff --git a/contrib/build-osx/README.md b/contrib/build-osx/README.md t@@ -0,0 +1,17 @@ +Building Mac OS binaries +======================== + +This guide explains how to build Electrum binaries for macOS systems. +We build our binaries on El Capitan (10.11.6) as building it on High Sierra +makes the binaries incompatible with older versions. + +This assumes that the Xcode command line tools (and thus git) are already installed. + + +## 1. Run the script + + + + ./make_osx + +## 2. Done (DIR) diff --git a/contrib/build-osx/make_osx b/contrib/build-osx/make_osx t@@ -0,0 +1,75 @@ +#!/bin/bash +RED='\033[0;31m' +BLUE='\033[0,34m' +NC='\033[0m' # No Color +function info { + printf "\r💬 ${BLUE}INFO:${NC} ${1}\n" +} +function fail { + printf "\r🗯 ${RED}ERROR:${NC} ${1}\n" + exit 1 +} + +build_dir=$(dirname "$0") +test -n "$build_dir" -a -d "$build_dir" || exit +cd $build_dir/../.. + +export PYTHONHASHSEED=22 +VERSION=`git describe --tags` +PYTHON_VERSION=3.6.4 + + +info "Installing Python $PYTHON_VERSION" +export PATH="~/.pyenv/bin:~/.pyenv/shims:$PATH:~/Library/Python/3.6/bin" +if [ -d "~/.pyenv" ]; then + pyenv update +else + curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash > /dev/null 2>&1 +fi +PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install -s $PYTHON_VERSION && \ +pyenv global $PYTHON_VERSION || \ +fail "Unable to use Python $PYTHON_VERSION" + + +if ! which pyinstaller > /dev/null; then + info "Installing pyinstaller" + python3 -m pip install pyinstaller -I --user || fail "Could not install pyinstaller" +fi + +info "Using these versions for building Electrum:" +sw_vers +python3 --version +echo -n "Pyinstaller " +pyinstaller --version + +rm -rf ./dist + + +rm -rf /tmp/electrum-build > /dev/null 2>&1 +mkdir /tmp/electrum-build + +info "Downloading icons and locale..." +for repo in icons locale; do + git clone https://github.com/spesmilo/electrum-$repo /tmp/electrum-build/electrum-$repo +done + +cp -R /tmp/electrum-build/electrum-locale/locale/ ./lib/locale/ +cp /tmp/electrum-build/electrum-icons/icons_rc.py ./gui/qt/ + +info "Installing requirements..." +python3 -m pip install -Ir ./contrib/deterministic-build/requirements.txt --user && \ +python3 -m pip install pyqt5 --user || \ +fail "Could not install requirements" + +info "Installing hardware wallet requirements..." +python3 -m pip install -Ir ./contrib/deterministic-build/requirements-hw.txt --user || \ +fail "Could not install hardware wallet requirements" + +info "Building Electrum..." +python3 setup.py install --user > /dev/null || fail "Could not build Electrum" + +info "Building binary" +pyinstaller --noconfirm --ascii --name $VERSION contrib/build-osx/osx.spec || fail "Could not build binary" + +info "Creating .DMG" +hdiutil create -fs HFS+ -volname "Electrum" -srcfolder dist/Electrum.app dist/electrum-$VERSION.dmg || fail "Could not create .DMG" (DIR) diff --git a/contrib/build-osx/osx.spec b/contrib/build-osx/osx.spec t@@ -0,0 +1,86 @@ +# -*- mode: python -*- + +from PyInstaller.utils.hooks import collect_data_files, collect_submodules + +import sys +import os + +for i, x in enumerate(sys.argv): + if x == '--name': + VERSION = sys.argv[i+1] + break +else: + raise BaseException('no version') + +electrum = os.path.abspath(".") + "/" +block_cipher = None + +# see https://github.com/pyinstaller/pyinstaller/issues/2005 +hiddenimports = [] +hiddenimports += collect_submodules('trezorlib') +hiddenimports += collect_submodules('btchip') +hiddenimports += collect_submodules('keepkeylib') + +datas = [ + (electrum+'lib/currencies.json', 'electrum'), + (electrum+'lib/servers.json', 'electrum'), + (electrum+'lib/checkpoints.json', 'electrum'), + (electrum+'lib/servers_testnet.json', 'electrum'), + (electrum+'lib/checkpoints_testnet.json', 'electrum'), + (electrum+'lib/wordlist/english.txt', 'electrum/wordlist'), + (electrum+'lib/locale', 'electrum/locale'), + (electrum+'plugins', 'electrum_plugins'), +] +datas += collect_data_files('trezorlib') +datas += collect_data_files('btchip') +datas += collect_data_files('keepkeylib') + +# We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports +a = Analysis([electrum+'electrum', + electrum+'gui/qt/main_window.py', + electrum+'gui/text.py', + electrum+'lib/util.py', + electrum+'lib/wallet.py', + electrum+'lib/simple_config.py', + electrum+'lib/bitcoin.py', + electrum+'lib/dnssec.py', + electrum+'lib/commands.py', + electrum+'plugins/cosigner_pool/qt.py', + electrum+'plugins/email_requests/qt.py', + electrum+'plugins/trezor/client.py', + electrum+'plugins/trezor/qt.py', + electrum+'plugins/keepkey/qt.py', + electrum+'plugins/ledger/qt.py', + ], + datas=datas, + hiddenimports=hiddenimports, + hookspath=[]) + +# http://stackoverflow.com/questions/19055089/pyinstaller-onefile-warning-pyconfig-h-when-importing-scipy-or-scipy-signal +for d in a.datas: + if 'pyconfig' in d[0]: + a.datas.remove(d) + break + +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE(pyz, + a.scripts, + a.binaries, + a.datas, + name='Electrum', + debug=False, + strip=False, + upx=True, + icon=electrum+'electrum.icns', + console=False) + +app = BUNDLE(exe, + version = VERSION, + name='Electrum.app', + icon=electrum+'electrum.icns', + bundle_identifier=None, + info_plist = { + 'NSHighResolutionCapable':'True' + } +) +\ No newline at end of file (DIR) diff --git a/contrib/make_osx b/contrib/make_osx t@@ -1,6 +0,0 @@ -#!/bin/bash -rm -rf dist -export PYTHONHASHSEED=22 -VERSION=`git describe --tags` -pyinstaller --noconfirm --ascii --name $VERSION contrib/osx.spec -hdiutil create -fs HFS+ -volname "Electrum" -srcfolder dist/Electrum.app dist/electrum-$VERSION.dmg (DIR) diff --git a/contrib/osx.spec b/contrib/osx.spec t@@ -1,86 +0,0 @@ -# -*- mode: python -*- - -from PyInstaller.utils.hooks import collect_data_files, collect_submodules - -import sys -import os - -for i, x in enumerate(sys.argv): - if x == '--name': - VERSION = sys.argv[i+1] - break -else: - raise BaseException('no version') - -electrum = "../" -block_cipher=None - -# see https://github.com/pyinstaller/pyinstaller/issues/2005 -hiddenimports = [] -hiddenimports += collect_submodules('trezorlib') -hiddenimports += collect_submodules('btchip') -hiddenimports += collect_submodules('keepkeylib') - -datas = [ - (electrum+'lib/currencies.json', 'electrum'), - (electrum+'lib/servers.json', 'electrum'), - (electrum+'lib/checkpoints.json', 'electrum'), - (electrum+'lib/servers_testnet.json', 'electrum'), - (electrum+'lib/checkpoints_testnet.json', 'electrum'), - (electrum+'lib/wordlist/english.txt', 'electrum/wordlist'), - (electrum+'lib/locale', 'electrum/locale'), - (electrum+'plugins', 'electrum_plugins'), -] -datas += collect_data_files('trezorlib') -datas += collect_data_files('btchip') -datas += collect_data_files('keepkeylib') - -# We don't put these files in to actually include them in the script but to make the Analysis method scan them for imports -a = Analysis([electrum+'electrum', - electrum+'gui/qt/main_window.py', - electrum+'gui/text.py', - electrum+'lib/util.py', - electrum+'lib/wallet.py', - electrum+'lib/simple_config.py', - electrum+'lib/bitcoin.py', - electrum+'lib/dnssec.py', - electrum+'lib/commands.py', - electrum+'plugins/cosigner_pool/qt.py', - electrum+'plugins/email_requests/qt.py', - electrum+'plugins/trezor/client.py', - electrum+'plugins/trezor/qt.py', - electrum+'plugins/keepkey/qt.py', - electrum+'plugins/ledger/qt.py', - ], - datas=datas, - hiddenimports=hiddenimports, - hookspath=[]) - -# http://stackoverflow.com/questions/19055089/pyinstaller-onefile-warning-pyconfig-h-when-importing-scipy-or-scipy-signal -for d in a.datas: - if 'pyconfig' in d[0]: - a.datas.remove(d) - break - -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE(pyz, - a.scripts, - a.binaries, - a.datas, - name='Electrum', - debug=False, - strip=False, - upx=True, - icon=electrum+'electrum.icns', - console=False) - -app = BUNDLE(exe, - version = VERSION, - name='Electrum.app', - icon=electrum+'electrum.icns', - bundle_identifier=None, - info_plist = { - 'NSHighResolutionCapable':'True' - } -) -\ No newline at end of file