It’s been nearly ten months since my last package for Calibre. What’s Calibre again I hear you ask? It is the highly popular E-book library management program with support for any E-Reader you can think of. I doubt that anyone who tried Calibre will ever switch back to one of the proprietary library management programs that commonly ship with E-Reader devices because Calibre transfers your E-books to and from your E-Reader device with ease. Calibre also contains an excellent E-book reader program for your desktop – even an EPUB editor comparable to Sigil. It will let you convert E-books from one format to another and allows you to subscribe to lots of news sites.
Last year august, the Calibre software switched from Qt4 to Qt5 for its user interface, and I was not yet prepared to follow suit. Running up to that month I had been working long and hard on the new KDE 5 preview and that was my first encounter with Qt5 – I decided to wait a bit for the new Calibre to mature and also I wanted to wait with adding Qt5 to my slackbuilds repository (the qt5 in ‘ktown_testing’ was just that, for testing KDE 5 and nothing production-ready).
During the previous couple of weeks I enjoyed several long weekends due to national holidays, and so it happened that I could spend some time re-visiting the calibre.SlackBuild and updating it so that it was able to compile a package for Calibre 2.x.
I wanted as few external dependencies as possible. The exception would be Qt5 which should be a proper package in its own right – it is too big to become a mere part of a calibre package. I ended up with just “podofo” and “qt5” as dependencies and I am now in the process of uploading the qt5 packages for slackware-current… something I forgot earlier this week. I borrowed them from my ktown_testing repository in order to compile Calibre.
But I also want to keep the older Qt4 version of Calibre (the 1.x releases) around for those who like that better or do not want the big Qt5 on their computer. So I renamed my SlackBuild for the 1.x version to “calibre1.SlackBuild“. I then recompiled calibre-1.48.0 for Slackware-current because the previous build of the package was broken after the recent big update and I still needed to address that issue. That is why you will find a “calibre” as well as a “calibre1” package in the repositories for Slackware 14.1 and -current. Take your pick.
Enjoy a shiny new Calibre 2.28.0 on Slackware (14.1 and -current)!
Eric
Awesome job Eric! I can’t thank you enough. Although Calibre 1-48 was running smoothly, it is really nice to get a fresh update from the best ebook manager around. I use it daily and can’t get along with my Kobo without Calibre. And this version is running really fine here, Slack64 14.1.
Calibre is the only open source program I’ve ever donated Bitcoin to. It’s that good. ?
calibre indeed is one of the most useful piece of code for ebook and ereader lovers. My damn proprietary Kindle runs free as in speech after calibre.
Thank you Eric for this long time waited update, even I’m no going to your packages as I already using it from the standard install. It have worked just fine for me.
Anyway, I’m sure it’s going to be useful for many out there as calibre 2.x is a really good improvement in the UI/UX side compared to 1.x
Great work! Thank you, Eric!
One hour ago I installed Calibre 2.29 on Slackware64 14.1 multilib (so qt 4.8.6) via the wget statement from their website. No problems, no questions asked.
root@riposo:~/works# ldd /opt/calibre/calibre
linux-vdso.so.1 (0x00007fff20bf2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f1f6b862000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1f6bc2c000)
root@riposo:~/works#
So why go through all this trouble?
Regards, Dick
PS: I am not allergic to static builds.
D.L.C. Burggraaff, if you need to ask “why go through all this trouble” then I did not make this package for you.
I want to install pre-compiled binaries on my Slackware computer only if there is no other choice. That is why I provide a Chromium package – I assume you are just running Chrome because that is easier?
The installer from Calibre’s web site works OK for those who use it, so by all means, keep using it.
FYI, that online installation contains all Qt5 libraries so it is quite a big install (every dependency is statically compile into it actually) and if you already have Qt5 installed, it wastes a lot of your disk space.
But that’s a choice you can make. I am not limiting your options, I am expanding them.
For all those other people who want to learn how to compile calibre natively (that includes me) there’s the calibre.SlackBuild , and a package which you can easily install and de-install or upgrade.
Thanks! And my in-laws thank you, since they won’t need to carry around boxes of books next time we move with my (new) ebook habit. 🙂
Dear Eric,
It was never my intention to offend you or belittle your work. If you took it that way then please accept my apologies.
Kind regards, Dick
Hi Dick,
I was not offended. But I needed to respond the “why bother” attitude displayed in your post. It very much matters to me that I bother about things when other people don’t.
attempting to compile the new version of Calibre under 14.1 and am getting some issues… I’ve installed, not compiled, your Qt5 package for 14.1 and already had podofo installed. I get this during Calibre compilation:
Traceback (most recent call last):
File “setup.py”, line 13, in
import setup.commands as commands
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/commands.py”, line 28, in
from setup.translations import POT, GetTranslations, Translations, ISO639, ISO3166
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/translations.py”, line 14, in
from setup.parallel_build import parallel_check_output
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/parallel_build.py”, line 14, in
from setup.build_environment import cpu_count
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/build_environment.py”, line 96, in
from PyQt5.QtCore import PYQT_CONFIGURATION
ImportError: No module named PyQt5.QtCore
Traceback (most recent call last):
File “setup.py”, line 13, in
import setup.commands as commands
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/commands.py”, line 28, in
from setup.translations import POT, GetTranslations, Translations, ISO639, ISO3166
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/translations.py”, line 14, in
from setup.parallel_build import parallel_check_output
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/parallel_build.py”, line 14, in
from setup.build_environment import cpu_count
File “/tmp/build/tmp-calibre/calibre-2.28.0/setup/build_environment.py”, line 96, in
from PyQt5.QtCore import PYQT_CONFIGURATION
ImportError: No module named PyQt5.QtCore
./calibre.SlackBuild: line 1078: cd: /tmp/build/package-calibre/usr/share/calibre/fonts/liberation/: No such file or directory
> ImportError: No module named PyQt5.QtCore
Did you logout and log back in after installing the qt5 package? It installs a profile script under /etc/profile.d/
Eric – I’ve verified that there are qt5 scripts in /etc/profile.d and have tried logging out/in, as well as a reboot, but still getting the same message. Should I have removed qt4 after installing qt5?
dimm0k, no you should not remove Qt4.
But after looking better at the error, I know what is wrong.
The error is about the missing PyQt5 package. And that is correct, if you run the calibre.SlackBuild as-is.
What I did not write in the article, was that the script needs to be told explicitly to compile the python interpreter plus supporting modules into the package. Because the package checks for the existence of a suitable Python on your computer… and if it finds one (like in Slackware 14.0 and higher) then the script will use that. And then you need the python support modules like PyQt5 and others, in the form of external packages that have already been installed before you compile Calibre.
In order to depend on just Qt5 and podofo and add the rest as static libraries to the calibre package, run the script like this:
# BUILD_PYTHON=YES calibre.SlackBuild
Eric – looks like the inclusion of the “BUILD_PYTHON=YES” did it! thank you!
Hello Eric,
I don’t use Calibre but I saw in your Changelog that you referred to calibre1 dependencies as Perl libraries. Aren’t they Python libraries?
Sorry for nitpicking
Yeah… it should have been “Python” indeed…
After adding qt5 and calibre to -current:
Traceback (most recent call last):
File “/usr/bin/calibre”, line 20, in
sys.exit(calibre())
File “/usr/lib/calibre/calibre/gui_launch.py”, line 62, in calibre
from calibre.gui2.main import main
File “/usr/lib/calibre/calibre/gui2/__init__.py”, line 8, in
from PyQt5.Qt import (
ImportError: cannot import name QFileInfo
ldd /usr/lib/calibre/lib/python2.7/site-packages/PyQt5/QtCore.so gives:
libicudata.so.51 => not found
libicui18n.so.51 => not found
libicuuc.so.51 => not found
icu4c-54.1-i486-1 installed from -current (upgraded Tue Apr 21 23:44:00 UTC 2015). Should your Calibre package be updated?
Could be that the 32bit package needs a rebuild. The 64bit package is OK, it links against libicu*.so.54 libraries.
calibre-2.31.0-i486-1alien for -current is still linked to libicu*.so.51 libraries. I think it’s compiled on 14.1, not on latest current (which uses libicu*.so.54 since April).
Hi slodki
I’ll check tonight what happened. I know I made sure that I compiled the calibre package for slackware-current on an up-to-date virtual machine. I’ll boot that VM tonight and install the calibre package on it. Perhaps I missed something.
Can you check the MD5SUM of the package you installed? It should be:
ac95ec217529156e1c6a299ae67cee61 calibre/pkg/current/calibre-2.31.0-i486-1alien.txz
I could check remotely and this is what my calibre package tells me:
$ ldd /usr/lib/calibre/lib/python2.7/site-packages/PyQt5/QtCore.so |grep icu
libicui18n.so.54 => /usr/lib/libicui18n.so.54 (0xb6ae5000)
libicuuc.so.54 => /usr/lib/libicuuc.so.54 (0xb6977000)
libicudata.so.54 => /usr/lib/libicudata.so.54 (0xb514b000)
I.e. the package links correctly to icu4c-54.1.
The package you installed is most likely the one compiled for Slackware 14.1 so my next question is: what is the URL of the package you downloaded?
installed via gslapt, I’ve 2 packages in /var/slapt-get/calibre/pkg/current only:
21929c00650fa7af416131372f717ddf calibre-2.30.0-i486-1alien.txz
ac95ec217529156e1c6a299ae67cee61 calibre-2.31.0-i486-1alien.txz
Both QtCore.so files extracted from your txz packages:
7a0b8b510e00ffbe3f234808e9fe70bb /tmp/new/QtCore.so
4b56006a1e67d552e9b9cd2687531fd1 /tmp/old/QtCore.so
are linked to .51 version. 54.1 version is available in standard /usr/lib, from official package.
The icu4c linking does not happen in calibre. You have a qt5 package which has been compiled for Slackware 14.1 and that links against the wrong icu4c libraries if used on slackware-current:
Before installing qt5-5.4.1-i486-1alien :
# ldd /usr/lib/calibre/lib/python2.7/site-packages/PyQt5/QtCore.so
linux-gate.so.1 (0xb7780000)
libQt5Core.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xb74b6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb73c4000)
libm.so.6 => /lib/libm.so.6 (0xb737a000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb735c000)
libc.so.6 => /lib/libc.so.6 (0xb71c4000)
/lib/ld-linux.so.2 (0xb7781000)
After installing qt5-5.4.1-i486-1alien
# ldd /usr/lib/calibre/lib/python2.7/site-packages/PyQt5/QtCore.so
libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0xb7064000)
…
libicui18n.so.54 => /usr/lib/libicui18n.so.54 (0xb6abe000)
libicuuc.so.54 => /usr/lib/libicuuc.so.54 (0xb6950000)
libicudata.so.54 => /usr/lib/libicudata.so.54 (0xb5124000)
…
# ldd /usr/lib/libQt5Core.so.5
…
libicui18n.so.54 => /usr/lib/libicui18n.so.54 (0xb701a000)
libicuuc.so.54 => /usr/lib/libicuuc.so.54 (0xb6eac000)
libicudata.so.54 => /usr/lib/libicudata.so.54 (0xb5680000)
…
bingo! qt5 was autoselected from dependency, but from wrong dir…
Hi!
I have the same problem with building of calibre (unfortunately – I have newer imagemagick so you package does not run due to the deps) lacking PyQT5 – it seems something is not building well: I get
Error: This version of PyQt5 requires sip 4.16.6 or later.
despite sip 4.16.7 being built successfully in previous step
actually – the process dies sooner at building dbus-python:
checking for python extension module directory… ${exec_prefix}/lib64/python2.7/site-packages
configure: PYTHON_INCLUDES overridden to: -I/usr/lib64/calibre/include/python2.7 /usr/include/python2.7
checking whether those headers are sufficient… no
configure: error: could not find Python headers
Without more detail I can not even start helping you.
What version of Slackware? What commandline to build the calibre package? What other packages did you install already that the SlackBuild might be building as well?
Hi!
Slack64-14.1, for building just run your script.
sip 4.1.7 and dbus-python are already installed as separate packages.
During build of PyQT at installation I get such error:
install -m 755 -p /tmp/build/tmp-calibre/PyQt-gpl-5.4.1/pyuic5 /tmp/build/package-calibre/usr/bin/
strip /tmp/build/package-calibre/usr/bin/pyuic5
strip:/tmp/build/package-calibre/usr/bin/pyuic5: File format not recognized
make: [install_pyuic5] Error 1 (ignored)
which eventually leads to lackig lib as mentioned in mu=y first comment
the essential event in building:
** calibre **
Hmm… Looks like a unified diff to me…
The text leading up to this was:
————————–
|— calibre-2.28.0/setup/extensions.py.orig 2015-05-15 05:29:00.000000000 +0200
|+++ calibre-2.28.0/setup/extensions.py 2015-05-27 10:20:43.236708204 +0200
————————–
patching file setup/extensions.py
Using Plan A…
Hunk #1 succeeded at 548 (offset 16 lines).
done
Traceback (most recent call last):
File “setup.py”, line 13, in
import setup.commands as commands
File “/tmp/build/tmp-calibre/calibre-2.32.1/setup/commands.py”, line 28, in
from setup.translations import POT, GetTranslations, Translations, ISO639, ISO3166
File “/tmp/build/tmp-calibre/calibre-2.32.1/setup/translations.py”, line 14, in
from setup.parallel_build import parallel_check_output
File “/tmp/build/tmp-calibre/calibre-2.32.1/setup/parallel_build.py”, line 14, in
from setup.build_environment import cpu_count
File “/tmp/build/tmp-calibre/calibre-2.32.1/setup/build_environment.py”, line 96, in
from PyQt5.QtCore import PYQT_CONFIGURATION
ImportError: No module named PyQt5.QtCore
it’s ridiculous, but I am not able to build 1.48 also:
####### Building extension libmtp #######
*
* Running gui
*
Traceback (most recent call last):
File “setup.py”, line 99, in
sys.exit(main())
File “setup.py”, line 85, in main
command.run_all(opts)
File “/tmp/build/tmp-calibre1/calibre/setup/__init__.py”, line 181, in run_all
self.run_cmd(self, opts)
File “/tmp/build/tmp-calibre1/calibre/setup/__init__.py”, line 175, in run_cmd
self.run_cmd(scmd, opts)
File “/tmp/build/tmp-calibre1/calibre/setup/__init__.py”, line 178, in run_cmd
cmd.run(opts)
File “/tmp/build/tmp-calibre1/calibre/setup/gui.py”, line 41, in run
self.build_forms(summary=opts.summary)
File “/tmp/build/tmp-calibre1/calibre/setup/gui.py”, line 63, in build_forms
from calibre.gui2 import build_forms
File “/tmp/build/tmp-calibre1/calibre/src/calibre/gui2/__init__.py”, line 7, in
from PyQt4.Qt import (QVariant, QFileInfo, QObject, QBuffer, Qt,
ImportError: cannot import name QVariant
(the same system, KDE 4.14.3/Qt 4.8.6)
Hi!
I solved the mystery with calibre1 – the compilation does not work if the sip is v.4.16.7, with v.4.14.2 i can be compiled and runs fine.
Calibre2 still waits for ideas. even on fresh slack64-14.1 VM it dies at the same stage – ImportError: No module named PyQt5.QtCore
Mind you, I build my calibre packages with the following commandline to prevent from having to build and install every dependency separately:
# BUILD_PYTHON=YES ./calibre.SlackBuild
Because Slackware already contains python 2.7, the calibre script won’t compile its own private python. The consequence of that is, that it _also_ does not compile the other python dependencies. You can override this behaviour by using the above commandline.
YESSS!
Thank you very much, Eric!
Hi, Eric!
I think, its not package related, but may be you have idea:
all metatdata request ends with
calibre, version 2.32.1
K??DA: Lejupiel?de neizdev?s: Neizdev?s lejupiel?d?t metadatus. Uzklikš?iniet “R?d?t vair?k”plaš?kai inform?cijai
Traceback (most recent call last):
File “/usr/lib64/calibre/calibre/utils/ipc/simple_worker.py”, line 274, in main
res = {‘result’:func(*args, **kwargs)}
File “/usr/lib64/calibre/calibre/ebooks/metadata/sources/worker.py”, line 103, in single_identify
identifiers=identifiers)
File “/usr/lib64/calibre/calibre/ebooks/metadata/sources/identify.py”, line 452, in identify
log(‘Request extra headers:’, plugin.browser.addheaders)
File “/usr/lib64/calibre/calibre/ebooks/metadata/sources/base.py”, line 285, in browser
self._browser = browser(user_agent=self.user_agent)
File “/usr/lib64/calibre/calibre/__init__.py”, line 403, in browser
opener = Browser(verify_ssl=verify_ssl_certificates)
File “/usr/lib64/calibre/calibre/utils/browser.py”, line 44, in __init__
sc = ssl.create_default_context() if kwargs.pop(‘verify_ssl’, True) else ssl._create_unverified_context(cert_reqs=ssl.CERT_NONE)
AttributeError: ‘module’ object has no attribute ‘create_default_context’
It seems smth is wrong with ssl. At first i thought it has anything to do with openssh 7, but reverting to the original package did not improve the situation. May be it is a bug to be reported?
Hi Janis
Calibre developer has increased the minimum required version of Python to 2.7.9 (it used to be 2.7.1). The reason for that is the use of “SSLContext”. This attribute was introduced in python-2.7.9.
My guess is that you have built Calibre yourself on Slackware 14.1 which has Python 2.7.5.
I have updated the calibre.SlackBuild script for my next release, to check for python 2.7.9 and if your python is older, the script will compile 2.7.10 into the package.
For now you can recompile using my SlackBuild and add a working Python using the following command:
# BUILD_PYTHON=YES ./calibre.SlackBuild
Thank you for clarification!