|  | @@ -1,120 +1,120 @@
 | 
	
		
			
				|  |  | -import shutil
 | 
	
		
			
				|  |  | -import os
 | 
	
		
			
				|  |  | -import subprocess
 | 
	
		
			
				|  |  | -from modulefinder import ModuleFinder
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -# Creates standalone Windows executable
 | 
	
		
			
				|  |  | -# First build by following instructions from installation.rst
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -builddir = 'win32exe'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -if os.path.exists(builddir):
 | 
	
		
			
				|  |  | -    shutil.rmtree(builddir)
 | 
	
		
			
				|  |  | -os.mkdir(builddir)
 | 
	
		
			
				|  |  | -os.mkdir(builddir + '/bin')
 | 
	
		
			
				|  |  | -os.mkdir(builddir + '/lib')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -print('Compiling wrapper')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -gccpath = ''  # check for compiler, path needed later
 | 
	
		
			
				|  |  | -for p in os.environ['PATH'].split(';'):
 | 
	
		
			
				|  |  | -    if os.path.exists(os.path.join(p, 'gcc.exe')):
 | 
	
		
			
				|  |  | -        gccpath = p
 | 
	
		
			
				|  |  | -        break
 | 
	
		
			
				|  |  | -if gccpath == '':
 | 
	
		
			
				|  |  | -    print('gcc not found.')
 | 
	
		
			
				|  |  | -    exit(1)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -source = open('wrapper.c', 'w')
 | 
	
		
			
				|  |  | -source.write(
 | 
	
		
			
				|  |  | -"""
 | 
	
		
			
				|  |  | -#include <python3.5m/python.h>
 | 
	
		
			
				|  |  | -#include <windows.h>
 | 
	
		
			
				|  |  | -#include <wchar.h>
 | 
	
		
			
				|  |  | -#include "Shlwapi.h"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -int wmain(int argc , wchar_t *argv[] )
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    wchar_t *program = argv[0];
 | 
	
		
			
				|  |  | -    Py_SetProgramName(program);
 | 
	
		
			
				|  |  | -    Py_Initialize();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    PySys_SetArgv(argc, argv);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    wchar_t path[MAX_PATH];
 | 
	
		
			
				|  |  | -    GetModuleFileNameW(NULL, path, MAX_PATH);
 | 
	
		
			
				|  |  | -    PathRemoveFileSpecW(path);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    FILE* file_1 = _wfopen(wcsncat(path, L"/borg/__main__.py", 17), L"r");
 | 
	
		
			
				|  |  | -    PyRun_AnyFile(file_1, "borg/__main__.py");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Py_Finalize();
 | 
	
		
			
				|  |  | -    PyMem_RawFree(program);
 | 
	
		
			
				|  |  | -    return 0;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -""")
 | 
	
		
			
				|  |  | -source.close()
 | 
	
		
			
				|  |  | -subprocess.run('gcc wrapper.c -lpython3.5m -lshlwapi -municode -o ' + builddir + '/bin/borg.exe')
 | 
	
		
			
				|  |  | -os.remove('wrapper.c')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -print('Searching modules')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -modulepath = os.path.abspath(os.path.join(gccpath, '../lib/python3.5/'))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -shutil.copytree(os.path.join(modulepath, 'encodings'), os.path.join(builddir, 'lib/python3.5/encodings'))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -finder = ModuleFinder()
 | 
	
		
			
				|  |  | -finder.run_script('borg/__main__.py')
 | 
	
		
			
				|  |  | -extramodules = [os.path.join(modulepath, 'site.py')]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -for module in extramodules:
 | 
	
		
			
				|  |  | -    finder.run_script(module)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -print('Copying files')
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def finddlls(exe):
 | 
	
		
			
				|  |  | -    re = []
 | 
	
		
			
				|  |  | -    output = subprocess.check_output(['ntldd', '-R', exe])
 | 
	
		
			
				|  |  | -    for line in output.decode('utf-8').split('\n'):
 | 
	
		
			
				|  |  | -        if 'not found' in line:
 | 
	
		
			
				|  |  | -            continue
 | 
	
		
			
				|  |  | -        if 'windows' in line.lower():
 | 
	
		
			
				|  |  | -            continue
 | 
	
		
			
				|  |  | -        words = line.split()
 | 
	
		
			
				|  |  | -        if len(words) < 3:
 | 
	
		
			
				|  |  | -            if len(words) == 2:
 | 
	
		
			
				|  |  | -                re.append(words[0])
 | 
	
		
			
				|  |  | -            continue
 | 
	
		
			
				|  |  | -        dll = words[2]
 | 
	
		
			
				|  |  | -        re.append(dll)
 | 
	
		
			
				|  |  | -    return re
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -items = finder.modules.items()
 | 
	
		
			
				|  |  | -for name, mod in items:
 | 
	
		
			
				|  |  | -    file = mod.__file__
 | 
	
		
			
				|  |  | -    if file is None:
 | 
	
		
			
				|  |  | -        continue
 | 
	
		
			
				|  |  | -    lib = file.find('lib')
 | 
	
		
			
				|  |  | -    if lib == -1:
 | 
	
		
			
				|  |  | -        relpath = os.path.relpath(file)
 | 
	
		
			
				|  |  | -        os.makedirs(os.path.join(builddir, 'bin', os.path.split(relpath)[0]), exist_ok=True)
 | 
	
		
			
				|  |  | -        shutil.copyfile(file, os.path.join(builddir, 'bin', relpath))
 | 
	
		
			
				|  |  | -        continue
 | 
	
		
			
				|  |  | -    relativepath = file[file.find('lib')+4:]
 | 
	
		
			
				|  |  | -    os.makedirs(os.path.join(builddir, 'lib', os.path.split(relativepath)[0]), exist_ok=True)
 | 
	
		
			
				|  |  | -    shutil.copyfile(file, os.path.join(builddir, 'lib', relativepath))
 | 
	
		
			
				|  |  | -    if file[-4:] == '.dll' or file[-4:] == '.DLL':
 | 
	
		
			
				|  |  | -        for dll in finddlls(file):
 | 
	
		
			
				|  |  | -            if builddir not in dll:
 | 
	
		
			
				|  |  | -                shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 | 
	
		
			
				|  |  | -for dll in finddlls(os.path.join(builddir, "bin/borg.exe")):
 | 
	
		
			
				|  |  | -    if builddir not in dll:
 | 
	
		
			
				|  |  | -        shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 | 
	
		
			
				|  |  | -shutil.copyfile('borg/__main__.py', os.path.join(builddir, 'bin/borg/__main__.py'))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -for extmodule in ['borg/chunker-cpython-35m.dll', 'borg/compress-cpython-35m.dll', 'borg/crypto-cpython-35m.dll', 'borg/hashindex-cpython-35m.dll']:
 | 
	
		
			
				|  |  | -    for dll in finddlls(extmodule):
 | 
	
		
			
				|  |  | -        if builddir not in dll:
 | 
	
		
			
				|  |  | -            shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 | 
	
		
			
				|  |  | +import shutil
 | 
	
		
			
				|  |  | +import os
 | 
	
		
			
				|  |  | +import subprocess
 | 
	
		
			
				|  |  | +from modulefinder import ModuleFinder
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +# Creates standalone Windows executable
 | 
	
		
			
				|  |  | +# First build by following instructions from installation.rst
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +builddir = 'win32exe'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +if os.path.exists(builddir):
 | 
	
		
			
				|  |  | +    shutil.rmtree(builddir)
 | 
	
		
			
				|  |  | +os.mkdir(builddir)
 | 
	
		
			
				|  |  | +os.mkdir(builddir + '/bin')
 | 
	
		
			
				|  |  | +os.mkdir(builddir + '/lib')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +print('Compiling wrapper')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +gccpath = ''  # check for compiler, path needed later
 | 
	
		
			
				|  |  | +for p in os.environ['PATH'].split(';'):
 | 
	
		
			
				|  |  | +    if os.path.exists(os.path.join(p, 'gcc.exe')):
 | 
	
		
			
				|  |  | +        gccpath = p
 | 
	
		
			
				|  |  | +        break
 | 
	
		
			
				|  |  | +if gccpath == '':
 | 
	
		
			
				|  |  | +    print('gcc not found.')
 | 
	
		
			
				|  |  | +    exit(1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +source = open('wrapper.c', 'w')
 | 
	
		
			
				|  |  | +source.write(
 | 
	
		
			
				|  |  | +"""
 | 
	
		
			
				|  |  | +#include <python3.5m/python.h>
 | 
	
		
			
				|  |  | +#include <windows.h>
 | 
	
		
			
				|  |  | +#include <wchar.h>
 | 
	
		
			
				|  |  | +#include "Shlwapi.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int wmain(int argc , wchar_t *argv[] )
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    wchar_t *program = argv[0];
 | 
	
		
			
				|  |  | +    Py_SetProgramName(program);
 | 
	
		
			
				|  |  | +    Py_Initialize();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    PySys_SetArgv(argc, argv);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    wchar_t path[MAX_PATH];
 | 
	
		
			
				|  |  | +    GetModuleFileNameW(NULL, path, MAX_PATH);
 | 
	
		
			
				|  |  | +    PathRemoveFileSpecW(path);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    FILE* file_1 = _wfopen(wcsncat(path, L"/borg/__main__.py", 17), L"r");
 | 
	
		
			
				|  |  | +    PyRun_AnyFile(file_1, "borg/__main__.py");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Py_Finalize();
 | 
	
		
			
				|  |  | +    PyMem_RawFree(program);
 | 
	
		
			
				|  |  | +    return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +""")
 | 
	
		
			
				|  |  | +source.close()
 | 
	
		
			
				|  |  | +subprocess.run('gcc wrapper.c -lpython3.5m -lshlwapi -municode -o ' + builddir + '/bin/borg.exe')
 | 
	
		
			
				|  |  | +os.remove('wrapper.c')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +print('Searching modules')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +modulepath = os.path.abspath(os.path.join(gccpath, '../lib/python3.5/'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +shutil.copytree(os.path.join(modulepath, 'encodings'), os.path.join(builddir, 'lib/python3.5/encodings'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +finder = ModuleFinder()
 | 
	
		
			
				|  |  | +finder.run_script('borg/__main__.py')
 | 
	
		
			
				|  |  | +extramodules = [os.path.join(modulepath, 'site.py')]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +for module in extramodules:
 | 
	
		
			
				|  |  | +    finder.run_script(module)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +print('Copying files')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def finddlls(exe):
 | 
	
		
			
				|  |  | +    re = []
 | 
	
		
			
				|  |  | +    output = subprocess.check_output(['ntldd', '-R', exe])
 | 
	
		
			
				|  |  | +    for line in output.decode('utf-8').split('\n'):
 | 
	
		
			
				|  |  | +        if 'not found' in line:
 | 
	
		
			
				|  |  | +            continue
 | 
	
		
			
				|  |  | +        if 'windows' in line.lower():
 | 
	
		
			
				|  |  | +            continue
 | 
	
		
			
				|  |  | +        words = line.split()
 | 
	
		
			
				|  |  | +        if len(words) < 3:
 | 
	
		
			
				|  |  | +            if len(words) == 2:
 | 
	
		
			
				|  |  | +                re.append(words[0])
 | 
	
		
			
				|  |  | +            continue
 | 
	
		
			
				|  |  | +        dll = words[2]
 | 
	
		
			
				|  |  | +        re.append(dll)
 | 
	
		
			
				|  |  | +    return re
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +items = finder.modules.items()
 | 
	
		
			
				|  |  | +for name, mod in items:
 | 
	
		
			
				|  |  | +    file = mod.__file__
 | 
	
		
			
				|  |  | +    if file is None:
 | 
	
		
			
				|  |  | +        continue
 | 
	
		
			
				|  |  | +    lib = file.find('lib')
 | 
	
		
			
				|  |  | +    if lib == -1:
 | 
	
		
			
				|  |  | +        relpath = os.path.relpath(file)
 | 
	
		
			
				|  |  | +        os.makedirs(os.path.join(builddir, 'bin', os.path.split(relpath)[0]), exist_ok=True)
 | 
	
		
			
				|  |  | +        shutil.copyfile(file, os.path.join(builddir, 'bin', relpath))
 | 
	
		
			
				|  |  | +        continue
 | 
	
		
			
				|  |  | +    relativepath = file[file.find('lib')+4:]
 | 
	
		
			
				|  |  | +    os.makedirs(os.path.join(builddir, 'lib', os.path.split(relativepath)[0]), exist_ok=True)
 | 
	
		
			
				|  |  | +    shutil.copyfile(file, os.path.join(builddir, 'lib', relativepath))
 | 
	
		
			
				|  |  | +    if file[-4:] == '.dll' or file[-4:] == '.DLL':
 | 
	
		
			
				|  |  | +        for dll in finddlls(file):
 | 
	
		
			
				|  |  | +            if builddir not in dll:
 | 
	
		
			
				|  |  | +                shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 | 
	
		
			
				|  |  | +for dll in finddlls(os.path.join(builddir, "bin/borg.exe")):
 | 
	
		
			
				|  |  | +    if builddir not in dll:
 | 
	
		
			
				|  |  | +        shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 | 
	
		
			
				|  |  | +shutil.copyfile('borg/__main__.py', os.path.join(builddir, 'bin/borg/__main__.py'))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +for extmodule in ['borg/chunker-cpython-35m.dll', 'borg/compress-cpython-35m.dll', 'borg/crypto-cpython-35m.dll', 'borg/hashindex-cpython-35m.dll']:
 | 
	
		
			
				|  |  | +    for dll in finddlls(extmodule):
 | 
	
		
			
				|  |  | +        if builddir not in dll:
 | 
	
		
			
				|  |  | +            shutil.copyfile(dll, os.path.join(builddir, 'bin', os.path.split(dll)[1]))
 |