From a97ba835bc5800cbd361014c446400d86b9a3f36 Mon Sep 17 00:00:00 2001 From: Adib Taraben Date: Mon, 23 Jun 2014 00:34:55 +0200 Subject: win32 wix install creator: use version and architecture info from src/inkscape.rc and inkscape/inkscape.exe, create inkscape-#version#-x64.msi on 64bit target (bzr r13437) --- packaging/wix/files.py | 7 +++--- packaging/wix/inkscape.wxs | 32 ++++++++++++------------ packaging/wix/version.py | 61 ++++++++++++++++++++++++++++++++++++++++------ packaging/wix/wixenv.bat | 4 +-- 4 files changed, 76 insertions(+), 28 deletions(-) diff --git a/packaging/wix/files.py b/packaging/wix/files.py index 93a7c8dd1..ada4d62f2 100644 --- a/packaging/wix/files.py +++ b/packaging/wix/files.py @@ -27,7 +27,7 @@ def directory(root, breadcrumb, level, exclude=[]): file_key = os.path.join(root, file) _id = '_%06d' % (len(file_ids.keys()) + 1) file_ids[file_key] = 'component' + _id - wxs.write(indent(level)+ "\n") + wxs.write(indent(level)+ "\n") if file == 'inkscape.exe': # we refenrence inkscape.exe in inkscape.wxs _id = '_inkscape_exe' @@ -62,10 +62,11 @@ def ComponentGroup(name, condition, level): with open('files.wxs', 'w') as wxs: wxs.write("\n") wxs.write("\n") + wxs.write(indent(1) + "\n") wxs.write(indent(1) + "\n") wxs.write(indent(2) + "\n") wxs.write(indent(2) + "\n") - wxs.write(indent(3) + "\n") + wxs.write(indent(3) + "\n") wxs.write(indent(4) + "\n") print "start parsing ..\..\inkscape" directory('..\..\inkscape', 'inkscape', 5, ['inkscape.dbg', 'inkview.dbg', 'gdb.exe']) @@ -74,7 +75,7 @@ with open('files.wxs', 'w') as wxs: wxs.write(indent(3) + "\n") # link to ProgrmMenu wxs.write(indent(3) + "\n") - wxs.write(indent(4) + "\n") + wxs.write(indent(4) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(2) + "\n") diff --git a/packaging/wix/inkscape.wxs b/packaging/wix/inkscape.wxs index dfe61defd..3b4152a5f 100644 --- a/packaging/wix/inkscape.wxs +++ b/packaging/wix/inkscape.wxs @@ -1,10 +1,10 @@ - - - + + + @@ -12,7 +12,7 @@ - + - - + + - + - + @@ -44,15 +44,15 @@ - + - + - - + - + - + - + @@ -89,7 +89,7 @@ - diff --git a/packaging/wix/version.py b/packaging/wix/version.py index 46968c90c..dc5e06de9 100644 --- a/packaging/wix/version.py +++ b/packaging/wix/version.py @@ -1,20 +1,59 @@ #!/usr/bin/python import os +import struct version = '' +versionstr = '' +architecture = '' + +def is64bitArchitecture(filename): + ''' test if a executable is of x64 format @see http://stackoverflow.com/questions/1001404/check-if-unmanaged-dll-is-32-bit-or-64-bit/1002672#1002672 + @see http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx + //offset to PE header is always at 0x3C + //PE header starts with "PE\0\0" = 0x50 0x45 0x00 0x00 + //followed by 2-byte machine type field (see document above for enum) + ''' + with open(filename, 'rb') as cofffile: + cofffile.seek(0x3c) + peOffset = struct.unpack('H', cofffile.read(2))[0] + cofffile.seek(peOffset) + peHead = struct.unpack('I', cofffile.read(4))[0] + if peHead != 0x00004550: # "PE\0\0", little-endian + # throw new Exception("Can't find PE header") + pass + machineType = struct.unpack('H', cofffile.read(2))[0] + if machineType in (0x8664, 0x200): + return True + return False + +if is64bitArchitecture('..\..\inkscape\inkscape.exe'): + architecture = '-x64' +else: + architecture = '' # retrieve the version information from the inkscape.rc file # VALUE "ProductVersion", "0.48+devel" with open('..\..\src\inkscape.rc', 'r') as rc: + isversioninfo = False + for line in rc.readlines(): if 'productversion' in line.lower() and 'value' in line.lower(): items = line.split() - version = items[2] - version = version.replace('"', '') - version = version.replace("'", "") + versionstr = items[2] + versionstr = versionstr.replace('"', '') + versionstr = versionstr.replace("'", "") # version = version.replace("+", "_") - print version + print versionstr + architecture + if 'versioninfo' in line.lower(): + isversioninfo = True + if 'begin' in line.lower(): + isversioninfo = False + if isversioninfo and 'productversion' in line.lower(): + items = line.split() + ''' the second element contains now version info in the form major,minor,fix,build''' + veritems = items[1].split(',') + version = veritems[0] + '.' + veritems[1] with open('version.wxi', 'w') as wxi: @@ -22,8 +61,16 @@ with open('version.wxi', 'w') as wxi: wxi.write("\n") wxi.write("\n") wxi.write("\n") - wxi.write("\n") + wxi.write("\n") + if 'x64' in architecture: + wxi.write("\n") + wxi.write("\n") + wxi.write("\n") + wxi.write("\n") + else: + wxi.write("\n") + wxi.write("\n") + wxi.write("\n") + wxi.write("\n") wxi.write("\n") - - diff --git a/packaging/wix/wixenv.bat b/packaging/wix/wixenv.bat index 5f1f7e90c..c798a9ce1 100644 --- a/packaging/wix/wixenv.bat +++ b/packaging/wix/wixenv.bat @@ -5,12 +5,12 @@ ver | findstr /i "6\.1\." > nul IF %ERRORLEVEL% EQU 0 goto win7 @rem all other cases -IF "%WIX_PATH%"=="" set WIX_PATH=C:\Programme\WiX Toolset v3.7\bin +IF "%WIX_PATH%"=="" set WIX_PATH=C:\Programme\WiX Toolset v3.8\bin IF "%DEVLIBS_PATH%"=="" set DEVLIBS_PATH=c:\devlibs goto setpath :win7 -IF "%WIX_PATH%"=="" set WIX_PATH=C:\Program Files (x86)\WiX Toolset v3.7\bin +IF "%WIX_PATH%"=="" set WIX_PATH=C:\Program Files (x86)\WiX Toolset v3.8\bin IF "%DEVLIBS_PATH%"=="" set DEVLIBS_PATH=c:\devlibs :setpath -- cgit v1.2.3