commit f854232837cb04960f1d116742c44de7f4e78ef7
parent 2886bf8a057e93cd7deeff484e9a12cbe18a0fb3
Author: Johann Bauer <bauerj@bauerj.eu>
Date: Sun, 25 Mar 2018 20:19:56 +0200
Add script to build dmg on Linux
Diffstat:
5 files changed, 212 insertions(+), 26 deletions(-)
diff --git a/contrib/build-osx/README.md b/contrib/build-osx/README.md
@@ -2,17 +2,35 @@ 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.
+The build process consists of two steps:
+## 1. Building the binary
-## 1. Run the script
+This needs to be done on a system running macOS or OS X. We use El Capitan (10.11.6) as building it on High Sierra
+makes the binaries incompatible with older versions.
+Before starting, make sure that the Xcode command line tools are installed (e.g. you have `git`).
- $ cd electrum
- $ ./contrib/build-osx/make_osx
+ cd electrum
+ ./contrib/build-osx/make_osx
+
+This creates a folder named Electrum.app.
-## 2. Done
+## 2. Building the image
+The usual way to distribute macOS applications is to use image files containing the
+application. Although these images can be created on a Mac with the built-in `hdiutil`,
+they are not deterministic.
+
+Instead, we use the toolchain that Bitcoin uses: genisoimage and libdmg-hfsplus.
+These tools do not work on macOS, so you need a separate Linux machine (or VM).
+
+Copy the Electrum.app directory over and install the dependencies, e.g.:
+
+ apt install libcap-dev cmake make gcc faketime
+
+Then you can just invoke `package.sh` with the path to the app:
+
+ cd electrum
+ ./contrib/build-osx/package.sh ~/Electrum.app/+
\ No newline at end of file
diff --git a/contrib/build-osx/base.sh b/contrib/build-osx/base.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env 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 "$1")
+test -n "$build_dir" -a -d "$build_dir" || exit
diff --git a/contrib/build-osx/cdrkit-deterministic.patch b/contrib/build-osx/cdrkit-deterministic.patch
@@ -0,0 +1,86 @@
+--- cdrkit-1.1.11.old/genisoimage/tree.c 2008-10-21 19:57:47.000000000 -0400
++++ cdrkit-1.1.11/genisoimage/tree.c 2013-12-06 00:23:18.489622668 -0500
+@@ -1139,8 +1139,9 @@
+ scan_directory_tree(struct directory *this_dir, char *path,
+ struct directory_entry *de)
+ {
+- DIR *current_dir;
++ int current_file;
+ char whole_path[PATH_MAX];
++ struct dirent **d_list;
+ struct dirent *d_entry;
+ struct directory *parent;
+ int dflag;
+@@ -1164,7 +1165,8 @@
+ this_dir->dir_flags |= DIR_WAS_SCANNED;
+
+ errno = 0; /* Paranoia */
+- current_dir = opendir(path);
++ //current_dir = opendir(path);
++ current_file = scandir(path, &d_list, NULL, alphasort);
+ d_entry = NULL;
+
+ /*
+@@ -1173,12 +1175,12 @@
+ */
+ old_path = path;
+
+- if (current_dir) {
++ if (current_file >= 0) {
+ errno = 0;
+- d_entry = readdir(current_dir);
++ d_entry = d_list[0];
+ }
+
+- if (!current_dir || !d_entry) {
++ if (current_file < 0 || !d_entry) {
+ int ret = 1;
+
+ #ifdef USE_LIBSCHILY
+@@ -1191,8 +1193,8 @@
+ de->isorec.flags[0] &= ~ISO_DIRECTORY;
+ ret = 0;
+ }
+- if (current_dir)
+- closedir(current_dir);
++ if(d_list)
++ free(d_list);
+ return (ret);
+ }
+ #ifdef ABORT_DEEP_ISO_ONLY
+@@ -1208,7 +1210,7 @@
+ errmsgno(EX_BAD, "use Rock Ridge extensions via -R or -r,\n");
+ errmsgno(EX_BAD, "or allow deep ISO9660 directory nesting via -D.\n");
+ }
+- closedir(current_dir);
++ free(d_list);
+ return (1);
+ }
+ #endif
+@@ -1250,13 +1252,13 @@
+ * The first time through, skip this, since we already asked
+ * for the first entry when we opened the directory.
+ */
+- if (dflag)
+- d_entry = readdir(current_dir);
++ if (dflag && current_file >= 0)
++ d_entry = d_list[current_file];
+ dflag++;
+
+- if (!d_entry)
++ if (current_file < 0)
+ break;
+-
++ current_file--;
+ /* OK, got a valid entry */
+
+ /* If we do not want all files, then pitch the backups. */
+@@ -1348,7 +1350,7 @@
+ insert_file_entry(this_dir, whole_path, d_entry->d_name);
+ #endif /* APPLE_HYB */
+ }
+- closedir(current_dir);
++ free(d_list);
+
+ #ifdef APPLE_HYB
+ /*+
\ No newline at end of file
diff --git a/contrib/build-osx/make_osx b/contrib/build-osx/make_osx
@@ -1,28 +1,16 @@
-#!/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`
+#!/usr/bin/env bash
-# Paramterize
+# Parameterize
PYTHON_VERSION=3.6.4
BUILDDIR=/tmp/electrum-build
PACKAGE=Electrum
GIT_REPO=https://github.com/spesmilo/electrum
+. $(dirname "$0")/base.sh
+cd $build_dir/../..
+
+export PYTHONHASHSEED=22
+VERSION=`git describe --tags`
info "Installing Python $PYTHON_VERSION"
export PATH="~/.pyenv/bin:~/.pyenv/shims:~/Library/Python/3.6/bin:$PATH"
diff --git a/contrib/build-osx/package.sh b/contrib/build-osx/package.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+cdrkit_version=1.1.11
+cdrkit_download_path=http://distro.ibiblio.org/fatdog/source/600/c
+cdrkit_file_name=cdrkit-${cdrkit_version}.tar.bz2
+cdrkit_sha256_hash=b50d64c214a65b1a79afe3a964c691931a4233e2ba605d793eb85d0ac3652564
+cdrkit_patches=cdrkit-deterministic.patch
+genisoimage=genisoimage-$cdrkit_version
+
+libdmg_url=https://github.com/theuni/libdmg-hfsplus
+
+
+export LD_PRELOAD=$(locate libfaketime.so.1)
+export FAKETIME="2000-01-22 00:00:00"
+export PATH=$PATH:~/bin
+
+. $(dirname "$0")/base.sh
+
+if [ -z "$1" ]; then
+ echo "Usage: $0 Electrum.app"
+ exit -127
+fi
+
+mkdir -p ~/bin
+
+if ! which ${genisoimage} > /dev/null 2>&1; then
+ mkdir -p /tmp/electrum-macos
+ cd /tmp/electrum-macos
+ info "Downloading cdrkit $cdrkit_version"
+ wget -nc ${cdrkit_download_path}/${cdrkit_file_name}
+ tar xvf ${cdrkit_file_name}
+
+ info "Patching genisoimage"
+ cd cdrkit-${cdrkit_version}
+ patch -p1 < ../cdrkit-deterministic.patch
+
+ info "Building genisoimage"
+ cmake . -Wno-dev
+ make genisoimage
+ cp genisoimage/genisoimage ~/bin/${genisoimage}
+fi
+
+if ! which dmg > /dev/null 2>&1; then
+ mkdir -p /tmp/electrum-macos
+ cd /tmp/electrum-macos
+ info "Downloading libdmg"
+ LD_PRELOAD= git clone ${libdmg_url}
+ cd libdmg-hfsplus
+ info "Building libdmg"
+ cmake .
+ make
+ cp dmg/dmg ~/bin
+fi
+
+${genisoimage} -version || fail "Unable to install genisoimage"
+dmg -|| fail "Unable to install libdmg"
+
+rm -rf /tmp/electrum-macos/image > /dev/null 2>&1
+mkdir /tmp/electrum-macos/image/
+cp -r $1 /tmp/electrum-macos/image/
+
+cd $build_dir
+
+${genisoimage} \
+ -no-cache-inodes \
+ -D \
+ -l \
+ -probe \
+ -V "Electrum" \
+ -no-pad \
+ -r \
+ -dir-mode 0755 \
+ -apple \
+ -o Electrum_uncompressed.dmg \
+ /tmp/electrum-macos/image || fail "Unable to create uncompressed dmg"
+
+dmg dmg Electrum_uncompressed.dmg Electrum.dmg || fail "Unable to create compressed dmg"