QGIS/ms-windows/mxe/deploy.py

129 lines
3.3 KiB
Python
Raw Normal View History

2018-02-08 13:37:38 +01:00
#! /usr/bin/env python3
"""pyWindeployqt
This is a wrapper for mingw32 objdump replacing windeployqt which is missing from MXE
I don't know why they disabled it, but here it is.
Example:
./deploy.py --build=~/ClionProjects/project/build/ \
--objdump=/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump \
~/ClionProjects/project/build/project.exe;
"""
__author__ = 'Alexey Elymanov (strangeqargo@gmail.com)'
import subprocess
import os
import sys
import re
import os.path
import argparse
parser = argparse.ArgumentParser()
2018-02-08 18:28:40 +01:00
parser.add_argument(
"--build", help="where to place libraries, optional, files will go to target location by default")
parser.add_argument(
"--objdump", help="objdump executable (/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump)")
parser.add_argument(
"--libs", help="where to search for libraries (optional) infers from objdump")
2018-02-08 13:37:38 +01:00
parser.add_argument("target")
args = parser.parse_args()
if len(sys.argv) == 1 or not (args.libs or args.objdump):
parser.print_help()
sys.exit(1)
target = os.path.expanduser(args.target)
objdump_path = os.path.expanduser(args.objdump)
if not args.build:
build_path = os.path.expanduser(os.path.dirname(args.target)) + "/"
else:
build_path = os.path.expanduser(args.build)
libs = args.libs
if not args.libs:
2018-02-08 18:28:40 +01:00
libs = objdump_path.replace('/bin', '').replace('-objdump', '')
2018-02-08 13:37:38 +01:00
# build_path = "/home/user/ClionProjects/project/build/"
# libs = "/home/user/mxe/usr/i686-w64-mingw32.shared"
# objdump_path = "/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump"
# target = "project.exe"
def run_check():
return subprocess.getoutput("wine project.exe")
def find_dll(dll):
2018-02-08 18:28:40 +01:00
out = subprocess.getoutput("find " + libs + " | grep -i '" + dll + "$'")
2018-02-08 13:37:38 +01:00
return out.strip('\n')
def library_install_exe(out=''):
out = run_check().splitlines()
for line in out:
# err = re.search('(err:module:import_dll (Library |Loading library)) (.*?\.dll) ', line)
err = re.search('([^ ]+\.dll) \(which', line)
if err is not None:
dll = err.group(1)
dll = find_dll(dll)
if dll is not None:
copy_command = "cp " + dll + " " + build_path
print("copy: ", copy_command)
subprocess.getoutput(copy_command)
library_install_exe(out)
def library_install_objdump(path, level):
if path in skip_libs or path in done:
return
if level > 0:
lib = find_dll(path)
if lib == "": # not found
skip_libs.append(path)
print("Not found: " + path)
return
print(lib)
subprocess.getoutput("cp " + lib + " " + build_path)
else:
print("Processing target " + path)
lib = path
done.append(path)
command = objdump_path + " -p " + lib + " | grep -o ': .*\.dll$'"
res = subprocess.getstatusoutput(command)
if (res[0] > 0):
print("Error: objdump failed with " + lib)
else:
dlls = subprocess.getoutput(command).split("\n")
for line in dlls:
dll = (line.split(": "))[1]
if dll not in done and dll not in skip_libs:
level += 1
library_install_objdump(dll, level)
2018-02-08 18:28:40 +01:00
2018-02-08 13:37:38 +01:00
skip_libs = list()
done = list()
def main():
os.chdir(build_path)
2018-02-08 18:28:40 +01:00
# library_install_exe(target)
2018-02-08 13:37:38 +01:00
library_install_objdump(target, 0)
pass
2018-02-08 18:28:40 +01:00
2018-02-08 13:37:38 +01:00
main()