wiki:CompileError

Version 1 (modified by zooko, at 2012-07-09T19:14:09Z) (diff)

explain build process and compile failures

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

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 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's 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 just use that. 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 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 http://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. Then, if you don't have a compiler, you don't have the Python.h header file, or you don't have some other compile-time dependency of that library, the compile will fail and you'll get an error message like the ones above.