Installing Cylc 8 on old platforms and/or platforms without internet access

I faced a few challenges installing Cylc 8 on an old platform without internet access so I thought I’d share some notes on how I got around various problems.

The first problem is that this platform uses a very old glibc (2.11). The conda-forge compiler stack is currently using Centos 6 with glibc 2.12 (https://conda-forge.org/docs/user/announcements.html). Therefore we can’t use Conda to install Cylc.

Fortunately we can use a Conda environment with just Python installed and then install Cylc (& Rose) via pip (we only need the clients installed on this platform). Pip provides binary versions of libraries using Python wheels (https://pythonwheels.com/). This requires a compatible wheel being available. In order to work with glibc 2.11 this means using a “manylinux1” wheel: https://www.python.org/dev/peps/pep-0513/ - these are based on Centos 5 (glibc 2.5).

(Interesting discussion here - I’m not sure how much longer manylinux1 wheels will be available. Hopefully we’ll retire this platform before it becomes a problem.)

My other problem is that the platform doesn’t have internet access. Therefore, I wanted to be able to create the conda environment on my Linux desktop and then transfer it. However, by default, if I use pip on my desktop (RHEL 7) then I end up using more modern wheels (manylinux2010 or manylinux2014).
I found out how to prevent this (by creating a “_manylinux.py” file) after reading this post: https://stackoverflow.com/a/37636630

By ensuring that only manylinux1 wheels get used I hoped that I would have a conda environment which I could use on my old platform (after installing using conda pack). However, this didn’t work. Whilst most cylc commands worked fine, cylc scan would fail looking for GLIBC 2.14.

The command “ldd -v” can be used to check for any missing requirements in your shared libraries: https://unix.stackexchange.com/questions/458659/what-do-the-multiple-glibc-versions-mean-in-the-output-of-ldd
Using this I checked for any missing dependencies in my shared libraries by running the following command in my conda pack environment on the old platform:

find . -name '*.so' -type f | xargs ldd -v >/dev/null

This found one shared libary with a dependency on GLIBC 2.14:

/lib64/libc.so.6: version `GLIBC_2.14' not found (required by /.../cylc-8.0b1/lib/python3.8/site-packages/pyuv/_cpyuv.cpython-38-x86_64-linux-gnu.so)

This made sense because pyuv was one of the packages being installed by pip install from source rather than using a wheel. To get around this I found I could use pip download on my desktop, then pack the environment, install it on the old platform and then finally use pip install to install the downloaded packages. See https://stackoverflow.com/questions/36725843/installing-python-packages-without-internet-and-using-source-code-as-tar-gz-and

In summary, I now have a working installation on my old platform. Now that I’ve worked out the method it’s quite simple to perform. Hopefully this will help anyone facing similar issues with old platforms or platforms lacking internet access.

2 Likes