From 73ecf07dec70f66e9afa074ec0c18bed0cf050f0 Mon Sep 17 00:00:00 2001
From: Peter Surda <surda@economicsofbitcoin.com>
Date: Sun, 16 Feb 2020 00:20:40 +0800
Subject: [PATCH] Wine build cleanup and XP fix

- spec file was cleaned up
- 32bit build runs on XP (downgrade of PyInstaller needed)
---
 buildscripts/winbuild.sh                 | 35 ++++++++--------
 packages/pyinstaller/bitmessagemain.spec | 53 ++++++++++++++----------
 2 files changed, 48 insertions(+), 40 deletions(-)

diff --git a/buildscripts/winbuild.sh b/buildscripts/winbuild.sh
index 4d9dbf9c..5b4fc37f 100755
--- a/buildscripts/winbuild.sh
+++ b/buildscripts/winbuild.sh
@@ -19,8 +19,6 @@ function download_sources_32 {
 		https://github.com/Bitmessage/ThirdPartyLibraries/blob/master/PyQt${PYQT_VERSION}-x32.exe?raw=true \
 		https://github.com/Bitmessage/ThirdPartyLibraries/blob/master/Win32OpenSSL-${OPENSSL_VERSION}.exe?raw=true \
 		https://github.com/Bitmessage/ThirdPartyLibraries/blob/master/pyopencl-2015.1-cp27-none-win32.whl?raw=true
-	#wget -P ${SRCPATH} -nc http://www.dll-found.com/zip/m/msvcr120.dll.zip
-	#wget -P ${SRCPATH} -nc http://www.dll-found.com/zip/m/msvcr100.dll.zip
 }
 
 function download_sources_64 {
@@ -61,24 +59,19 @@ function install_python(){
 		wine msiexec -i python-${PYTHON_VERSION}.amd64.msi /q /norestart
 		echo "Installing vcredist for 64 bit"
 		wine vcredist_x64.exe /q /norestart
-		echo "Upgrading pip"
-		wine python -m pip install --upgrade pip
 	else
 		echo "Installing Python ${PYTHON_VERSION} 32b"
 		wine msiexec -i python-${PYTHON_VERSION}.msi /q /norestart
-		echo "Installing vc_redist for 32 bit "
-		wine vcredist_x86.exe /q /norestart
-		#echo "Unpacking MSVCR120.DLL"
-		#unzip msvcr120.dll.zip -o -d $HOME/.wine32/drive_c/windows/system32/
-		#unzip msvcr100.dll.zip -o -d $HOME/.wine32/drive_c/windows/system32/
-		echo "Upgrading pip"
-		wine python -m pip install --upgrade pip
-
+		# MSVCR 2008 required for Windows XP
+		cd ${SRCPATH}
+		echo "Installing vc_redist (2008) for 32 bit "
+		wine vcredist_x86.exe /Q
 	fi
+	echo "Upgrading pip"
+	wine python -m pip install --upgrade pip
 }
 
 function install_pyqt(){
-	
 	if [ ${MACHINE_TYPE} == 'x86_64' ]; then
 		echo "Installing PyQt-${PYQT_VERSION} 64b"
 		wine PyQt${PYQT_VERSION}-x64.exe /S /WX
@@ -100,19 +93,27 @@ function install_openssl(){
 
 function install_pyinstaller()
 {
+	cd ${BASE_DIR}
 	echo "Installing PyInstaller"
-	wine python -m pip install pyinstaller
+	if [ ${MACHINE_TYPE} == 'x86_64' ]; then
+		wine python -m pip install pyinstaller
+	else
+		# 3.2.1 is the last version to work on XP
+		# see https://github.com/pyinstaller/pyinstaller/issues/2931
+		wine python -m pip install -I pyinstaller==3.2.1
+	fi
 }
 
 function install_msgpack()
 {
+	cd ${BASE_DIR}
 	echo "Installing msgpack"
 	wine python -m pip install msgpack-python
 }
 
 function install_pyopencl()
 {
-	cd $SRCPATH
+	cd ${SRCPATH}
 	echo "Installing PyOpenCL"
 	if [ ${MACHINE_TYPE} == 'x86_64' ]; then
 		wine python -m pip install pyopencl-2015.1-cp27-none-win_amd64.whl
@@ -123,7 +124,7 @@ function install_pyopencl()
 
 
 function build_dll(){
-	cd $BASE_DIR
+	cd ${BASE_DIR}
 	cd src/bitmsghash
 	if [ ${MACHINE_TYPE} == 'x86_64' ]; then
 		echo "Create dll"
@@ -137,7 +138,7 @@ function build_dll(){
 }
 
 function build_exe(){
-	cd $BASE_DIR
+	cd ${BASE_DIR}
 	cd packages/pyinstaller
 	wine pyinstaller bitmessagemain.spec
 }
diff --git a/packages/pyinstaller/bitmessagemain.spec b/packages/pyinstaller/bitmessagemain.spec
index fe86d7bd..92e52f6a 100644
--- a/packages/pyinstaller/bitmessagemain.spec
+++ b/packages/pyinstaller/bitmessagemain.spec
@@ -11,13 +11,13 @@ else:
 sslName = 'OpenSSL-Win%s' % ("32" if arch == 32 else "64")
 site_root = os.path.abspath(HOMEPATH)
 spec_root = os.path.abspath(SPECPATH)
-cdrivePath= site_root[0:3]
-srcPath = spec_root[:-20]+"src\\"
-qtPath = site_root+"\\PyQt4\\"
-openSSLPath = cdrivePath+sslName+"\\" 
-msvcrDllPath = cdrivePath+"windows\\system32\\"
-pythonDllPath = cdrivePath+"Python27\\"
-outPath = spec_root+"\\bitmessagemain"
+cdrivePath = site_root[0:3]
+srcPath = os.path.join(spec_root[:-20], "src")
+qtBase = "PyQt4"
+openSSLPath = os.path.join(cdrivePath, sslName)
+msvcrDllPath = os.path.join(cdrivePath, "windows", "system32")
+pythonDllPath = os.path.join(cdrivePath, "Python27")
+outPath = os.path.join(spec_root, "bitmessagemain")
 
 importPath = srcPath 
 sys.path.insert(0,importPath)
@@ -31,7 +31,7 @@ os.rename(os.path.join(srcPath, '__init__.py'), os.path.join(srcPath, '__init__.
 
 # -*- mode: python -*-
 a = Analysis(
-             [srcPath + 'bitmessagemain.py'],
+             [os.path.join(srcPath, 'bitmessagemain.py')],
              pathex=[outPath],
              hiddenimports=['bitmessageqt.languagebox', 'pyopencl','numpy', 'win32com' , 'setuptools.msvc' ,'_cffi_backend'],
              hookspath=None,
@@ -43,23 +43,32 @@ os.rename(os.path.join(srcPath, '__init__.py.backup'), os.path.join(srcPath, '__
 def addTranslations():
     import os
     extraDatas = []
-    for file in os.listdir(srcPath + 'translations'):
-        if file[-3:] != ".qm":
+    for file_ in os.listdir(os.path.join(srcPath, 'translations')):
+        if file_[-3:] != ".qm":
             continue
-        extraDatas.append((os.path.join('translations', file), os.path.join(srcPath, 'translations', file), 'DATA'))
-    for file in os.listdir(qtPath + 'translations'):
-        if file[0:3] != "qt_" or file[5:8] != ".qm":
+        extraDatas.append((os.path.join('translations', file_),
+            os.path.join(srcPath, 'translations', file_), 'DATA'))
+    for libdir in sys.path:
+        qtdir = os.path.join(libdir, qtBase, 'translations')
+        if os.path.isdir(qtdir):
+            break
+    if not os.path.isdir(qtdir):
+        return extraDatas
+    for file_ in os.listdir(qtdir):
+        if file_[0:3] != "qt_" or file_[5:8] != ".qm":
             continue
-        extraDatas.append((os.path.join('translations', file), os.path.join(qtPath, 'translations', file), 'DATA'))
+        extraDatas.append((os.path.join('translations', file_),
+            os.path.join(qtdir, file_), 'DATA'))
     return extraDatas
 
 def addUIs():
     import os
     extraDatas = []
-    for file in os.listdir(srcPath + 'bitmessageqt'):
-        if file[-3:] != ".ui":
+    for file_ in os.listdir(os.path.join(srcPath, 'bitmessageqt')):
+        if file_[-3:] != ".ui":
             continue
-        extraDatas.append((os.path.join('ui', file), os.path.join(srcPath, 'bitmessageqt', file), 'DATA'))
+        extraDatas.append((os.path.join('ui', file_), os.path.join(srcPath,
+            'bitmessageqt', file_), 'DATA'))
     return extraDatas
 
 # append the translations directory
@@ -67,10 +76,8 @@ a.datas += addTranslations()
 a.datas += addUIs()
 
 
-
-a.binaries += [('libeay32.dll', openSSLPath + 'libeay32.dll', 'BINARY'),
-         ('python27.dll', pythonDllPath + 'python27.dll', 'BINARY'),
-         ('msvcr120.dll', msvcrDllPath + 'msvcr120.dll','BINARY'),
+a.binaries += [('libeay32.dll', os.path.join(openSSLPath, 'libeay32.dll'), 'BINARY'),
+         ('python27.dll', os.path.join(pythonDllPath, 'python27.dll'), 'BINARY'),
          (os.path.join('bitmsghash', 'bitmsghash%i.dll' % (arch)), os.path.join(srcPath, 'bitmsghash', 'bitmsghash%i.dll' % (arch)), 'BINARY'),
          (os.path.join('bitmsghash', 'bitmsghash.cl'), os.path.join(srcPath, 'bitmsghash', 'bitmsghash.cl'), 'BINARY'),
          (os.path.join('sslkeys', 'cert.pem'), os.path.join(srcPath, 'sslkeys', 'cert.pem'), 'BINARY'),
@@ -93,7 +100,7 @@ exe = EXE(pyz,
           name=fname,
           debug=False,
           strip=None,
-          upx=True,
+          upx=False,
           console=False, icon= os.path.join(srcPath, 'images', 'can-icon.ico'))
 
 coll = COLLECT(exe,
@@ -101,6 +108,6 @@ coll = COLLECT(exe,
                a.zipfiles,
                a.datas,
                strip=False,
-               upx=True,
+               upx=False,
                name='main')