Packaging Finesse

Finesse is currently packaged for pip and conda. Finesse requires some system dependencies in addition to those defined in the setuptools configuration. See Requirements for building, running and developing Finesse for more information on Finesse dependencies.


We expect that conda packages will be the main way that users get hold of Finesse. The standard Anaconda channel does not contain all the packages we need. Instead we use Conda-Forge, which incidentally is also what IGWN as well as LIGO laboratory also uses to distribute and maintain their packages.

Conda-Forge packaging can be relatively straight forward however with the complicated Finesse compilation it can throw various issues. All the Conda-Forge package management happens on GitHub. When making a new package you have to work with the staging repository first to get the package initially made and signed off. Once that is done a “feedstock” is made. The main Finesse feedstock is also on Github. You must be made a maintainer to work with it and push new fixes.

The workflow with the feedstock is
  • Make a new release tag and push it to the Finesse

  • Push a new source to PyPi

  • The feedstock bot will see this sometime in the next day or so and a new pull-request will be made

  • Hopefully, this pull-request will just work and all the tests will pass

  • If new packages or build changes have been made the feedstock recipe/meta.yaml might need updating

  • If there are new package requirements this must be reflected in the meta.yaml file

It is very important you read the Conda-Forge packaging instructions first before doing much, as there are various ways things should be done. Overall the process isn’t too painful.

If a new PyPi package dependency is added to Finesse we must also ensure that the same package is available in Conda-Forge. It will not use PyPi as a dependency. For simple python packages you can use Grayskull to quickly make a conda package and get it approved.


Platform-specific wheels are built for most Linux platforms (so-called manylinux wheels) and macOS. This procedure is automated as part of the continuous integration pipeline, but it is quite simple. The Red Hat based Docker image manylinux2014 provided by PyPA is used. The only upstream dependency is currently suitesparse-devel which provides the KLU C headers used by Finesse’s simulation module.

Building for ‘manylinux’

The procedure for building a bdist_wheel for the manylinux target is:

$ yum install -y suitesparse-devel
$ pip wheel . --no-deps -w wheelhouse
$ auditwheel repair wheelhouse/*.whl

These commands should be run from the source code root on the Docker image. The /path/to/pip parts should be replaced by the path to pip corresponding to the Python version being targeted.

Building for Mac OSX

The procedure to make a wheel for OSX is similar. The wheel must of course be built using OSX, and SuiteSparse must be installed by some means other than yum (e.g. with brew install suite-sparse). The tool for delocalising the produced wheel is also not auditwheel, but rather delocate-wheel provided by delocate:

$ pip wheel . --no-deps -w wheelhouse
$ delocate-wheel wheelhouse/*.whl