# PyPy on Windows

PyPy is supported on Windows platforms, starting with Windows 2000. The following text gives some hints about how to translate the PyPy interpreter.

To build pypy-c you need a C compiler. Microsoft Visual Studio is preferred, but can also use the mingw32 port of gcc.

## Translating PyPy with Visual Studio

We routinely test the RPython translation toolchain using Visual Studio 2008, Express Edition. Other configurations may work as well.

The translation scripts will set up the appropriate environment variables for the compiler, so you do not need to run vcvars before translation. They will attempt to locate the same compiler version that was used to build the Python interpreter doing the translation. Failing that, they will pick the most recent Visual Studio compiler they can find. In addition, the target architecture (32 bits, 64 bits) is automatically selected. A 32 bit build can only be built using a 32 bit Python and vice versa. By default pypy is built using the Multi-threaded DLL (/MD) runtime environment.

Note: PyPy is currently not supported for 64 bit Windows, and translation will fail in this case.

The compiler is all you need to build pypy-c, but it will miss some modules that relies on third-party libraries. See below how to get and build them.

## Preping Windows for the Large Build

Normally 32bit programs are limited to 2GB of memory on Windows. It is possible to raise this limit, to 3GB on Windows 32bit, and almost 4GB on Windows 64bit.

On Windows 32bit, it is necessary to modify the system: follow http://usa.autodesk.com/adsk/servlet/ps/dl/item?siteID=123112&id=9583842&linkID=9240617 to enable the "3GB" feature, and reboot. This step is not necessary on Windows 64bit.

Then you need to execute:

editbin /largeaddressaware pypy.exe


on the pypy.exe file you compiled.

## Installing external packages

On Windows, there is no standard place where to download, build and install third-party libraries. We recommend installing them in the parent directory of the pypy checkout. For example, if you installed pypy in d:\pypy\trunk\ (This directory contains a README file), the base directory is d:\pypy. You must then set the INCLUDE, LIB and PATH (for DLLs) environment variables appropriately.

### Abridged method (for -Ojit builds using Visual Studio 2008)

set PATH=<base_dir>\bin;%PATH%
set INCLUDE=<base_dir>\include;%INCLUDE%
set LIB=<base_dir>\lib;%LIB%


### The Boehm garbage collector

This library is needed if you plan to use the --gc=boehm translation option (this is the default at some optimization levels like -O1, but unneeded for high-performance translations like -O2). You may get it at http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz

Versions 7.0 and 7.1 are known to work; the 6.x series won't work with pypy. Unpack this folder in the base directory. Then open a command prompt:

cd gc-7.1
copy Release\gc.dll <somewhere in the PATH>


### The zlib compression library

cd zlib-1.2.3
nmake -f win32\Makefile.msc
copy zlib1.dll <somewhere in the PATH>\zlib.dll


### The bz2 compression library

cd bzip2-1.0.5
nmake -f makefile.msc


### The sqlite3 database library

Download http://www.sqlite.org/2013/sqlite-amalgamation-3071601.zip and extract it into a directory under the base directory. Also get http://www.sqlite.org/2013/sqlite-dll-win32-x86-3071601.zip and extract the dll into the bin directory, and the sqlite3.def into the sources directory. Now build the import library so cffi can use the header and dll:

lib /DEF:sqlite3.def" /OUT:sqlite3.lib"
copy sqlite3.lib path\to\libs


### The expat XML parser

Download the source code of expat on sourceforge: http://sourceforge.net/projects/expat/ and extract it in the base directory. Version 2.1.0 is known to pass tests. Then open the project file expat.dsw with Visual Studio; follow the instruction for converting the project files, switch to the "Release" configuration, reconfigure the runtime for Multi-threaded DLL (/MD) and build the solution (the expat project is actually enough for pypy).

Then, copy the file win32\bin\release\libexpat.dll somewhere in your PATH.

### The OpenSSL library

OpenSSL needs a Perl interpreter to configure its makefile. You may use the one distributed by ActiveState, or the one from cygwin. In both case the perl interpreter must be found on the PATH.

Get http://www.openssl.org/source/openssl-0.9.8k.tar.gz and extract it in the base directory. Then compile:

perl Configure VC-WIN32
ms\do_ms.bat
nmake -f ms\nt.mak install


## Using the mingw compiler

You can compile pypy with the mingw compiler, using the --cc=mingw32 option; gcc.exe must be on the PATH. If the -cc flag does not begin with "ming", it should be the name of a valid gcc-derivative compiler, i.e. x86_64-w64-mingw32-gcc for the 64 bit compiler creating a 64 bit target.

You probably want to set the CPATH, LIBRARY_PATH, and PATH environment variable to the header files, lib or dlls, and dlls respectively of the locally installed packages if they are not in the mingw directory heirarchy.

### libffi for the mingw compiler

To enable the _rawffi (and ctypes) module, you need to compile a mingw version of libffi. Here is one way to do this, wich should allow you to try to build for win64 or win32:

1. Download and unzip a mingw32 build_ or mingw64 build, say into c:mingw

2. If you do not use cygwin, you will need msys to provide make, autoconf tools and other goodies.

2. Edit the c:msysetcfstab file to mount c:mingw
3. Download and unzip the libffi source files, and extract them in the base directory.

4. Run c:msysmsys.bat or a cygwin shell which should make you feel better since it is a shell prompt with shell tools.

5. From inside the shell, cd to the libffi directory and do:

sh ./configure
make
cp .libs/libffi-5.dll <somewhere on the PATH>


If you can't find the dll, and the libtool issued a warning about "undefined symbols not allowed", you will need to edit the libffi Makefile in the toplevel directory. Add the flag -no-undefined to the definition of libffi_la_LDFLAGS

If you wish to experiment with win64, you must run configure with flags:

sh ./configure --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32