URI: 
       tAdd script to build dmg on Linux - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit f854232837cb04960f1d116742c44de7f4e78ef7
   DIR parent 2886bf8a057e93cd7deeff484e9a12cbe18a0fb3
  HTML Author: Johann Bauer <bauerj@bauerj.eu>
       Date:   Sun, 25 Mar 2018 20:19:56 +0200
       
       Add script to build dmg on Linux
       
       Diffstat:
         M contrib/build-osx/README.md         |      33 ++++++++++++++++++++++++-------
         A contrib/build-osx/base.sh           |      15 +++++++++++++++
         A contrib/build-osx/cdrkit-determini… |      87 +++++++++++++++++++++++++++++++
         M contrib/build-osx/make_osx          |      26 +++++++-------------------
         A contrib/build-osx/package.sh        |      77 +++++++++++++++++++++++++++++++
       
       5 files changed, 212 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/contrib/build-osx/README.md b/contrib/build-osx/README.md
       t@@ -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
   DIR diff --git a/contrib/build-osx/base.sh b/contrib/build-osx/base.sh
       t@@ -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
   DIR diff --git a/contrib/build-osx/cdrkit-deterministic.patch b/contrib/build-osx/cdrkit-deterministic.patch
       t@@ -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
   DIR diff --git a/contrib/build-osx/make_osx b/contrib/build-osx/make_osx
       t@@ -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"
   DIR diff --git a/contrib/build-osx/package.sh b/contrib/build-osx/package.sh
       t@@ -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"