Windows compatibility fixes

- spec file for pyinstaller detects architecture (32 or 64bit)
- spec file uses os.path.join
- spec file creates and adds the list of messagetypes
- added MinGW/MSyS support in Makefile
- separate Makefile.msvc for MCVC
- bitmsghash.cpp minor adjustments to build also on MSVC/MinGW
- if frozen mode, messagetypes loads the list of files from a text file
  generated during archive building rather than from a directory
This commit is contained in:
Peter Šurda 2017-02-19 14:48:53 +01:00
parent a95f4aa255
commit 67c8966a21
Signed by: PeterSurda
GPG Key ID: 0C5F50C0B5F37D87
5 changed files with 63 additions and 15 deletions

View File

@ -1,15 +1,30 @@
import ctypes
import os
srcPath = "C:\\src\\PyBitmessage\\src\\" srcPath = "C:\\src\\PyBitmessage\\src\\"
qtPath = "C:\\Qt\\4.8.6\\" qtPath = "C:\\Qt-4.8.7\\"
openSSLPath = "C:\\OpenSSL-1.0.2e\\" openSSLPath = "C:\\OpenSSL-1.0.2j\\"
outPath = "C:\\src\\PyInstaller\\bitmessagemain" outPath = "C:\\src\\PyInstaller-3.2.1\\bitmessagemain"
# -*- mode: python -*- # -*- mode: python -*-
a = Analysis([srcPath + 'bitmessagemain.py'], a = Analysis([srcPath + 'bitmessagemain.py'],
pathex=[outPath], pathex=[outPath],
hiddenimports=[], hiddenimports=['messagetypes'],
hookspath=None, hookspath=None,
runtime_hooks=None) runtime_hooks=None)
# manually add messagetypes directory and its listing
with open(os.path.join(srcPath, 'messagetypes.txt'), 'wt') as f:
for mt in os.listdir(os.path.join(srcPath, 'messagetypes')):
if mt == "__init__.py":
continue
splitted = os.path.splitext(mt)
if splitted[1] != ".py":
continue
f.write(mt + "\n")
a.scripts.append((os.path.join('messagetypes', mt), os.path.join(srcPath, 'messagetypes', mt), 'PYMODULE'))
a.datas.append(('messagetypes.txt', os.path.join(srcPath, 'messagetypes.txt'), 'DATA'))
# fix duplicates # fix duplicates
for d in a.datas: for d in a.datas:
if 'pyconfig' in d[0]: if 'pyconfig' in d[0]:
@ -22,11 +37,11 @@ def addTranslations():
for file in os.listdir(srcPath + 'translations'): for file in os.listdir(srcPath + 'translations'):
if file[-3:] != ".qm": if file[-3:] != ".qm":
continue continue
extraDatas.append(('translations\\'+file, srcPath + 'translations\\' + file, 'DATA')) extraDatas.append((os.path.join('translations', file), os.path.join(srcPath, 'translations', file) 'DATA'))
for file in os.listdir(qtPath + 'translations'): for file in os.listdir(qtPath + 'translations'):
if file[0:3] != "qt_" or file[5:8] != ".qm": if file[0:3] != "qt_" or file[5:8] != ".qm":
continue continue
extraDatas.append(('translations\\'+file, qtPath + 'translations\\' + file, 'DATA')) extraDatas.append((os.path.join('translations', file), os.path.join(qtPath, 'translations', file), 'DATA'))
return extraDatas return extraDatas
def addUIs(): def addUIs():
@ -35,14 +50,24 @@ def addUIs():
for file in os.listdir(srcPath + 'bitmessageqt'): for file in os.listdir(srcPath + 'bitmessageqt'):
if file[-3:] != ".ui": if file[-3:] != ".ui":
continue continue
extraDatas.append(('ui\\'+file, srcPath + 'bitmessageqt\\' + file, 'DATA')) extraDatas.append((os.path.join('ui', file), os.path.join(srcPath, 'bitmessageqt', file), 'DATA'))
return extraDatas return extraDatas
# append the translations directory # append the translations directory
a.datas += addTranslations() a.datas += addTranslations()
a.datas += addUIs() a.datas += addUIs()
a.binaries.append(('msvcr120.dll', 'C:\\WINDOWS\\system32\\msvcr120.dll', 'BINARY')) if ctypes.sizeof(ctypes.c_voidp) == 4:
arch=32
else:
arch=64
a.binaries += [('libeay32.dll', openSSLPath + 'libeay32.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'),
(os.path.join('sslkeys', 'key.pem'), os.path.join(srcPath, 'sslkeys', 'key.pem'), 'BINARY')
]
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
exe = EXE(pyz, exe = EXE(pyz,
@ -50,9 +75,9 @@ exe = EXE(pyz,
a.binaries, a.binaries,
a.zipfiles, a.zipfiles,
a.datas, a.datas,
a.binaries + [('libeay32.dll', openSSLPath + 'libeay32.dll', 'BINARY'), ('bitmsghash\\bitmsghash32.dll', srcPath + 'bitmsghash\\bitmsghash32.dll', 'BINARY'), ('bitmsghash\\bitmsghash.cl', srcPath + 'bitmsghash\\bitmsghash.cl', 'BINARY'), ('sslkeys\\cert.pem', srcPath + 'sslkeys\\cert.pem', 'BINARY'), ('sslkeys\\key.pem', srcPath + 'sslkeys\\key.pem', 'BINARY')], a.binaries,
name='Bitmessage.exe', name='Bitmessage.exe',
debug=False, debug=False,
strip=None, strip=None,
upx=False, upx=False,
console=False, icon= srcPath + 'images\\can-icon.ico') console=False, icon= os.path.join(srcPath, 'images', 'can-icon.ico')

View File

@ -2,6 +2,11 @@ UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin) ifeq ($(UNAME_S),Darwin)
CCFLAGS += -I/usr/local/Cellar/openssl/1.0.2d_1/include CCFLAGS += -I/usr/local/Cellar/openssl/1.0.2d_1/include
LDFLAGS += -L/usr/local/Cellar/openssl/1.0.2d_1/lib LDFLAGS += -L/usr/local/Cellar/openssl/1.0.2d_1/lib
else ifeq ($(UNAME_S),MINGW32_NT-6.1)
CCFLAGS += -IC:\OpenSSL-1.0.2j-mingw\include -D_WIN32 -march=native
LDFLAGS += -static-libgcc -LC:\OpenSSL-1.0.2j-mingw\lib -lwsock32 -o bitmsghash32.dll -Wl,--out-implib,bitmsghash.a
else
LDFLAGS += -lpthread -o bigmsghash.so
endif endif
all: bitmsghash.so all: bitmsghash.so
@ -10,11 +15,11 @@ powtest:
./testpow.py ./testpow.py
bitmsghash.so: bitmsghash.o bitmsghash.so: bitmsghash.o
g++ bitmsghash.o -shared -fPIC -lpthread -lcrypto $(LDFLAGS) -o bitmsghash.so g++ bitmsghash.o -shared -fPIC -lcrypto $(LDFLAGS)
bitmsghash.o: bitmsghash.o:
g++ -Wall -O3 -march=native -fPIC $(CCFLAGS) -c bitmsghash.cpp g++ -Wall -O3 -march=native -fPIC $(CCFLAGS) -c bitmsghash.cpp
clean: clean:
rm -f bitmsghash.o bitmsghash.so rm -f bitmsghash.o bitmsghash.so bitmsghash*.dll

View File

@ -0,0 +1,2 @@
all:
cl /I C:\OpenSSL-1.0.2j\include /INCREMENTAL bitmsghash.cpp /MT /link /DLL /OUT:bitmsghash32.dll /LIBPATH:C:\OpenSSL-1.0.2j\lib\ libeay32.lib ws2_32.lib

View File

@ -66,7 +66,11 @@ void * threadfunc(void* param) {
successval = tmpnonce; successval = tmpnonce;
} }
} }
#ifdef _WIN32
return 0;
#else
return NULL; return NULL;
#endif
} }
void getnumthreads() void getnumthreads()
@ -104,7 +108,11 @@ void getnumthreads()
#endif #endif
for (unsigned int i = 0; i < len * 8; i++) for (unsigned int i = 0; i < len * 8; i++)
#if defined(_WIN32) #if defined(_WIN32)
#if defined(_MSC_VER)
if (dwProcessAffinity & (1i64 << i)) if (dwProcessAffinity & (1i64 << i))
#else // CYGWIN/MINGW
if (dwProcessAffinity & (1ULL << i))
#endif
#elif defined __linux__ #elif defined __linux__
if (CPU_ISSET(i, &dwProcessAffinity)) if (CPU_ISSET(i, &dwProcessAffinity))
#else #else

View File

@ -3,7 +3,7 @@ from os import path, listdir
from string import lower from string import lower
from debug import logger from debug import logger
import paths
class MsgBase(object): class MsgBase(object):
def encode(self): def encode(self):
@ -28,7 +28,15 @@ def constructObject(data):
else: else:
return returnObj return returnObj
for mod in listdir(path.dirname(__file__)): mods = []
if paths.frozen is not None:
with open(path.join(path.dirname(path.dirname(__file__)), 'messagetypes.txt'), 'rt') as f:
for m in f.readline():
mods.append(m.rstrip())
else:
mods = listdir(path.dirname(__file__))
for mod in mods:
if mod == "__init__.py": if mod == "__init__.py":
continue continue
splitted = path.splitext(mod) splitted = path.splitext(mod)