wiki:CompileError

Version 8 (modified by davidsarah, at 2013-01-16T21:15:18Z) (diff)

trivial correction (Tahoe-LAFS also uses pure-Python libraries that don't need to be mentioned)

See also wiki:Installation for pre-built packages for your operating system, wiki:FAQ for Frequently Asked Questions, and quickstart for how to run Tahoe-LAFS from source.

The Symptoms

Sometimes running python setup.py build results in an error message about a compile failure. This page will tell you how to get past that problem.

A typical error message when building is:

distutils.errors.DistutilsError: Setup script exited with error: Unable to find vcvarsall.bat

That's on Windows. On Linux a typical error message is:

error: Python.h: No such file or directory

Why This Happens

To decide what to do about this, you have to understand that the Tahoe-LAFS software itself is written in 100% pure Python and never gets compiled. However, Tahoe-LAFS uses several libraries which themselves contain native C or C++ code that needs to be compiled. Currently there are six such libraries that Tahoe-LAFS uses: Twisted, pyOpenSSL, pycrypto, pycryptopp, zfec, and zope.interface.

To understand why the compile failure happens and how to get past it, you have to understand that python setup.py build tries three different methods of satisfying Tahoe-LAFS' need for its libraries, and only if all three methods fail does it emit an error message like this.

  1. First, if a suitable version of the library is already installed in your system, then Tahoe-LAFS will use it. So for example if the compile failure is happening because it can't compile Twisted, and if you were to install Twisted into your operating system — such as by running sudo apt-get install python-twisted on Debian, or by downloading and running the MSI installer for Twisted from http://twistedmatrix.com/trac/ on Windows — then the compile failure would stop happening, because it would no longer attempt to compile Twisted, because it would use the installed Twisted on your system instead.
  1. Second, if a "Python egg" of the library for your platform and your version of Python is available from the library's page on http://pypi.python.org or from the collection of eggs hosted on https://tahoe-lafs.org, it will download and use that. In that case it will not attempt to compile the library at all. It will instead use the precompiled "egg" package of that library.
  1. Third, only if both of the two methods above failed then it downloads the source code of the library and tries to compile it. If you have a working compiler and all the needed header files then the compilation will succeed.

Only if all three of the above attempts fail will it emit an error message like the ones above and then stop the build.

What To Do

If you get an error message like this, then please look at the collection of eggs hosted on https://tahoe-lafs.org, look at the table for the version of Python you are using, and then look in the row of that table for your platform. To see what version of Python you are using, run python -V. To see what platform you are using, run python -c 'import distutils.util;print distutils.util.get_platform()'.

If there are any blank cells in your row of the table, then that's your problem. The problem is that one of those dependencies is not available in precompiled binary form. To get this fixed, please send an email to the tahoe-dev mailing list requesting that someone who has your platform build a precompiled binary of that dependency for you.

For Tahoe-LAFS developers and packagers

See also wiki:Packaging, wiki:OSPackages, wiki:Manual, and wiki:NewbieDeveloperSetup