From 592b9055db6da8e3357cdcd936d2ecc87194c88a Mon Sep 17 00:00:00 2001
From: Alexander Kojevnikov <alexander@kojevnikov.com>
Date: Wed, 29 Aug 2012 21:27:13 -0700
Subject: [PATCH] win: Update bundle scripts

Build a single EXE version (issue 2)
---
 .gitignore                 |   3 +
 Makefile.am                |  10 +--
 configure.ac               |   2 +-
 dist/{README => README.md} |   3 +-
 dist/win/README.md         |  26 ++++++++
 dist/win/bundle.bat        |  21 +++++++
 dist/win/bundle.sh         | 125 +++++++++++++------------------------
 dist/win/spek.wxs.in       |  23 +++----
 8 files changed, 109 insertions(+), 104 deletions(-)
 rename dist/{README => README.md} (94%)
 create mode 100644 dist/win/README.md
 create mode 100644 dist/win/bundle.bat

diff --git a/.gitignore b/.gitignore
index 32b8cb2..68a9227 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,9 @@
 *.a
+*.exe
 *.msi
 *.o
 *.xz
+*.zip
 *~
 .DS_Store
 .deps
@@ -19,6 +21,7 @@ depcomp
 dist/osx/Spek.app
 dist/osx/Spek.dmg
 dist/osx/spek.modules
+dist/win/Spek
 dist/win/spek.wxs
 install-sh
 intltool-extract.in
diff --git a/Makefile.am b/Makefile.am
index 58af2ef..ffe24e1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -7,9 +7,6 @@ SUBDIRS = \
 	tests
 
 EXTRA_DIST = \
-	intltool-extract.in \
-	intltool-merge.in \
-	intltool-update.in \
 	dist/osx/DS_Store \
 	dist/osx/Info.plist \
 	dist/osx/README.md \
@@ -19,13 +16,18 @@ EXTRA_DIST = \
 	dist/osx/launcher.sh \
 	dist/osx/spek.bundle \
 	dist/osx/spek.modules \
+	dist/win/README.md \
 	dist/win/banner.bmp \
+	dist/win/bundle.bat \
 	dist/win/bundle.sh \
 	dist/win/dialog.bmp \
 	dist/win/fix-msi.js \
 	dist/win/spek.ico \
 	dist/win/spek.rc \
-	dist/win/spek.wxs
+	dist/win/spek.wxs \
+	intltool-extract.in \
+	intltool-merge.in \
+	intltool-update.in
 
 DISTCLEANFILES = \
 	intltool-extract \
diff --git a/configure.ac b/configure.ac
index 738e6c0..f0e5f07 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,7 +51,7 @@ GETTEXT_PACKAGE=spek
 AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"], [Gettext Package])
 AC_SUBST(GETTEXT_PACKAGE)
 AM_GNU_GETTEXT_VERSION([0.18.1])
-AM_GNU_GETTEXT([external])
+AM_PO_SUBDIRS
 
 AC_CONFIG_FILES([
 	Makefile
diff --git a/dist/README b/dist/README.md
similarity index 94%
rename from dist/README
rename to dist/README.md
index 0987b6d..4837be4 100644
--- a/dist/README
+++ b/dist/README.md
@@ -1,5 +1,4 @@
-Spek release checklist
-==============================================================================
+# Spek release checklist
 
  * Bump the version number in configure.ac.
  * `cd po && make update-po && tx push -s`.
diff --git a/dist/win/README.md b/dist/win/README.md
new file mode 100644
index 0000000..9bdd9a7
--- /dev/null
+++ b/dist/win/README.md
@@ -0,0 +1,26 @@
+# Building the Windows installer
+
+This is done in two steps:
+
+ * Cross-compiling spek.exe using [MXE](http://mxe.cc/)
+ * Building the MSI package under Windows
+
+For the first step you can use any Unix-y environment. Set up
+[MXE](http://mxe.cc/#tutorial), you can use the code from
+[this repository](https://github.com/alexkay/mxe/tree/spek) or the official one.
+
+Build Spek dependencies:
+
+```
+% make pthreads ffmpeg wxwidgets
+```
+
+Build Spek, adjusting `bundle.sh` variables as necessary:
+
+```
+% ./dist/win/bundle.sh
+```
+
+For the second step, you will need a Windows box with
+[WiX](http://wix.sourceforge.net/) installed. Copy over the entire `dist/win`
+directory and run `bundle.bat`.
diff --git a/dist/win/bundle.bat b/dist/win/bundle.bat
new file mode 100644
index 0000000..9658915
--- /dev/null
+++ b/dist/win/bundle.bat
@@ -0,0 +1,21 @@
+rem This script will build an MSI installer for Win32.
+rem Check README.md in this directory for instructions.
+
+set WIX_PATH=c:\Program Files\Windows Installer XML v3.5\bin
+
+del spek.msi
+
+rem Generate a wxs for files in Spek
+move Spek\spek.exe .\
+"%WIX_PATH%"\heat dir Spek -gg -ke -srd -cg Files -dr INSTALLLOCATION -template fragment -o files.wxs
+move spek.exe Spek\
+
+rem Make the MSI package
+"%WIX_PATH%"\candle spek.wxs files.wxs
+"%WIX_PATH%"\light -ext WixUIExtension.dll -b Spek spek.wixobj files.wixobj -o spek.msi
+start /wait fix-msi.js spek.msi
+
+rem Clean up
+del files.wxs
+del *.wixobj
+del *.wixpdb
diff --git a/dist/win/bundle.sh b/dist/win/bundle.sh
index 026f6ed..0199546 100755
--- a/dist/win/bundle.sh
+++ b/dist/win/bundle.sh
@@ -1,95 +1,54 @@
-#!/usr/bin/env bash
+#!/bin/sh
 
-# This script will build a ZIP archive and an MSI installer for Win32.
-# It requires a fully functioning MinGW/MSYS environment.
-# The script also depends on 7z and WiX.
+# This script will cross-compile spek.exe, make a ZIP archive and prepare files
+# for building an MSI installer under Windows.
+# Check README.md in this directory for instructions.
 
-WIX_PATH=c:/Program\ Files/Windows\ Installer\ XML\ v3.5/bin
-SZ_PATH=c:/Program\ Files/7-Zip
+# Adjust these variables if necessary.
+HOST=i686-pc-mingw32
+LANGUAGES="cs da de eo es fr it ja nl pl pt_BR ru sv uk zh_CN zh_TW"
+MAKE=gmake
+MXE=$(realpath $(dirname $0)/../../../mxe/usr/i686-pc-mingw32)
+STRIP=$(which i686-pc-mingw32-strip)
+UPX=$(which upx)
+WINDRES=$(which i686-pc-mingw32-windres)
+WX_CONFIG="$MXE"/bin/wx-config
+ZIP=$(which zip)
 
-pushd $(dirname $0)/../..
-
-rm -fr dist/win/Spek
-mkdir dist/win/Spek
-rm dist/win/spek.{msi,zip}
+cd $(dirname $0)/../..
+rm -fr dist/win/build && mkdir dist/win/build
 
 # Compile the resource file
-windres dist/win/spek.rc -O coff -o dist/win/spek.res
+"$WINDRES" dist/win/spek.rc -O coff -o dist/win/spek.res
 mkdir -p src/dist/win && cp dist/win/spek.res src/dist/win/
 
-CFLAGS="-mwindows" LDFLAGS="dist/win/spek.res" ./configure --prefix=${PWD}/dist/win/Spek && make && make install
+# Compile and strip spek.exe
+LDFLAGS="dist/win/spek.res" ./configure \
+    --host="$HOST" \
+    --with-wx-config="$WX_CONFIG" \
+    --prefix=${PWD}/dist/win/build && \
+    "$MAKE" && \
+    "$MAKE" install
+"$STRIP" dist/win/build/bin/spek.exe
+"$UPX" dist/win/build/bin/spek.exe
 
-cd dist/win/Spek
-
-urls=(\
-# GTK+ and its dependencies
-"http://ftp.gnome.org/pub/gnome/binaries/win32/atk/1.32/atk_1.32.0-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/gdk-pixbuf/2.22/gdk-pixbuf_2.22.1-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.1-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+_2.24.0-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/pango/1.28/pango_1.28.3-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo_1.10.2-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/expat_2.0.1-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/fontconfig_2.8.0-2_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/freetype_2.4.4-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/hicolor-icon-theme_0.10-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libpng_1.4.3-1_win32.zip" \
-"http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/zlib_1.2.5-2_win32.zip" \
-)
-
-for url in ${urls[*]}
-do
-  wget $url
-  if [ $? != 0 ]; then
-    echo "Can't get $url"
-    popd
-    exit 1
-  fi
-  name=$(basename $url)
-  "$SZ_PATH"/7z x -y $name
-  rm $name
+# Copy files to the bundle
+cd dist/win
+rm -fr Spek && mkdir Spek
+cp build/bin/spek.exe Spek/
+for lang in $LANGUAGES; do
+    mkdir -p Spek/"$lang"
+    cp build/lib/locale/"$lang"/LC_MESSAGES/spek.mo Spek/"$lang"/
+    cp "$MXE"/share/locale/"$lang"/LC_MESSAGES/wxstd.mo Spek/"$lang"/
 done
-
-# ffmpeg configure options:
-# ./configure --disable-static --enable-shared --enable-gpl --enable-version3 --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-swscale --disable-postproc --enable-pthreads --disable-encoders --disable-muxers --disable-devices --disable-filters --enable-memalign-hack --enable-runtime-cpudetect --disable-debug --prefix=/usr
-
-cp /usr/bin/avcodec-53.dll bin/
-cp /usr/bin/avformat-53.dll bin/
-cp /usr/bin/avutil-51.dll bin/
-
-# Clean up
-mv bin/spek.exe ../
-mkdir share/locale_
-mv share/locale/{cs,da,de,eo,es,fr,it,ja,nl,pl,pt_BR,ru,sv,uk,zh_CN,zh_TW} share/locale_/
-rm -fr share/locale
-mv share/locale_ share/locale
-rm -fr doc
-rm -fr presets
-rm -fr manifest
-rm bin/*.exe
-
-# Set the default GTK theme
-echo "gtk-theme-name = \"MS-Windows\"" > etc/gtk-2.0/gtkrc
-
-cd ..
-
-# Generate a wxs for files in Spek
-"$WIX_PATH"/heat dir Spek -gg -ke -srd -cg Files -dr INSTALLLOCATION -template fragment -o files.wxs
-
-# Make the MSI package
-"$WIX_PATH"/candle spek.wxs files.wxs
-"$WIX_PATH"/light -ext WixUIExtension.dll -b Spek spek.wixobj files.wixobj -o spek.msi
-start fix-msi.js spek.msi
-
-# Clean up
-rm *.res
-rm *.wixobj
-rm *.wixpdb
+rm -fr build
 
 # Create a zip archive
-mv spek.exe Spek/bin/
-cp spek.ico Spek/
-"$SZ_PATH"/7z a spek.zip Spek
+rm -f spek.zip
+"$ZIP" -r spek.zip Spek
 
-popd
\ No newline at end of file
+cd ../..
+
+# Clean up
+rm -fr src/dist
+rm dist/win/spek.res
diff --git a/dist/win/spek.wxs.in b/dist/win/spek.wxs.in
index 9ff824e..63ea80c 100644
--- a/dist/win/spek.wxs.in
+++ b/dist/win/spek.wxs.in
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?define ProductName = "Spek" ?>
 <?define Manufacturer = "Spek Project" ?>
-<?define ProductVersion = "@VERSION@.0" ?>
+<?define ProductVersion = "@VERSION@" ?>
 <?define UpgradeCode = "46D51DDF-5749-45E2-818B-1ACADF21C0D9" ?>
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
   <Product Id="*" Name="$(var.ProductName)" Language="0"
@@ -32,7 +32,7 @@
     <Icon Id="ProgramIcon" SourceFile="spek.ico"/>
     <DirectoryRef Id="ProgramMenuSubfolder">
       <Component Id="StartMenuShortcut" Guid="165DF12B-D970-49BC-B07B-880B62ABC308">
-        <Shortcut Id="StartMenuShortcut" Name="$(var.ProductName)" Icon="ProgramIcon" Target="[INSTALLLOCATION]bin\spek.exe" WorkingDirectory="bin"/>
+        <Shortcut Id="StartMenuShortcut" Name="$(var.ProductName)" Icon="ProgramIcon" Target="[INSTALLLOCATION]spek.exe" WorkingDirectory="INSTALLLOCATION"/>
         <Shortcut Id="UninstallProduct" Name="Uninstall $(var.ProductName)" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]"/>
         <RemoveFolder Id="ProgramMenuSubfolder" On="uninstall"/>
         <RegistryValue Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
@@ -40,7 +40,7 @@
     </DirectoryRef>
     <DirectoryRef Id="DesktopFolder">
       <Component Id="DesktopShortcut" Guid="ACCE1EDB-87E3-4FE5-B2BF-93113E767381">
-        <Shortcut Id="DesktopShortcut" Name="$(var.ProductName)" Icon="ProgramIcon" Target="[INSTALLLOCATION]bin\spek.exe" WorkingDirectory="bin"/>
+        <Shortcut Id="DesktopShortcut" Name="$(var.ProductName)" Icon="ProgramIcon" Target="[INSTALLLOCATION]spek.exe" WorkingDirectory="INSTALLLOCATION"/>
         <RegistryValue Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
       </Component>
     </DirectoryRef>
@@ -54,27 +54,28 @@
         <Directory Id="INSTALLLOCATION" Name="$(var.ProductName)">
           <Component Id="Main" Guid="CD5121AD-F799-4796-9DB8-0C24CA0A4C8E">
             <File Id="spek.ico" Name="spek.ico" Source="spek.ico" />
+            <File Id="spek.exe" Name="spek.exe" Source="spek.exe" />
             <!-- Capabilities keys for Vista/7 "Set Program Access and Defaults" -->
             <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities" Name="ApplicationDescription" Value="Acoustic Spectrum Analyser" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities" Name="ApplicationIcon" Value="[#spek.ico]" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities" Name="ApplicationName" Value="Spek" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities\DefaultIcon" Value="[#spek.ico]" Type="string" />
-            <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities\shell\open\command" Value="&quot;[INSTALLLOCATION]bin\spek.exe&quot; &quot;%1&quot;" Type="string" />
+            <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities\shell\open\command" Value="&quot;[INSTALLLOCATION]spek.exe&quot; &quot;%1&quot;" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\RegisteredApplications" Name="Spek" Value="SOFTWARE\Spek\Capabilities" Type="string" />
             <!-- App Paths to support Start,Run -> "spek" -->
-            <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\spek.exe" Value="[INSTALLLOCATION]bin\spek.exe" Type="string" />
-            <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\spek.exe" Name="Path" Value="[INSTALLLOCATION]bin" Type="string" />
+            <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\spek.exe" Value="[INSTALLLOCATION]spek.exe" Type="string" />
+            <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\spek.exe" Name="Path" Value="[INSTALLLOCATION]" Type="string" />
             <!-- Extend to the "open with" list + Win7 jump menu pinning  -->
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\spek.exe" Value="Acoustic Spectrum Analyser" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\spek.exe" Name="FriendlyAppName" Value="Spek" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\spek.exe\DefaultIcon" Value="[#spek.ico]" Type="string" />
-            <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\spek.exe\shell\open\command" Value="&quot;[INSTALLLOCATION]bin\spek.exe&quot; &quot;%1&quot;" Type="string" />
+            <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\spek.exe\shell\open\command" Value="&quot;[INSTALLLOCATION]spek.exe&quot; &quot;%1&quot;" Type="string" />
             <!-- Spek.Audio class -->
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio" Value="Spek Audio File" KeyPath="yes" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio" Name="FriendlyTypeName" Value="Spek Audio File" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio\DefaultIcon" Value="[#spek.ico]" Type="string" />
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio\shell" Value="open" Type="string" />
-            <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio\shell\open\command" Value="&quot;[INSTALLLOCATION]bin\spek.exe&quot; &quot;%1&quot;" Type="string" />
+            <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Spek.Audio\shell\open\command" Value="&quot;[INSTALLLOCATION]spek.exe&quot; &quot;%1&quot;" Type="string" />
             <!-- Associate with file extensions -->
             <?foreach ext in "3gp;aac,aif;aifc;aiff;amr;awb;ape;au;dts;flac;gsm;m4a;m4p;mp3;mp4;mp+;mpc;mpp;oga;ogg;ra;ram;snd;wav;wma;wv"?>
             <RegistryValue Root="HKLM" Key="SOFTWARE\Spek\Capabilities\FileAssociations" Name=".$(var.ext)" Value="Spek.Audio" Type="string" />
@@ -83,17 +84,11 @@
             <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.$(var.ext)\OpenWithProgids" Name="Spek.Audio" Value="" Type="string" />
             <?endforeach?>
           </Component>
-          <Directory Id="bin" Name="bin">
-            <Component Id="Spek" Guid="EC0CA007-EC9E-44E2-B9DE-AE91D3C8EF70">
-              <File Id="spek.exe" Name="spek.exe" Source="spek.exe" />
-            </Component>
-          </Directory>
         </Directory>
       </Directory>
     </Directory>
     <Feature Id="All" Title="$(var.ProductName)" Level="1">
       <ComponentRef Id="Main" />
-      <ComponentRef Id="Spek" />
       <ComponentGroupRef Id="Files" />
       <ComponentRef Id="StartMenuShortcut" />
       <ComponentRef Id="DesktopShortcut" />