mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Loads the PIL C extensions from the file system as they apparently use exceptions that cause crash with MemoryModule
566 lines
17 KiB
ReStructuredText
566 lines
17 KiB
ReStructuredText
Notes on setting up the windows development environment
|
|
========================================================
|
|
|
|
Overview
|
|
----------
|
|
|
|
calibre and all its dependencies are compiled using Visual Studio 2008. All the
|
|
following instructions must be run in a visual studio command prompt (the
|
|
various commands use unix notation, so if you want to use them directly, you
|
|
have to setup cygwin).
|
|
|
|
calibre contains build script to automate the building of the calibre
|
|
installer. These scripts make certain assumptions about where dependencies are
|
|
installed. Your best best is to setup a VM and replicate the paths mentioned
|
|
below exactly.
|
|
|
|
Microsoft Visual Studio and Windows SDK
|
|
----------------------------------------
|
|
|
|
You have to use Visual Studio 2008 as that is the version Python 2.x works
|
|
with.
|
|
|
|
You need Visual Studio 2008 Express Edition for 32-bit and Professional for 64
|
|
bit.
|
|
|
|
1) Install Visual Studio
|
|
2) Install Visual Studio SP1 from http://www.microsoft.com/en-us/download/details.aspx?id=10986
|
|
(First check if the version of VS 2008 you have is not already SP1)
|
|
3) Install The Windows SDK. You need to install a version that is built for VS
|
|
2008. Get it from here: http://www.microsoft.com/en-us/download/details.aspx?id=3138
|
|
4) If you are building 64bit, edit the properties of the Visual Studio command
|
|
prompt shortcut to pass "amd64" instead of "x86" to the vsvars.bat file so that
|
|
it uses the 64 bit tools.
|
|
|
|
I've read that it is possible to use the 64-bit compiler that comes with the
|
|
Windows SDK With VS 2008 Express Edition, but I can't be bothered figuring it
|
|
out. Just use the Professional Edition.
|
|
|
|
Cygwin
|
|
------------
|
|
|
|
This is needed for automation of the build process, and the ease of use of the
|
|
unix shell (bash).
|
|
|
|
Install, vim, rsync, openssh, unzip, wget, make at a minimum.
|
|
|
|
After installing python run::
|
|
python setup/vcvars.py && echo 'source ~/.vcvars' >> ~/.bash_profile
|
|
|
|
To allow you to use the visual studio tools in the cygwin shell.
|
|
|
|
The following is only needed for automation (setting up ssh access to the
|
|
windows machine).
|
|
|
|
In order to build debug builds (.pdb files and sign files), you have to be able
|
|
to login as the normal user account with ssh. To do this, follow these steps:
|
|
|
|
* Setup a password for your user account
|
|
* Follow the steps here:
|
|
http://pcsupport.about.com/od/windows7/ht/auto-logon-windows-7.htm or
|
|
http://pcsupport.about.com/od/windowsxp/ht/auto-logon-xp.htm to allow the
|
|
machine to bootup without having to enter the password
|
|
* First clean out any existing cygwin ssh setup with::
|
|
net stop sshd
|
|
cygrunsrv -R sshd
|
|
net user sshd /DELETE
|
|
net user cyg_server /DELETE (delete any other cygwin users account you
|
|
can list them with net user)
|
|
rm -R /etc/ssh*
|
|
mkpasswd -cl > /etc/passwd
|
|
mkgroup --local > /etc/group
|
|
* Assign the necessary rights to the normal user account (administrator
|
|
command prompt needed)::
|
|
editrights.exe -a SeAssignPrimaryTokenPrivilege -u kovid
|
|
editrights.exe -a SeCreateTokenPrivilege -u kovid
|
|
editrights.exe -a SeTcbPrivilege -u kovid
|
|
editrights.exe -a SeServiceLogonRight -u kovid
|
|
* Run::
|
|
ssh-host-config
|
|
And answer (yes) to all questions. If it asks do you want to use a
|
|
different user name, specify the name of your user account and enter
|
|
username and password (it asks on Win 7 not on Win XP)
|
|
* On Windows XP, I also had to run::
|
|
passwd -R
|
|
to allow sshd to use my normal user account even with public key
|
|
authentication. See http://cygwin.com/cygwin-ug-net/ntsec.html for
|
|
details. On Windows 7 this wasn't necessary for some reason.
|
|
* Start sshd with::
|
|
net start sshd
|
|
* See http://www.kgx.net.nz/2010/03/cygwin-sshd-and-windows-7/ for details
|
|
|
|
Pass port 22 through Windows firewall. Create ~/.ssh/authorized_keys
|
|
|
|
Basic dependencies
|
|
--------------------
|
|
|
|
Install cmake, python, WiX (WiX is used to generate the .msi installer)
|
|
|
|
You have to
|
|
|
|
Set CMAKE_PREFIX_PATH environment variable to C:\cygwin\home\kovid\sw
|
|
|
|
This is where all dependencies will be installed.
|
|
|
|
Add C:\Python27\Scripts and C:\Python27 to PATH
|
|
|
|
Edit mimetypes.py in C:\Python27\Lib and set _winreg = None to prevent reading
|
|
of mimetypes from the windows registry
|
|
|
|
Python packages
|
|
------------------
|
|
|
|
Install setuptools from http://pypi.python.org/pypi/setuptools. Use the source
|
|
tarball. Edit setup.py and set zip_safe=False. Then run::
|
|
|
|
python setup.py install
|
|
|
|
Run the following command to install python dependencies::
|
|
|
|
easy_install --always-unzip -U mechanize python-dateutil dnspython cssutils clientform pycrypto cssselect
|
|
|
|
Install pyreadline from https://pypi.python.org/pypi/pyreadline/2.0
|
|
|
|
Install pywin32 and edit win32com\__init__.py setting _frozen = True and
|
|
__gen_path__ to a temp dir (otherwise it tries to set it to a dir in the
|
|
install tree which leads to permission errors)
|
|
Note that you should use::
|
|
|
|
import tempfile
|
|
__gen_path__ = os.path.join(
|
|
tempfile.gettempdir(), "gen_py",
|
|
"%d.%d" % (sys.version_info[0], sys.version_info[1]))
|
|
|
|
Use gettempdir instead of the win32 api method as gettempdir returns a temp dir
|
|
that is guaranteed to actually work.
|
|
|
|
Also edit win32com\client\gencache.py and change the except IOError on line 57
|
|
to catch all exceptions.
|
|
|
|
SQLite
|
|
---------
|
|
|
|
Put sqlite3*.h from the sqlite windows amalgamation in ~/sw/include
|
|
|
|
APSW
|
|
-----
|
|
|
|
Download source from http://code.google.com/p/apsw/downloads/list and run in visual studio prompt
|
|
|
|
python setup.py fetch --all --missing-checksum-ok build --enable-all-extensions install test
|
|
|
|
OpenSSL
|
|
--------
|
|
|
|
First install ActiveState Perl if you dont already have perl in windows
|
|
|
|
Then, get nasm.exe from
|
|
http://www.nasm.us/pub/nasm/releasebuilds/2.05/nasm-2.05-win32.zip and put it
|
|
somewhere on your PATH (I chose ~/sw/bin)
|
|
|
|
Download and untar the openssl tarball, follow the instructions in INSTALL.(W32|W64)
|
|
to install use prefix q:\openssl
|
|
|
|
For 32-bit::
|
|
perl Configure VC-WIN32 no-asm enable-static-engine --prefix=Q:/openssl
|
|
ms\do_ms.bat
|
|
nmake -f ms\ntdll.mak
|
|
nmake -f ms\ntdll.mak test
|
|
nmake -f ms\ntdll.mak install
|
|
|
|
For 64-bit::
|
|
perl Configure VC-WIN64A no-asm enable-static-engine --prefix=C:/cygwin/home/kovid/sw/private/openssl
|
|
ms\do_win64a
|
|
nmake -f ms\ntdll.mak
|
|
nmake -f ms\ntdll.mak test
|
|
nmake -f ms\ntdll.mak install
|
|
|
|
Qt
|
|
--------
|
|
Download Qt sourcecode (.zip) from: http://download.qt-project.org/official_releases/qt/
|
|
|
|
Qt uses its own routine to locate and load "system libraries" including the
|
|
openssl libraries needed for "Get Books". This means that we have to apply the
|
|
following patch to have Qt load the openssl libraries bundled with calibre:
|
|
|
|
|
|
--- src/corelib/plugin/qsystemlibrary.cpp 2011-02-22 05:04:00.000000000 -0700
|
|
+++ src/corelib/plugin/qsystemlibrary.cpp 2011-04-25 20:53:13.635247466 -0600
|
|
@@ -110,7 +110,7 @@ HINSTANCE QSystemLibrary::load(const wch
|
|
|
|
#if !defined(QT_BOOTSTRAPPED)
|
|
if (!onlySystemDirectory)
|
|
- searchOrder << QFileInfo(qAppFileName()).path();
|
|
+ searchOrder << (QFileInfo(qAppFileName()).path().replace(QLatin1Char('/'), QLatin1Char('\\')) + QString::fromLatin1("\\DLLs\\"));
|
|
#endif
|
|
searchOrder << qSystemDirectory();
|
|
|
|
|
|
Now, run configure and make:
|
|
|
|
-no-plugin-manifests is needed so that loading the plugins does not fail looking for the CRT assembly
|
|
|
|
./configure.exe -ltcg -opensource -release -qt-zlib -qt-libmng -qt-libpng -qt-libtiff -qt-libjpeg -release -platform win32-msvc2008 -no-qt3support -webkit -xmlpatterns -no-phonon -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -no-declarative -no-scripttools -no-audio-backend -no-multimedia -no-dbus -no-openvg -no-opengl -no-qt3support -confirm-license -nomake examples -nomake demos -nomake docs -nomake tools -no-plugin-manifests -openssl -I $OPENSSL_DIR/include -L $OPENSSL_DIR/lib && nmake
|
|
|
|
Add the path to the bin folder inside the Qt dir to your system PATH.
|
|
|
|
SIP
|
|
-----
|
|
|
|
Available from: http://www.riverbankcomputing.co.uk/software/sip/download ::
|
|
|
|
python configure.py -p win32-msvc2008 && nmake && nmake install
|
|
|
|
PyQt4
|
|
----------
|
|
|
|
Compiling instructions::
|
|
|
|
python configure.py -c -j5 -e QtCore -e QtGui -e QtSvg -e QtNetwork -e QtWebKit -e QtXmlPatterns --verbose --confirm-license
|
|
nmake
|
|
nmake install
|
|
|
|
ICU
|
|
-------
|
|
|
|
Download the win32 source .zip from http://www.icu-project.org/download
|
|
|
|
Extract to q:\icu
|
|
|
|
Add Q:\icu\bin to PATH and reboot
|
|
|
|
In a Visual Studio Command Prompt
|
|
cd to <ICU>\source
|
|
Run set PATH=%PATH%;c:\cygwin\bin
|
|
Run dos2unix on configure and runConfigureICU
|
|
|
|
Run bash ./runConfigureICU Cygwin/MSVC
|
|
|
|
Run make (note that you must have GNU make installed in cygwin)
|
|
|
|
Optionally run make check
|
|
|
|
zlib
|
|
------
|
|
|
|
Build with::
|
|
nmake -f win32/Makefile.msc
|
|
nmake -f win32/Makefile.msc test
|
|
|
|
cp zlib1.dll* ../../bin
|
|
cp zlib.lib zdll.* ../../lib
|
|
cp zconf.h zlib.h ../../include
|
|
|
|
jpeg-8
|
|
-------
|
|
|
|
Get the source code from: http://sourceforge.net/projects/libjpeg-turbo/files/
|
|
|
|
Run::
|
|
chmod +x cmakescripts/* && cd build
|
|
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DWITH_JPEG8=1 ..
|
|
nmake
|
|
cp sharedlib/jpeg8.dll* ~/sw/bin/
|
|
cp sharedlib/jpeg.lib ~/sw/lib/
|
|
cp jconfig.h ../jerror.h ../jpeglib.h ../jmorecfg.h ~/sw/include
|
|
|
|
libpng
|
|
---------
|
|
|
|
Download the libpng .zip source file from:
|
|
http://www.libpng.org/pub/png/libpng.html
|
|
|
|
Run::
|
|
mkdir build && cd build
|
|
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DZLIB_INCLUDE_DIR=C:/cygwin/home/kovid/sw/include -DZLIB_LIBRARY=C:/cygwin/home/kovid/sw/lib/zdll.lib ..
|
|
nmake
|
|
cp libpng*.dll ~/sw/bin/
|
|
cp libpng*.lib ~/sw/lib/
|
|
cp pnglibconf.h ../png.h ../pngconf.h ~/sw/include/
|
|
|
|
freetype
|
|
-----------
|
|
|
|
Get the .zip source from: http://download.savannah.gnu.org/releases/freetype/
|
|
|
|
Edit *all copies* of the file ftoption.h and add to generate a .lib
|
|
and a correct dll
|
|
|
|
#define FT_EXPORT(return_type) __declspec(dllexport) return_type
|
|
#define FT_EXPORT_DEF(return_type) __declspec(dllexport) return_type
|
|
|
|
|
|
VS 2008 .sln file is present, open it
|
|
|
|
* If you are doing x64 build, click the Win32 dropdown, select
|
|
Configuration manager->Active solution platform -> New -> x64
|
|
|
|
* Change active build type to release mutithreaded
|
|
|
|
* Project->Properties->Configuration Properties change configuration type
|
|
to dll and build solution
|
|
|
|
cp "`find . -name *.dll`" ~/sw/bin/
|
|
cp "`find . -name freetype.lib`" ~/sw/lib/
|
|
|
|
Now change configuration back to static for .lib and build solution
|
|
cp "`find . -name freetype*MT.lib`" ~/sw/lib/
|
|
|
|
cp build/freetype-2.3.9/objs/win32/vc2008/freetype239MT.lib lib/
|
|
cp -rf include/* ~/sw/include/
|
|
|
|
TODO: Test if this bloody thing actually works on 64 bit (apparently freetype
|
|
assumes sizeof(long) == sizeof(ptr) which is not true in Win64. See for
|
|
example: http://forum.openscenegraph.org/viewtopic.php?t=2880
|
|
|
|
expat
|
|
--------
|
|
|
|
Get from: http://sourceforge.net/projects/expat/files/expat/
|
|
|
|
Apparently expat requires stdint.h which VS 2008 does not have. So we get our
|
|
own.
|
|
|
|
Run::
|
|
cd lib
|
|
wget http://msinttypes.googlecode.com/svn/trunk/stdint.h
|
|
mkdir build && cd build
|
|
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..
|
|
nmake
|
|
cp expat.dll ~/sw/bin/ && cp expat.lib ~/sw/lib/
|
|
cp ../lib/expat.h ../lib/expat_external.h ~/sw/include
|
|
|
|
libiconv
|
|
----------
|
|
|
|
Run::
|
|
mkdir vs2008 && cd vs2008
|
|
|
|
Then follow these instructions:
|
|
http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio
|
|
|
|
Change the type to Release and config to x64 or Win32 and Build solution and
|
|
then::
|
|
cp "`find . -name *.dll`" ~/sw/bin/
|
|
cp "`find . -name *.dll.manifest`" ~/sw/bin/
|
|
cp "`find . -name *.lib`" ~/sw/lib/iconv.lib
|
|
cp "`find . -name iconv.h`" ~/sw/include/
|
|
|
|
Information for using a static version of libiconv is at the link above.
|
|
|
|
libxml2
|
|
-------------
|
|
|
|
Get it from: ftp://xmlsoft.org/libxml2/
|
|
|
|
Run::
|
|
cd win32
|
|
cscript.exe configure.js include=C:/cygwin/home/kovid/sw/include lib=C:/cygwin/home/kovid/sw/lib prefix=C:/cygwin/home/kovid/sw zlib=yes iconv=yes
|
|
nmake /f Makefile.msvc
|
|
mkdir -p ~/sw/include/libxml2/libxml
|
|
cp include/libxml/*.h ~/sw/include/libxml2/libxml/
|
|
find . -type f \( -name "*.dll" -o -name "*.dll.manifest" \) -exec cp "{}" ~/sw/bin/ \;
|
|
find . -name libxml2.lib -exec cp "{}" ~/sw/lib/ \;
|
|
|
|
libxslt
|
|
---------
|
|
|
|
Get it from: ftp://xmlsoft.org/libxml2/
|
|
|
|
Run::
|
|
cd win32
|
|
cscript.exe configure.js include=C:/cygwin/home/kovid/sw/include include=C:/cygwin/home/kovid/sw/include/libxml2 lib=C:/cygwin/home/kovid/sw/lib prefix=C:/cygwin/home/kovid/sw zlib=yes iconv=yes
|
|
nmake /f Makefile.msvc
|
|
mkdir -p ~/sw/include/libxslt ~/sw/include/libexslt
|
|
cp libxslt/*.h ~/sw/include/libxslt/
|
|
cp libexslt/*.h ~/sw/include/libexslt/
|
|
find . -type f \( -name "*.dll" -o -name "*.dll.manifest" \) -exec cp "{}" ~/sw/bin/ \;
|
|
find . -name lib*xslt.lib -exec cp "{}" ~/sw/lib/ \;
|
|
|
|
lxml
|
|
------
|
|
|
|
Get the source from: http://pypi.python.org/pypi/lxml
|
|
|
|
Change the include dirs and lib dirs by editing setupinfo.py and changing the
|
|
library_dirs() function to return::
|
|
|
|
return ['C:/cygwin/home/kovid/sw/lib']
|
|
|
|
and the include_dirs() function to return
|
|
|
|
return ['C:/cygwin/home/kovid/sw/include/libxml2', 'C:/cygwin/home/kovid/sw/include']
|
|
|
|
Run::
|
|
python setup.py install
|
|
|
|
Python Imaging Library
|
|
------------------------
|
|
|
|
For 32-bit:
|
|
Install as normal using installer at http://www.lfd.uci.edu/~gohlke/pythonlibs/
|
|
|
|
For 64-bit:
|
|
Download from http://pypi.python.org/pypi/Pillow/
|
|
Edit setup.py setting the ROOT values, like this::
|
|
|
|
SW = r'C:\cygwin\home\kovid\sw'
|
|
JPEG_ROOT = ZLIB_ROOT = FREETYPE_ROOT = (SW+r'\lib', SW+r'\include')
|
|
|
|
Build and install with::
|
|
python setup.py build
|
|
python setup.py install
|
|
|
|
Note that the lcms module will not be built. PIL requires lcms-1.x but only
|
|
lcms-2.x can be compiled as a 64 bit library.
|
|
|
|
Pillow >= 2.2 installs itself as a .egg file. calibre needs it to be a PIL
|
|
directory. Extract the PIL directory as follows:
|
|
cd /cygdrive/c/Python27/Lib/site-packages
|
|
mkdir p && cd p
|
|
unzip ../Pillow-*.egg
|
|
cd .. && rm Pillow-*.egg && mv p/PIL . && chmod +x PIL/*.pyd
|
|
|
|
Test it on the target system with
|
|
|
|
calibre-debug -c "from PIL import Image; import _imaging, _imagingmath, _imagingft"
|
|
|
|
kdewin32-msvc
|
|
----------------
|
|
|
|
I dont think this is needed any more, I've left it here just in case I'm wrong.
|
|
|
|
Get it from http://www.winkde.org/pub/kde/ports/win32/repository/kdesupport/
|
|
mkdir build
|
|
Run cmake
|
|
|
|
Set build type to release and configuration to dll
|
|
|
|
Build
|
|
|
|
cp build/kdewin32-msvc-0.3.9/build/include/* include/
|
|
cp build/kdewin32-msvc-0.3.9/build/bin/Release/*.dll bin/
|
|
cp build/kdewin32-msvc-0.3.9/build/bin/Release/*.lib lib/
|
|
cp build/kdewin32-msvc-0.3.9/build/bin/Release/*.exp lib/
|
|
cp -r build/kdewin32-msvc-0.3.9/include/msvc/ include/
|
|
cp build/kdewin32-msvc-0.3.9/include/*.h include/
|
|
|
|
poppler
|
|
-------------
|
|
|
|
mkdir build
|
|
|
|
Run the cmake GUI which will find the various dependencies automatically.
|
|
On 64 bit cmake might not let you choose Visual Studio 2008, in whcih case
|
|
leave the source field blank, click configure choose Visual Studio 2008 and
|
|
then enter the source field.
|
|
|
|
In Cmake: disable GTK, Qt, OPenjpeg, cpp, lcms, gtk_tests, qt_tests. Enable
|
|
jpeg, png and zlib::
|
|
|
|
cp build/utils/Release/*.exe ../../bin/
|
|
|
|
podofo
|
|
----------
|
|
|
|
Download from http://podofo.sourceforge.net/download.html
|
|
|
|
Add the following three lines near the top of CMakeLists.txt
|
|
SET(WANT_LIB64 FALSE)
|
|
SET(PODOFO_BUILD_SHARED TRUE)
|
|
SET(PODOFO_BUILD_STATIC FALSE)
|
|
|
|
Run::
|
|
cp "`find . -name *.dll`" ~/sw/bin/
|
|
cp "`find . -name *.lib`" ~/sw/lib/
|
|
mkdir ~/sw/include/podofo
|
|
cp build/podofo_config.h ~/sw/include/podofo
|
|
cp -r src/* ~/sw/include/podofo/
|
|
|
|
|
|
ImageMagick
|
|
--------------
|
|
|
|
Get the source from: http://www.imagemagick.org/download/windows/ImageMagick-windows.zip
|
|
|
|
Edit VisualMagick/configure/configure.cpp to set
|
|
|
|
int projectType = MULTITHREADEDDLL;
|
|
|
|
Run configure.bat in a visual studio command prompt
|
|
|
|
Run configure.exe generated by configure.bat
|
|
|
|
Edit magick/magick-config.h
|
|
|
|
Undefine ProvideDllMain and MAGICKCORE_X11_DELEGATE
|
|
|
|
Now open VisualMagick/VisualDynamicMT.sln set to Release
|
|
Remove the CORE_xlib, UTIL_Imdisplay and CORE_Magick++ projects.
|
|
|
|
F7 for build solution, you will get one error due to the removal of xlib, ignore
|
|
it.
|
|
|
|
netifaces
|
|
------------
|
|
|
|
Download the source tarball from http://alastairs-place.net/projects/netifaces/
|
|
|
|
Rename netifaces.c to netifaces.cpp and make the same change in setup.py
|
|
|
|
Run::
|
|
python setup.py build
|
|
cp `find build/ -name *.pyd` /cygdrive/c/Python27/Lib/site-packages/
|
|
|
|
|
|
psutil
|
|
--------
|
|
|
|
Download the source tarball
|
|
|
|
Run
|
|
|
|
Python setup.py build
|
|
cp -r build/lib.win32-*/* /cygdrive/c/Python27/Lib/site-packages/
|
|
|
|
easylzma
|
|
----------
|
|
|
|
This is only needed to build the portable installer.
|
|
|
|
Get it from http://lloyd.github.com/easylzma/ (use the trunk version)
|
|
|
|
Run cmake and build the Visual Studio solution (generates CLI tools and dll and
|
|
static lib automatically)
|
|
|
|
chmlib
|
|
-------
|
|
|
|
Download the zip source code from: http://www.jedrea.com/chmlib/
|
|
Run::
|
|
cd src && unzip ./ChmLib-ds6.zip
|
|
Then open ChmLib.dsw in Visual Studio, change the configuration to Release
|
|
(Win32|x64) and build solution, this will generate a static library in
|
|
Release/ChmLib.lib
|
|
|
|
libimobiledevice
|
|
------------------
|
|
|
|
See libimobiledevice_notes.rst
|
|
|
|
calibre
|
|
---------
|
|
|
|
Take a linux calibre tree on which you have run the following command::
|
|
|
|
python setup.py stage1
|
|
|
|
and copy it to windows.
|
|
|
|
Run::
|
|
|
|
python setup.py build
|
|
python setup.py win32_freeze
|
|
|
|
This will create the .msi in the dist directory.
|