mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-10-30 10:12:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			413 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			413 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. _develop:
 | |
| 
 | |
| Setting up a calibre development environment
 | |
| ===========================================================
 | |
| 
 | |
| calibre is completely open source, licensed under the `GNU GPL v3 <http://www.gnu.org/copyleft/gpl.html>`_.
 | |
| This means that you are free to download and modify the program to your heart's content. In this section,
 | |
| you will learn how to get a calibre development environment set up on the operating system of your choice.
 | |
| calibre is written primarily in `Python <https://www.python.org>`_ with some C/C++ code for speed and system interfacing.
 | |
| Note that calibre is not compatible with Python 3 and requires at least Python 2.7.9.
 | |
| 
 | |
| .. contents:: Contents
 | |
|   :depth: 2
 | |
|   :local:
 | |
| 
 | |
| Design philosophy
 | |
| -------------------
 | |
| 
 | |
| calibre has its roots in the Unix world, which means that its design is highly modular.
 | |
| The modules interact with each other via well defined interfaces. This makes adding new features and fixing
 | |
| bugs in calibre very easy, resulting in a frenetic pace of development. Because of its roots, calibre has a
 | |
| comprehensive command line interface for all its functions, documented in :doc:`generated/en/cli-index`.
 | |
| 
 | |
| The modular design of calibre is expressed via ``Plugins``. There is a :ref:`tutorial <customize>` on writing calibre plugins.
 | |
| For example, adding support for a new device to calibre typically involves writing less than a 100 lines of code in the form of
 | |
| a device driver plugin. You can browse the
 | |
| `built-in drivers <https://github.com/kovidgoyal/calibre/tree/master/src/calibre/devices>`_. Similarly, adding support
 | |
| for new conversion formats involves writing input/output format plugins. Another example of the modular design is the :ref:`recipe system <news>` for
 | |
| fetching news. For more examples of plugins designed to add features to calibre, see the `plugin index <http://www.mobileread.com/forums/showthread.php?p=1362767#post1362767>`_.
 | |
| 
 | |
| .. _code_layout:
 | |
| 
 | |
| Code layout
 | |
| ^^^^^^^^^^^^^^
 | |
| 
 | |
| All the calibre python code is in the ``calibre`` package. This package contains the following main sub-packages
 | |
| 
 | |
|     * devices - All the device drivers. Just look through some of the built-in drivers to get an idea for how they work.
 | |
| 
 | |
|       * For details, see: ``devices.interface`` which defines the interface supported by device drivers and ``devices.usbms`` which
 | |
|         defines a generic driver that connects to a USBMS device. All USBMS based drivers in calibre inherit from it.
 | |
| 
 | |
|     * ebooks  - All the ebook conversion/metadata code. A good starting point is ``calibre.ebooks.conversion.cli`` which is the
 | |
|       module powering the :command:`ebook-convert` command. The conversion process is controlled via ``conversion.plumber``.
 | |
|       The format independent code is all in ``ebooks.oeb`` and the format dependent code is in ``ebooks.format_name``.
 | |
| 
 | |
|         * Metadata reading, writing, and downloading is all in ``ebooks.metadata``
 | |
|         * Conversion happens in a pipeline, for the structure of the pipeline,
 | |
|           see :ref:`conversion-introduction`. The pipeline consists of an input
 | |
|           plugin, various transforms and an output plugin. The code that constructs
 | |
|           and drives the pipeline is in :file:`plumber.py`. The pipeline works on a
 | |
|           representation of an ebook that is like an unzipped epub, with
 | |
|           manifest, spine, toc, guide, html content, etc. The
 | |
|           class that manages this representation is OEBBook in ``ebooks.oeb.base``. The
 | |
|           various transformations that are applied to the book during
 | |
|           conversions live in :file:`oeb/transforms/*.py`. And the input and output
 | |
|           plugins live in :file:`conversion/plugins/*.py`.
 | |
|         * Ebook editing happens using a different container object. It is
 | |
|           documented in :ref:`polish_api`.
 | |
| 
 | |
|     * db - The database back-end. See :ref:`db_api` for the interface to the calibre library. 
 | |
| 
 | |
|     * content server: ``library.server`` is the calibre Content Server.
 | |
| 
 | |
|     * gui2 - The Graphical User Interface. GUI initialization happens in ``gui2.main`` and ``gui2.ui``. The ebook-viewer is in ``gui2.viewer``. The ebook editor is in ``gui2.tweak_book``.
 | |
| 
 | |
| If you want to locate the entry points for all the various calibre executables,
 | |
| look at the ``entry_points`` structure in `linux.py
 | |
| <https://github.com/kovidgoyal/calibre/blob/master/src/calibre/linux.py>`_.
 | |
| 
 | |
| If you need help understanding the code, post in the `development forum <http://www.mobileread.com/forums/forumdisplay.php?f=240>`_
 | |
| and you will most likely get help from one of calibre's many developers.
 | |
| 
 | |
| Getting the code
 | |
| ------------------
 | |
| 
 | |
| You can get the calibre source code in two ways, using a version control system or
 | |
| directly downloading a `tarball <https://calibre-ebook.com/dist/src>`_.
 | |
| 
 | |
| calibre uses `Git <http://www.git-scm.com/>`_, a distributed version control
 | |
| system. Git is available on all the platforms calibre supports.  After
 | |
| installing Git, you can get the calibre source code with the command::
 | |
| 
 | |
|     git clone git://github.com/kovidgoyal/calibre.git
 | |
| 
 | |
| On Windows you will need the complete path name, that will be something like :file:`C:\\Program Files\\Git\\git.exe`. 
 | |
| 
 | |
| calibre is a very large project with a very long source control history, so the
 | |
| above can take a while (10 mins to an hour depending on your internet speed).
 | |
| 
 | |
| If you want to get the code faster, the source code for the latest release is
 | |
| always available as an `archive <https://calibre-ebook.com/dist/src>`_.
 | |
| 
 | |
| To update a branch to the latest code, use the command::
 | |
| 
 | |
|     git pull --no-edit
 | |
| 
 | |
| Submitting your changes to be included
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| If you only plan to make a few small changes, you can make your changes and
 | |
| create a "merge directive" which you can then attach to a ticket in the calibre
 | |
| `bug tracker <https://bugs.launchpad.net/calibre>`_. To do this, make your
 | |
| changes, then run::
 | |
| 
 | |
|     git commit -am "Comment describing your changes"
 | |
|     git format-patch origin/master --stdout > my-changes
 | |
| 
 | |
| This will create a :file:`my-changes` file in the current directory,
 | |
| simply attach that to a ticket on the calibre `bug tracker <https://bugs.launchpad.net/calibre>`_.
 | |
| Note that this will include *all* the commits you have made. If you only want
 | |
| to send some commits, you have to change ``origin/master`` above. To send only
 | |
| the last commit, use::
 | |
| 
 | |
|     git format-patch HEAD~1 --stdout > my-changes
 | |
| 
 | |
| To send the last *n* commits, replace *1* with *n*, for example, for the last 3
 | |
| commits::
 | |
| 
 | |
|     git format-patch HEAD~3 --stdout > my-changes
 | |
| 
 | |
| Be careful to not include merges when using ``HEAD~n``.
 | |
| 
 | |
| If you plan to do a lot of development on calibre, then the best method is to create a
 | |
| `GitHub <https://github.com>`_ account. Below is a basic guide to setting up
 | |
| your own fork of calibre in a way that will allow you to submit pull requests
 | |
| for inclusion into the main calibre repository:
 | |
| 
 | |
|   * Setup git on your machine as described in this article: `Setup Git <https://help.github.com/articles/set-up-git>`_
 | |
|   * Setup ssh keys for authentication to GitHub, as described here: `Generating SSH keys <https://help.github.com/articles/generating-ssh-keys>`_
 | |
|   * Go to https://github.com/kovidgoyal/calibre and click the :guilabel:`Fork` button.
 | |
|   * In a Terminal do::
 | |
| 
 | |
|         git clone git@github.com:<username>/calibre.git
 | |
|         git remote add upstream https://github.com/kovidgoyal/calibre.git
 | |
| 
 | |
|     Replace <username> above with your github username. That will get your fork checked out locally.
 | |
|   * You can make changes and commit them whenever you like. When you are ready to have your work merged, do a::
 | |
| 
 | |
|         git push
 | |
| 
 | |
|     and go to ``https://github.com/<username>/calibre`` and click the :guilabel:`Pull Request` button to generate a pull request that can be merged.
 | |
|   * You can update your local copy with code from the main repo at any time by doing::
 | |
| 
 | |
|         git pull upstream
 | |
| 
 | |
| 
 | |
| You should also keep an eye on the calibre `development forum
 | |
| <http://www.mobileread.com/forums/forumdisplay.php?f=240>`_. Before making
 | |
| major changes, you should discuss them in the forum or contact Kovid directly
 | |
| (his email address is all over the source code).
 | |
| 
 | |
| Windows development environment
 | |
| ---------------------------------
 | |
| 
 | |
| .. note:: You must also get the calibre source code separately as described above.
 | |
| 
 | |
| Install calibre normally, using the Windows installer. Then open a Command Prompt and change to
 | |
| the previously checked out calibre code directory. For example::
 | |
| 
 | |
|     cd C:\Users\kovid\work\calibre
 | |
| 
 | |
| calibre is the directory that contains the src and resources sub-directories.
 | |
| 
 | |
| The next step is to set the environment variable ``CALIBRE_DEVELOP_FROM`` to the absolute path of the src directory.
 | |
| So, following the example above, it would be ``C:\Users\kovid\work\calibre\src``. `Here is a short
 | |
| guide <https://docs.python.org/2/using/windows.html#excursus-setting-environment-variables>`_ to setting environment
 | |
| variables on Windows.
 | |
| 
 | |
| Once you have set the environment variable, open a new command prompt and check that it was correctly set by using
 | |
| the command::
 | |
| 
 | |
|     echo %CALIBRE_DEVELOP_FROM%
 | |
| 
 | |
| Setting this environment variable means that calibre will now load all its Python code from the specified location.
 | |
| 
 | |
| That's it! You are now ready to start hacking on the calibre code. For example, open the file :file:`src\\calibre\\__init__.py`
 | |
| in your favorite editor and add the line::
 | |
| 
 | |
|     print ("Hello, world!")
 | |
| 
 | |
| near the top of the file. Now run the command :command:`calibredb`. The very first line of output should be ``Hello, world!``.
 | |
| 
 | |
| You can also setup a calibre development environment inside the free Microsoft
 | |
| Visual Studio, if you like, following the instructions `here <http://www.mobileread.com/forums/showthread.php?t=251201>`_.
 | |
| 
 | |
| OS X development environment
 | |
| ------------------------------
 | |
| 
 | |
| .. note:: You must also get the calibre source code separately as described above.
 | |
| 
 | |
| Install calibre normally using the provided .dmg. Then open a Terminal and change to
 | |
| the previously checked out calibre code directory, for example::
 | |
| 
 | |
|     cd /Users/kovid/work/calibre
 | |
| 
 | |
| calibre is the directory that contains the src and resources sub-directories. Ensure you have installed the calibre commandline tools via :guilabel:`Preferences->Advanced->Miscellaneous` in the calibre GUI.
 | |
| 
 | |
| The next step is to create a bash script that will set the environment variable ``CALIBRE_DEVELOP_FROM`` to the absolute path of the src directory when running calibre in debug mode.
 | |
| 
 | |
| Create a plain text file::
 | |
| 
 | |
|     #!/bin/sh
 | |
|     export CALIBRE_DEVELOP_FROM="/Users/kovid/work/calibre/src"
 | |
|     calibre-debug -g
 | |
| 
 | |
| Save this file as ``/usr/bin/calibre-develop``, then set its permissions so that it can be executed::
 | |
| 
 | |
|     chmod +x /usr/bin/calibre-develop
 | |
| 
 | |
| Once you have done this, run::
 | |
| 
 | |
|     calibre-develop
 | |
| 
 | |
| You should see some diagnostic information in the Terminal window as calibre
 | |
| starts up, and you should see an asterisk after the version number in the GUI
 | |
| window, indicating that you are running from source.
 | |
| 
 | |
| Linux development environment
 | |
| ------------------------------
 | |
| 
 | |
| .. note:: You must also get the calibre source code separately as described above.
 | |
| 
 | |
| calibre is primarily developed on Linux. You have two choices in setting up the development environment. You can install the
 | |
| calibre binary as normal and use that as a runtime environment to do your development. This approach is similar to that
 | |
| used in Windows and OS X. Alternatively, you can install calibre from source. Instructions for setting up a development
 | |
| environment from source are in the INSTALL file in the source tree. Here we will address using the binary as a runtime, which is the
 | |
| recommended method.
 | |
| 
 | |
| Install calibre using the binary installer. Then open a terminal and change to the previously checked out calibre code directory, for example::
 | |
| 
 | |
|     cd /home/kovid/work/calibre
 | |
| 
 | |
| calibre is the directory that contains the src and resources sub-directories.
 | |
| 
 | |
| The next step is to set the environment variable ``CALIBRE_DEVELOP_FROM`` to the absolute path of the src directory.
 | |
| So, following the example above, it would be ``/home/kovid/work/calibre/src``. How to set environment variables depends on
 | |
| your Linux distribution and what shell you are using.
 | |
| 
 | |
| Once you have set the environment variable, open a new terminal and check that it was correctly set by using
 | |
| the command::
 | |
| 
 | |
|     echo $CALIBRE_DEVELOP_FROM
 | |
| 
 | |
| Setting this environment variable means that calibre will now load all its Python code from the specified location.
 | |
| 
 | |
| That's it! You are now ready to start hacking on the calibre code. For example, open the file :file:`src/calibre/__init__.py`
 | |
| in your favorite editor and add the line::
 | |
| 
 | |
|     print ("Hello, world!")
 | |
| 
 | |
| near the top of the file. Now run the command :command:`calibredb`. The very first line of output should be ``Hello, world!``.
 | |
| 
 | |
| Having separate "normal" and "development" calibre installs on the same computer
 | |
| -----------------------------------------------------------------------------------------------------------------
 | |
| 
 | |
| The calibre source tree is very stable and rarely breaks, but if you feel the need to run from source on a separate
 | |
| test library and run the released calibre version with your everyday library, you can achieve this easily using
 | |
| .bat files or shell scripts to launch calibre. The example below shows how to do this on Windows using .bat files (the
 | |
| instructions for other platforms are the same, just use a shell script instead of a .bat file)
 | |
| 
 | |
| To launch the release version of calibre with your everyday library:
 | |
| 
 | |
| calibre-normal.bat::
 | |
| 
 | |
|     calibre.exe "--with-library=C:\path\to\everyday\library folder"
 | |
| 
 | |
| calibre-dev.bat::
 | |
| 
 | |
|     set CALIBRE_DEVELOP_FROM=C:\path\to\calibre\checkout\src
 | |
|     calibre.exe "--with-library=C:\path\to\test\library folder"
 | |
| 
 | |
| 
 | |
| Debugging tips
 | |
| ----------------
 | |
| 
 | |
| Python is a
 | |
| dynamically typed language with excellent facilities for introspection. Kovid wrote the core calibre code without once
 | |
| using a debugger. There are many strategies to debug calibre code:
 | |
| 
 | |
| Using print statements
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| This is Kovid's favorite way to debug. Simply insert print statements at points of interest and run your program in the
 | |
| terminal. For example, you can start the GUI from the terminal as::
 | |
| 
 | |
|     calibre-debug -g
 | |
| 
 | |
| Similarly, you can start the ebook-viewer as::
 | |
| 
 | |
|     calibre-debug -w /path/to/file/to/be/viewed
 | |
| 
 | |
| The ebook-editor can be started as::
 | |
| 
 | |
|     calibre-debug -t /path/to/be/edited
 | |
| 
 | |
| Using an interactive python interpreter
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| You can insert the following two lines of code to start an interactive python session at that point::
 | |
| 
 | |
|     from calibre import ipython
 | |
|     ipython(locals())
 | |
| 
 | |
| When running from the command line, this will start an interactive Python interpreter with access to all
 | |
| locally defined variables (variables in the local scope). The interactive prompt even has TAB completion
 | |
| for object properties and you can use the various Python facilities for introspection, such as
 | |
| :func:`dir`, :func:`type`, :func:`repr`, etc.
 | |
| 
 | |
| Using the python debugger as a remote debugger
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| You can use the builtin python debugger (pdb) as a remote debugger from the
 | |
| command line. First, start the remote debugger at the point in the calibre code
 | |
| you are interested in, like this::
 | |
| 
 | |
|     from calibre.rpdb import set_trace
 | |
|     set_trace()
 | |
| 
 | |
| Then run calibre, either as normal, or using one of the calibre-debug commands
 | |
| described in the previous section. Once the above point in the code is reached,
 | |
| calibre will freeze, waiting for the debugger to connect.
 | |
| 
 | |
| Now open a terminal or command prompt and use the following command to start
 | |
| the debugging session::
 | |
| 
 | |
|     calibre-debug -c "from calibre.rpdb import cli; cli()"
 | |
| 
 | |
| You can read about how to use the python debugger in the `python stdlib docs
 | |
| for the pdb module <https://docs.python.org/2/library/pdb.html#debugger-commands>`_.
 | |
| 
 | |
| .. note::
 | |
|     By default, the remote debugger will try to connect on port 4444. You can
 | |
|     change it, by passing the port parameter to both the set_trace() and the
 | |
|     cli() functions above, like this: ``set_trace(port=1234)`` and
 | |
|     ``cli(port=1234)``.
 | |
| 
 | |
| .. note:: 
 | |
|     The python debugger cannot handle multiple threads, so you have to
 | |
|     call set_trace once per thread, each time with a different port number.
 | |
| 
 | |
| Using the debugger in your favorite python IDE
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| It is possible to use the builtin debugger in your favorite python IDE, if it
 | |
| supports remote debugging. The first step is to add the calibre src checkout to
 | |
| the ``PYTHONPATH`` in your IDE. In other words, the directory you set as
 | |
| ``CALIBRE_DEVELOP_FROM`` above, must also be in the ``PYTHONPATH`` of your IDE.
 | |
| 
 | |
| Then place the IDE's remote debugger module into the :file:`src` subdirectory
 | |
| of the calibre source code checkout. Add whatever code is needed to launch the
 | |
| remote debugger to calibre at the point of interest, for example in the main
 | |
| function. Then run calibre as normal. Your IDE should now be able to connect to
 | |
| the remote debugger running inside calibre.
 | |
| 
 | |
| Executing arbitrary scripts in the calibre python environment
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| The :command:`calibre-debug` command provides a couple of handy switches to execute your own
 | |
| code, with access to the calibre modules::
 | |
| 
 | |
|     calibre-debug -c "some python code"
 | |
| 
 | |
| is great for testing a little snippet of code on the command line. It works in the same way as the -c switch to the python interpreter::
 | |
| 
 | |
|     calibre-debug myscript.py
 | |
| 
 | |
| can be used to execute your own Python script. It works in the same way as passing the script to the Python interpreter, except
 | |
| that the calibre environment is fully initialized, so you can use all the calibre code in your script. To use command line arguments with your script, use the form::
 | |
| 
 | |
|     calibre-debug myscript.py -- --option1 arg1
 | |
| 
 | |
| The ``--`` causes all subsequent arguments to be passed to your script.
 | |
| 
 | |
| 
 | |
| Using calibre in your projects
 | |
| ----------------------------------------
 | |
| 
 | |
| It is possible to directly use calibre functions/code in your Python project. Two ways exist to do this:
 | |
| 
 | |
| Binary install of calibre
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| If you have a binary install of calibre, you can use the Python interpreter bundled with calibre, like this::
 | |
| 
 | |
|     calibre-debug /path/to/your/python/script.py -- arguments to your script
 | |
| 
 | |
| Source install on Linux
 | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
 | |
| 
 | |
| In addition to using the above technique, if you do a source install on Linux,
 | |
| you can also directly import calibre, as follows::
 | |
| 
 | |
|     import init_calibre
 | |
|     import calibre
 | |
| 
 | |
|     print calibre.__version__
 | |
| 
 | |
| It is essential that you import the init_calibre module before any other calibre modules/packages as
 | |
| it sets up the interpreter to run calibre code.
 | |
| 
 | |
| API documentation for various parts of calibre
 | |
| ------------------------------------------------
 | |
| 
 | |
| .. toctree::
 | |
|     :maxdepth: 1
 | |
| 
 | |
|     news_recipe
 | |
|     plugins
 | |
|     db_api
 | |
|     polish
 | |
| 
 |