mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
Add proper manifests to all calibre executables
Marked as compatible with all versions of windows upto 10
This commit is contained in:
parent
ef7c1a3c69
commit
f8560f79fc
@ -6,7 +6,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time, textwrap, errno, stat
|
import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time, errno, stat
|
||||||
|
|
||||||
from setup import (Command, modules, functions, basenames, __version__,
|
from setup import (Command, modules, functions, basenames, __version__,
|
||||||
__appname__)
|
__appname__)
|
||||||
@ -42,6 +42,37 @@ DESCRIPTIONS = {
|
|||||||
'calibre-file-dialog' : 'Helper program to show file open/save dialogs',
|
'calibre-file-dialog' : 'Helper program to show file open/save dialogs',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241(v=vs.85).aspx
|
||||||
|
SUPPORTED_OS = {
|
||||||
|
'vista': '{e2011457-1546-43c5-a5fe-008deee3d3f0}',
|
||||||
|
'w7' : '{35138b9a-5d96-4fbd-8e2d-a2440225f93a}',
|
||||||
|
'w8' : '{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}',
|
||||||
|
'w81' : '{1f676c76-80e1-4239-95bb-83d0f6d0da78}',
|
||||||
|
'w10' : '{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}',
|
||||||
|
}
|
||||||
|
|
||||||
|
EXE_MANIFEST = '''\
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges>
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<supportedOS Id="{vista}"/>
|
||||||
|
<supportedOS Id="{w7}"/>
|
||||||
|
<supportedOS Id="{w8}"/>
|
||||||
|
<supportedOS Id="{w81}"/>
|
||||||
|
<supportedOS Id="{w10}"/>
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
||||||
|
'''.format(**SUPPORTED_OS)
|
||||||
|
|
||||||
def walk(dir):
|
def walk(dir):
|
||||||
''' A nice interface to os.walk '''
|
''' A nice interface to os.walk '''
|
||||||
for record in os.walk(dir):
|
for record in os.walk(dir):
|
||||||
@ -419,10 +450,13 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
exe = self.j('dist', 'calibre-portable-installer-%s.exe'%VERSION)
|
exe = self.j('dist', 'calibre-portable-installer-%s.exe'%VERSION)
|
||||||
if self.newer(exe, [obj, xobj]):
|
if self.newer(exe, [obj, xobj]):
|
||||||
self.info('Linking', exe)
|
self.info('Linking', exe)
|
||||||
|
manifest = exe + '.manifest'
|
||||||
|
with open(manifest, 'wb') as f:
|
||||||
|
f.write(EXE_MANIFEST)
|
||||||
cmd = [msvc.linker] + ['/INCREMENTAL:NO', '/MACHINE:'+machine,
|
cmd = [msvc.linker] + ['/INCREMENTAL:NO', '/MACHINE:'+machine,
|
||||||
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:WINDOWS',
|
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:WINDOWS',
|
||||||
'/LIBPATH:'+(LZMA+r'\lib'),
|
'/LIBPATH:'+(LZMA+r'\lib'),
|
||||||
'/RELEASE', '/MANIFEST', '/MANIFESTUAC:level="asInvoker" uiAccess="false"',
|
'/RELEASE', '/MANIFEST:EMBED', '/MANIFESTINPUT:' + manifest,
|
||||||
'/ENTRY:wWinMainCRTStartup',
|
'/ENTRY:wWinMainCRTStartup',
|
||||||
'/OUT:'+exe, self.embed_resources(exe,
|
'/OUT:'+exe, self.embed_resources(exe,
|
||||||
desc='Calibre Portable Installer', extra_data=zf,
|
desc='Calibre Portable Installer', extra_data=zf,
|
||||||
@ -430,31 +464,6 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
xobj, obj, 'User32.lib', 'Shell32.lib', 'easylzma_s.lib',
|
xobj, obj, 'User32.lib', 'Shell32.lib', 'easylzma_s.lib',
|
||||||
'Ole32.lib', 'Shlwapi.lib', 'Kernel32.lib', 'Psapi.lib']
|
'Ole32.lib', 'Shlwapi.lib', 'Kernel32.lib', 'Psapi.lib']
|
||||||
self.run_builder(cmd)
|
self.run_builder(cmd)
|
||||||
manifest = exe + '.manifest'
|
|
||||||
with open(manifest, 'r+b') as f:
|
|
||||||
raw = f.read()
|
|
||||||
f.seek(0)
|
|
||||||
f.truncate()
|
|
||||||
# TODO: Add the windows 8 GUID to the compatibility section
|
|
||||||
# after windows 8 is released, see:
|
|
||||||
# http://msdn.microsoft.com/en-us/library/windows/desktop/hh848036(v=vs.85).aspx
|
|
||||||
raw = raw.replace(b'</assembly>', textwrap.dedent(
|
|
||||||
b'''\
|
|
||||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
|
||||||
<application>
|
|
||||||
<!--The ID below indicates app support for Windows Vista -->
|
|
||||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
|
||||||
<!--The ID below indicates app support for Windows 7 -->
|
|
||||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
|
||||||
</application>
|
|
||||||
</compatibility>
|
|
||||||
</assembly>
|
|
||||||
'''))
|
|
||||||
f.write(raw)
|
|
||||||
|
|
||||||
self.run_builder([MT, '-manifest', manifest,
|
|
||||||
'-outputresource:%s;1'%exe])
|
|
||||||
os.remove(manifest)
|
|
||||||
|
|
||||||
os.remove(zf)
|
os.remove(zf)
|
||||||
|
|
||||||
@ -550,8 +559,11 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
cmd = [msvc.cc] + cflags + ['/Fo'+obj, ftype + src]
|
cmd = [msvc.cc] + cflags + ['/Fo'+obj, ftype + src]
|
||||||
self.run_builder(cmd, show_output=True)
|
self.run_builder(cmd, show_output=True)
|
||||||
exe = self.j(self.dll_dir, name)
|
exe = self.j(self.dll_dir, name)
|
||||||
|
mf = exe + '.manifest'
|
||||||
|
with open(mf, 'wb') as f:
|
||||||
|
f.write(EXE_MANIFEST)
|
||||||
cmd = [msvc.linker] + ['/MACHINE:'+machine,
|
cmd = [msvc.linker] + ['/MACHINE:'+machine,
|
||||||
'/SUBSYSTEM:'+subsys, '/RELEASE',
|
'/SUBSYSTEM:'+subsys, '/RELEASE', '/MANIFEST:EMBED', '/MANIFESTINPUT:'+mf,
|
||||||
'/OUT:'+exe] + [self.embed_resources(exe), obj] + libs
|
'/OUT:'+exe] + [self.embed_resources(exe), obj] + libs
|
||||||
self.run_builder(cmd)
|
self.run_builder(cmd)
|
||||||
base = self.j(self.src_root, 'setup', 'installer', 'windows')
|
base = self.j(self.src_root, 'setup', 'installer', 'windows')
|
||||||
@ -610,9 +622,13 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
u32 = ['user32.lib']
|
u32 = ['user32.lib']
|
||||||
if self.newer(exe, [dest, lib, self.rc_template, __file__]):
|
if self.newer(exe, [dest, lib, self.rc_template, __file__]):
|
||||||
self.info('Linking', bname)
|
self.info('Linking', bname)
|
||||||
|
mf = dest + '.manifest'
|
||||||
|
with open(mf, 'wb') as f:
|
||||||
|
f.write(EXE_MANIFEST)
|
||||||
cmd = [msvc.linker] + ['/MACHINE:'+machine, '/LTCG',
|
cmd = [msvc.linker] + ['/MACHINE:'+machine, '/LTCG',
|
||||||
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:'+subsys,
|
'/LIBPATH:'+self.obj_dir, '/SUBSYSTEM:'+subsys,
|
||||||
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
|
'/LIBPATH:%s/libs'%self.python_base, '/RELEASE',
|
||||||
|
'/MANIFEST:EMBED', '/MANIFESTINPUT:' + mf,
|
||||||
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
|
'/OUT:'+exe] + u32 + dlflags + [self.embed_resources(exe),
|
||||||
dest, lib]
|
dest, lib]
|
||||||
self.run_builder(cmd)
|
self.run_builder(cmd)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user