mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Windows build: No longer install CRT in the system SxS folder. Makes calibre fully relocatable.
This commit is contained in:
parent
95731c3be0
commit
b5a166753b
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
|
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
|
||||||
<String Id="AdvancedWelcomeEulaDlgDescriptionPerUser">If you are upgrading from a {app} version older than 0.6.17, please uninstall {app} first. Click Advanced to change installation settings.</String>
|
<String Id="AdvancedWelcomeEulaDlgDescriptionPerUser">Click Advanced to change installation settings.</String>
|
||||||
<String Id="ProgressTextFileCost">Computing space requirements, this may take upto five minutes...</String>
|
<String Id="ProgressTextFileCost">Computing space requirements, this may take upto five minutes...</String>
|
||||||
<String Id="ProgressTextCostInitialize">Computing space requirements, this may take upto five minutes...</String>
|
<String Id="ProgressTextCostInitialize">Computing space requirements, this may take upto five minutes...</String>
|
||||||
<String Id="ProgressTextCostFinalize">Computing space requirements, this may take upto five minutes...</String>
|
<String Id="ProgressTextCostFinalize">Computing space requirements, this may take upto five minutes...</String>
|
||||||
|
@ -8,8 +8,8 @@ __docformat__ = 'restructuredtext en'
|
|||||||
|
|
||||||
import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time
|
import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time
|
||||||
|
|
||||||
from setup import Command, modules, functions, basenames, __version__, \
|
from setup import (Command, modules, functions, basenames, __version__,
|
||||||
__appname__
|
__appname__)
|
||||||
from setup.build_environment import msvc, MT, RC
|
from setup.build_environment import msvc, MT, RC
|
||||||
from setup.installer.windows.wix import WixMixIn
|
from setup.installer.windows.wix import WixMixIn
|
||||||
|
|
||||||
@ -20,6 +20,7 @@ LIBUNRAR = 'C:\\Program Files\\UnrarDLL\\unrar.dll'
|
|||||||
SW = r'C:\cygwin\home\kovid\sw'
|
SW = r'C:\cygwin\home\kovid\sw'
|
||||||
IMAGEMAGICK = os.path.join(SW, 'build', 'ImageMagick-6.6.6',
|
IMAGEMAGICK = os.path.join(SW, 'build', 'ImageMagick-6.6.6',
|
||||||
'VisualMagick', 'bin')
|
'VisualMagick', 'bin')
|
||||||
|
CRT = r'C:\Microsoft.VC90.CRT'
|
||||||
|
|
||||||
VERSION = re.sub('[a-z]\d+', '', __version__)
|
VERSION = re.sub('[a-z]\d+', '', __version__)
|
||||||
WINVER = VERSION+'.0'
|
WINVER = VERSION+'.0'
|
||||||
@ -81,8 +82,33 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
self.embed_manifests()
|
self.embed_manifests()
|
||||||
self.install_site_py()
|
self.install_site_py()
|
||||||
self.archive_lib_dir()
|
self.archive_lib_dir()
|
||||||
|
self.remove_CRT_from_manifests()
|
||||||
self.create_installer()
|
self.create_installer()
|
||||||
|
|
||||||
|
def remove_CRT_from_manifests(self):
|
||||||
|
'''
|
||||||
|
The dependency on the CRT is removed from the manifests of all DLLs.
|
||||||
|
This allows the CRT loaded by the .exe files to be used instead.
|
||||||
|
'''
|
||||||
|
search_pat = re.compile(r'(?is)<dependency>.*Microsoft\.VC\d+\.CRT')
|
||||||
|
repl_pat = re.compile(
|
||||||
|
r'(?is)<dependency>.*?Microsoft\.VC\d+\.CRT.*?</dependency>')
|
||||||
|
|
||||||
|
for dll in glob.glob(self.j(self.dll_dir, '*.dll')):
|
||||||
|
bn = self.b(dll)
|
||||||
|
with open(dll, 'rb') as f:
|
||||||
|
raw = f.read()
|
||||||
|
match = search_pat.search(raw)
|
||||||
|
if match is None:
|
||||||
|
continue
|
||||||
|
self.info('Removing CRT dependency from manifest of: %s'%bn)
|
||||||
|
# Blank out the bytes corresponding to the dependency specification
|
||||||
|
nraw = repl_pat.sub(lambda m: b' '*len(m.group()), raw)
|
||||||
|
if len(nraw) != len(raw):
|
||||||
|
raise Exception('Something went wrong with %s'%bn)
|
||||||
|
with open(dll, 'wb') as f:
|
||||||
|
f.write(nraw)
|
||||||
|
|
||||||
def initbase(self):
|
def initbase(self):
|
||||||
if self.e(self.base):
|
if self.e(self.base):
|
||||||
shutil.rmtree(self.base)
|
shutil.rmtree(self.base)
|
||||||
@ -103,6 +129,9 @@ class Win32Freeze(Command, WixMixIn):
|
|||||||
def freeze(self):
|
def freeze(self):
|
||||||
shutil.copy2(self.j(self.src_root, 'LICENSE'), self.base)
|
shutil.copy2(self.j(self.src_root, 'LICENSE'), self.base)
|
||||||
|
|
||||||
|
self.info('Adding CRT')
|
||||||
|
shutil.copytree(CRT, self.j(self.base, os.path.basename(CRT)))
|
||||||
|
|
||||||
self.info('Adding resources...')
|
self.info('Adding resources...')
|
||||||
tgt = self.j(self.base, 'resources')
|
tgt = self.j(self.base, 'resources')
|
||||||
if os.path.exists(tgt):
|
if os.path.exists(tgt):
|
||||||
|
@ -11,6 +11,10 @@
|
|||||||
SummaryCodepage='1252' />
|
SummaryCodepage='1252' />
|
||||||
|
|
||||||
<Media Id="1" Cabinet="{app}.cab" CompressionLevel="{compression}" EmbedCab="yes" />
|
<Media Id="1" Cabinet="{app}.cab" CompressionLevel="{compression}" EmbedCab="yes" />
|
||||||
|
<!-- The following line ensures that DLLs are replaced even if their version is the same as before. This
|
||||||
|
is necessary because of the manifest nuking that was part of making calibre isolated. But I think it
|
||||||
|
is more rigorous anyway. -->
|
||||||
|
<Property Id='REINSTALLMODE' Value='emus'/>
|
||||||
|
|
||||||
<Upgrade Id="{upgrade_code}">
|
<Upgrade Id="{upgrade_code}">
|
||||||
<UpgradeVersion Maximum="{version}"
|
<UpgradeVersion Maximum="{version}"
|
||||||
@ -33,7 +37,6 @@
|
|||||||
</Property>
|
</Property>
|
||||||
|
|
||||||
<Directory Id='TARGETDIR' Name='SourceDir'>
|
<Directory Id='TARGETDIR' Name='SourceDir'>
|
||||||
<Merge Id="VCRedist" SourceFile="{crt_msm}" DiskId="1" Language="0"/>
|
|
||||||
<Directory Id='ProgramFilesFolder' Name='PFiles'>
|
<Directory Id='ProgramFilesFolder' Name='PFiles'>
|
||||||
<Directory Id='APPLICATIONFOLDER' Name='{app}' />
|
<Directory Id='APPLICATIONFOLDER' Name='{app}' />
|
||||||
</Directory>
|
</Directory>
|
||||||
@ -100,10 +103,6 @@
|
|||||||
<ComponentRef Id="RememberInstallDir"/>
|
<ComponentRef Id="RememberInstallDir"/>
|
||||||
</Feature>
|
</Feature>
|
||||||
|
|
||||||
<Feature Id="VCRedist" Title="Visual C++ 8.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
|
|
||||||
<MergeRef Id="VCRedist"/>
|
|
||||||
</Feature>
|
|
||||||
|
|
||||||
<Feature Id="FSMS" Title="Start menu shortcuts" Level="1"
|
<Feature Id="FSMS" Title="Start menu shortcuts" Level="1"
|
||||||
Description="Program shortcuts installed in the Start Menu">
|
Description="Program shortcuts installed in the Start Menu">
|
||||||
<ComponentRef Id="StartMenuShortcuts"/>
|
<ComponentRef Id="StartMenuShortcuts"/>
|
||||||
@ -149,12 +148,13 @@
|
|||||||
Set default folder name and allow only per machine installs.
|
Set default folder name and allow only per machine installs.
|
||||||
For a per-machine installation, the default installation location
|
For a per-machine installation, the default installation location
|
||||||
will be [ProgramFilesFolder][ApplicationFolderName] and the user
|
will be [ProgramFilesFolder][ApplicationFolderName] and the user
|
||||||
will be able to change it in the setup UI. This is because the installer
|
will be able to change it in the setup UI. This is no longer necessary
|
||||||
has to install the VC90 merge module into the system winsxs folder for python
|
(i.e. per user installs should work) but left this way as I
|
||||||
to work, so per user installs are impossible anyway.
|
dont want to deal with the complications
|
||||||
-->
|
-->
|
||||||
<Property Id="ApplicationFolderName" Value="Calibre2" />
|
<Property Id="ApplicationFolderName" Value="Calibre2" />
|
||||||
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
|
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
|
||||||
|
<Property Id="ALLUSERS" Value="1" />
|
||||||
<WixVariable Id="WixUISupportPerUser" Value="0" />
|
<WixVariable Id="WixUISupportPerUser" Value="0" />
|
||||||
|
|
||||||
<!-- Add option to launch calibre after install -->
|
<!-- Add option to launch calibre after install -->
|
||||||
|
@ -35,7 +35,6 @@ class WixMixIn:
|
|||||||
exe_map = self.smap,
|
exe_map = self.smap,
|
||||||
main_icon = self.j(self.src_root, 'icons', 'library.ico'),
|
main_icon = self.j(self.src_root, 'icons', 'library.ico'),
|
||||||
web_icon = self.j(self.src_root, 'icons', 'web.ico'),
|
web_icon = self.j(self.src_root, 'icons', 'web.ico'),
|
||||||
crt_msm = self.j(self.SW, 'Microsoft_VC90_CRT_x86.msm')
|
|
||||||
)
|
)
|
||||||
template = open(self.j(self.d(__file__), 'en-us.xml'),
|
template = open(self.j(self.d(__file__), 'en-us.xml'),
|
||||||
'rb').read()
|
'rb').read()
|
||||||
|
@ -88,6 +88,12 @@ def test_imaging():
|
|||||||
raise RuntimeError('PIL choked!')
|
raise RuntimeError('PIL choked!')
|
||||||
print ('PIL OK!')
|
print ('PIL OK!')
|
||||||
|
|
||||||
|
def test_unrar():
|
||||||
|
from calibre.libunrar import _libunrar
|
||||||
|
if not _libunrar:
|
||||||
|
raise RuntimeError('Failed to load libunrar')
|
||||||
|
print ('Unrar OK!')
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
test_plugins()
|
test_plugins()
|
||||||
test_lxml()
|
test_lxml()
|
||||||
@ -98,6 +104,7 @@ def test():
|
|||||||
test_win32()
|
test_win32()
|
||||||
test_qt()
|
test_qt()
|
||||||
test_imaging()
|
test_imaging()
|
||||||
|
test_unrar()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test()
|
test()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user