pypy / wxpython-cffi

Experiment in getting SIP to emit cffi code
1 stars 0 forks source link

wxPythoncffi is a fork of wxPython Phoenix to use cffi instead of the Python C api. The motivation for this fork is to create a version of wxPython that is more friendly to PyPy_, an alternative implementation of a python interpreter. The fork is not finished yet, so YMMV.

To get started:

  1. Clone the repository, also download sources for wxWidgets. You may need to tell build.py where this is, do export WXWIN=$(pwd)/../wxWidgets-2.9.5 CD into the toplevel wxPython directory, where the build.py script lives. On windows, you will need to have cygwin 32bit installed in c:\cygwin.

  2. Since the etg scripts need the wxWidget documentation, make sure ./build.py dox completes cleanly. See the following documentation or wxPython mailing lists if this does not work for you.

  3. Make sure you have the wxWidgets code built in build/wxbld by running ./build.py build_wx.

  4. Run the etg scripts: ./build.py etg --generator=cffi --nodoc (--nodoc may not be necessary for you, but I never got the sphinx generator to work, even on a clean upstream copy.)

  5. Run the generator: ./build.py cffi_gen

The bindings are output to cffi/wx, so you need to add the cffi directory to you PYTHONPATH before you can import the bindings. Only the main module works at the moment and it is missing a lot of functionality.

If you are interested in helping out, the place to start is with converting ETG scripts. Some background information about the ETG script and the general structure of the project can be found on the wxPython Phoenix wiki, linked below. You can find more information about this in the cffi/etg.rst file.

After updating sources from version control, you may need to run ./build.py touch before again running steps 4 and 5. This can be combined into ./build.py touch etg --generator=cffi --nodoc cffi_gen

.. _cffi: http://cffi.readthedocs.org .. _pypy: http://www.pypy.org

The original README follows:

========================= wxPython Project Phoenix

Welcome to wxPython's Project Phoenix! This project is a new implementation of wxPython focused on improving speed, maintainability and extensibility. Just like "Classic" wxPython it wraps the wxWidgets C++ toolkit and provides access to the user interface portions of the wx API, enabling Python applications to have a GUI on Windows, Macs or Unix systems with a native look and feel and requiring very little (if any) platform specific code.

See http://wiki.wxpython.org/ProjectPhoenix for more information about this project and information about how you can help out.

.. contents:: Contents

How to build Phoenix

All aspects of the Phoenix build are managed through a series of commands provided by the build.py script. There is also a setup.py script available for those who are used to the standard distutils or setuptools types of builds. The setup.py script assumes that all of the code generation steps have already been performed, and so it is suitable for use when building from a source snapshot tarball or when using easy_install or pip. The seup.py script will delegate to build.py for the actual build, and build.py will delegate to setup.py when doing setuptoolsy things like performing an install or building an egg.

Using the build.py script allows for greater control over the build process than setup.py does, including commands for performing the various code-generation steps. So developers working on Phoenix itself or building from a Subversion checkout, instead of just building it from a source snapshot, should be using the build.py script. Build.py provides a fairly simple command-line interface consisting of commands and options. To see the full list run python build.py --help. The most important commands are listed below.

If you just want to do a standard setuptools-style build using setup.py and using a full source tarball, then you can stop reading at this point. If you want to build from a source repository checkout, or need to make changes and/or to regenerate some of the generated source files, then please continue reading.

Since build.py will, by default, build both wxWidgets and Phoenix you should have both source trees checked out from Subverison (or one of the git mirrors at github). I find that it works best when the two source trees are siblings within the same parent folder, but other configurations can work too. If you would rather use an already built and installed wxWidgets then that is possible as well by changing some options, see python build.py --help for details. However be aware that doing so will require a wxWidgets that is very close to the same age as the Phoenix code, at least for the unreleased preview snapshots. In other words, the wxWidgets build should use code from the wxWidgets source repository within a few days of when the Phoenix code was checked out.

On the other hand, it is probably best to just let Phoenix build and bundle wxWidgets. The build tools will by default build wxWidgets in a way that allows it to be bundled with the wxPython extension modules as part of the wxPython package, meaning it can peacefully coexist with any wxWidgets libraries you may already have installed. This bundling of the wx shared libraries works on Windows, OSX and Linux, and probably any other unix-like system using shared libraries based on the ELF standard. The libraries are built in such a way that they are relocatable, meaning that they do not have to be in a fixed location on the filesystem in order to be found by the wxPython extension modules. This also means that you can do things like use easy_install to install an egg in one or more virtual environments, move the wx package to a versioned folder, or even move it into your own project if desired, all without needing to rebuild the binaries. (Assuming that compatible Pythons are being used of course.)

The build phase of the build.py script will copy the results into the wx folder in the Phoenix source tree. This will allow you to run and test Phoenix directly from the source tree without installing it, if desired. You just need to set PYTHONPATH appropriately, or you can use python setup.py develop to install an .egg-link file in your current Python site-packages folder that will point to the folder where you built Phoenix. When you are finished testing you can then use the install or one of the bdist commands like you normally would for other Python packages.

Important build.py commands

The following commands are required to be able to build Phoenix from scratch. In other words, from a pristine source tree with none of the generated code present yet. They can be run individually or you can specify all of them on a single command line, in the order given. Once a command has succeded in one run of build.py there is no need to run that command again in a later run, unless you've changed something which that command has the responsibility to process.

Some other useful commands and options are:

Please see the output of python build.py --help for information about commands and options not mentioned here. And, as always, if there is any discrepancy between this document and the source code in the build.py script, then the source code is right. ;-)

The build.py script will download doxygen, sip and waf for your platform as needed if they are not already in your Phoenix/bin folder. If prebuilt versions of these tools are not available for your platform then build.py will bail out with an error message. To continue with the build you will need to acquire copies of the tool that will work on your platform and can then tell build.py where to find it using an environment variable, as described in the error message.

Project directory structure

There are a lot of subfolders in this directory, here is a brief explanation to help a newbie find their way around.

Naming of files

To help keep things a little easier when looking for things that need to be worked on, the file names in the Phoenix project will mirror the names of the files in the wxWidgets interface headers folder. For example, if there is a interface/wx/FOO.h and we are processing the XML produced for that file then the ETG script for the classes and other items will be named etg/FOO.py and it will produce sip/gen/FOO.sip, unit tests will be in unittests/test_FOO.py, and so on.

In most cases more than one ETG/SIP file will be used to create a single Python extension module. In those cases there will be one ETG script used to bring all the others together into the single extension module (by using the back-end generator's include feature for example.) The names of those scripts will have a leading underscore, such as etg/_core.py, and all the scripts that are intended to be included in that extension module should specify that name in their MODULE variable.

Prerequisites

TBW