123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- .. _python:
- ===========================
- Python and the Build System
- ===========================
- The Python programming language is used significantly in the build
- system. If we need to write code for the build system or for a tool
- related to the build system, Python is typically the first choice.
- Python Requirements
- ===================
- The tree requires Python 2.7.3 or greater but not Python 3 to build.
- All Python packages not in the Python distribution are included in the
- source tree. So all you should need is a vanilla Python install and you
- should be good to go.
- Only CPython (the Python distribution available from www.python.org) is
- supported.
- We require Python 2.7.3 (and not say 2.7.2) to build because Python
- 2.7.3 contains numerous bug fixes, especially around the area of Unicode
- handling. These bug fixes are extremely annoying and have to be worked
- around. The build maintainers were tired of doing this, so the minimum
- version requirement was upped (bug 870420).
- We intend to eventually support Python 3. This will come by way of dual
- 2.7/3.x compatibility because a single flag day conversion to 3.x will
- be too cumbersome given the amount of Python that would need converted.
- We will not know which 3.x minor release we are targeting until this
- effort is underway. This is tracked in bug 636155.
- Compiled Python Packages
- ========================
- There are some features of the build that rely on compiled Python packages
- (packages containing C source). These features are currently all
- optional because not every system contains the Python development
- headers required to build these extensions.
- We recommend you have the Python development headers installed (``mach
- bootstrap`` should do this for you) so you can take advantage of these
- features.
- Issues with OS X System Python
- ==============================
- The Python that ships with OS X has historically been littered with
- subtle bugs and suboptimalities. Furthermore, OS X up through 10.8 don't
- ship with Python 2.7.3 (10.8 ships with 2.7.2).
- OS X 10.8 and below users will be required to install a new Python
- distribution. This may not be necessary for OS X 10.9+. However, we
- still recommend installing a separate Python because of the history with
- OS X's system Python issues.
- We recommend installing Python through Homebrew or MacPorts. If you run
- ``mach bootstrap``, this should be done for you.
- Virtualenvs
- ===========
- The build system relies heavily on
- `virtualenvs <http://www.virtualenv.org/en/latest/>`_. Virtualenvs are
- standalone and isolated Python environments. The problem a virtualenv
- solves is that of dependencies across multiple Python components. If two
- components on a system relied on different versions of a package, there
- could be a conflict. Instead of managing multiple versions of a package
- simultaneously, Python and virtualenvs take the route that it is easier
- to just keep them separate so there is no potential for conflicts.
- Very early in the build process, a virtualenv is created inside the
- :term:`object directory`. The virtualenv is configured such that it can
- find all the Python packages in the source tree. The code for this lives
- in :py:mod:`mozbuild.virtualenv`.
- Deficiencies
- ------------
- There are numerous deficiencies with the way virtualenvs are handled in
- the build system.
- * mach reinvents the virtualenv.
- There is code in ``build/mach_bootstrap.py`` that configures ``sys.path``
- much the same way the virtualenv does. There are various bugs tracking
- this. However, no clear solution has yet been devised. It's not a huge
- problem and thus not a huge priority.
- * They aren't preserved across copies and packaging.
- If you attempt to copy an entire tree from one machine to another or
- from one directory to another, chances are the virtualenv will fall
- apart. It would be nice if we could preserve it somehow. Instead of
- actually solving portable virtualenvs, all we really need to solve is
- encapsulating the logic for populating the virtualenv along with all
- dependent files in the appropriate place.
- * .pyc files written to source directory.
- We rely heavily on ``.pth`` files in our virtualenv. A ``.pth`` file
- is a special file that contains a list of paths. Python will take the
- set of listed paths encountered in ``.pth`` files and add them to
- ``sys.path``.
- When Python compiles a ``.py`` file to bytecode, it writes out a
- ``.pyc`` file so it doesn't have to perform this compilation again.
- It puts these ``.pyc`` files alongside the ``.pyc`` file. Python
- provides very little control for determing where these ``.pyc`` files
- go, even in Python 3 (which offers customer importers).
- With ``.pth`` files pointing back to directories in the source tree
- and not the object directory, ``.pyc`` files are created in the source
- tree. This is bad because when Python imports a module, it first looks
- for a ``.pyc`` file before the ``.py`` file. If there is a ``.pyc``
- file but no ``.py`` file, it will happily import the module. This
- wreaks havoc during file moves, refactoring, etc.
- There are various proposals for fixing this. See bug 795995.
- Installing Python Manually
- ==========================
- We highly recommend you use your system's package manager or a
- well-supported 3rd party package manager to install Python for you. If
- these are not available to you, we recommend the following tools for
- installing Python:
- * `buildout.python <https://github.com/collective/buildout.python>`_
- * `pyenv <https://github.com/yyuu/pyenv>`_
- * An official installer from http://www.python.org.
- If all else fails, consider compiling Python from source manually. But this
- should be viewed as the least desirable option.
- Common Issues with Python
- =========================
- Upgrading your Python distribution breaks the virtualenv
- --------------------------------------------------------
- If you upgrade the Python distribution (e.g. install Python 2.7.5
- from 2.7.3, chances are parts of the virtualenv will break.
- This commonly manifests as a cryptic ``Cannot import XXX`` exception.
- More often than not, the module being imported contains binary/compiled
- components.
- If you upgrade or reinstall your Python distribution, we recommend
- clobbering your build.
- Packages installed at the system level conflict with build system's
- -------------------------------------------------------------------
- It is common for people to install Python packages using ``sudo`` (e.g.
- ``sudo pip install psutil``) or with the system's package manager
- (e.g. ``apt-get install python-mysql``.
- A problem with this is that packages installed at the system level may
- conflict with the package provided by the source tree. As of bug 907902
- and changeset f18eae7c3b27 (September 16, 2013), this should no longer
- be an issue since the virtualenv created as part of the build doesn't
- add the system's ``site-packages`` directory to ``sys.path``. However,
- poorly installed packages may still find a way to creep into the mix and
- interfere with our virtualenv.
- As a general principle, we recommend against using your system's package
- manager or using ``sudo`` to install Python packages. Instead, create
- virtualenvs and isolated Python environments for all of your Python
- projects.
- Python on $PATH is not appropriate
- ----------------------------------
- Tools like ``mach`` will look for Python by performing ``/usr/bin/env
- python`` or equivalent. Please be sure the appropriate Python 2.7.3+
- path is on $PATH. On OS X, this likely means you'll need to modify your
- shell's init script to put something ahead of ``/usr/bin``.
|