PEP 513 gives guidelines on how to build broadly compatible Linux platform wheels for Python. The PEP names CentOS 5.11 as the reference OS on which a Python wheel must run if it is to earn the right to the manylinux1
name.
The surest way to get one’s binary package to run on CentOS 5.11 is to build it there. This post explains how I set up a CentOS 5.11 VirtualBox guest to build manylinux1
Python wheels.
PEP 513 offers a prebuilt Docker container of CentOS 5.11. If you’re on Linux and/or you’re familiar with Docker, that’s probably a better route than building a VM.
Note that I’m not at all a Linux expert. If I’ve done something foolish or incorrect, I’d like to hear about it in the comments. Please be nice. =)
Why CentOS 5.11?
CentOS has a few things going for it that make it a good choice —
- It’s free
- As a derivative of Red Hat Enterprise Linux, it’s a conservative distro, so the libraries on it are likely older than the libraries on contemporaneous distros.
- At the time PEP 513 was written, CentOS 5.11 was already over a year old. That increases the odds that other distros will have the libraries that it has.
It’s age is also a disadvantage, because at this stage the only updates CentOS 5 will receive are critical security updates and the CentOS team “recommends that you start moving workloads from CentOS 5 to CentOS Linux 6 or CentOS Linux 7”.
CentOS 5.11 Setup
Download the CentOS 5.11 ISO and install under VirtualBox. During the CentOS installation, I opted to disable SELinux. Since I only use this installation for builds and not as a server or daily desktop, I don’t feel the need for high security.
Once CentOS is installed, let the updater download and install its patches.
Next, you’ll want to install VirtualBox guest additions to make the guest OS easier to use. In order to do that, you first have to add yourself to the sudoers
file.
Add Yourself to sudoers
Open a terminal and enter the following commands —
su -
vim /etc/sudoers
- At the end of the file, add this line:
your_username ALL=(ALL) ALL
- Save the file with
:wq!
- Type
exit
to exit thesu -
shell.
Now you should be able to run commands with sudo.
Build the VirtualBox Guest Additions
- Install GCC:
sudo yum install gcc gcc-c++
- Insert the Guest Additions CD.
- Start a terminal and
cd /media/VBOXADDITIONS_xxxx
. Note that the exact name of theVBOXADDITIONS
directory changes with each each version of VirtualBox. sudo ./VBoxLinuxAdditions.run
- Eject the Guest Additions CD and reboot.
Add Packages
Install the things you’ll need to build Python, and to use pip —
sudo yum install xz zlib zlib-devel openssl-devel pcre-devel sqlite-devel
Build Python
CentOS 5.11 comes with Python 2.4. You will undoubtedly want a newer Python, so download and untar the source code for the Python you want to use and then build it. I built Python 2.7.11 with these steps —
sudo ./configure --enable-unicode=ucs4 sudo make altinstall
It’s important to use UCS4 (as opposed to the default UCS2) during the configure step to increase your odds of being compatible with the Pythons built for other Linux distros.
make altinstall
tells Python to install itself in such a way that it doesn’t interfere with the default (system) Python.
Once my Python was built, I added a symlink to make it the default Python in my shell —
sudo ln -s /usr/local/bin/python2.7 /usr/local/bin/python
At this point, if you start a new terminal and type python
, you should
get Python 2.7.11.
Download and Install pip
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py
This also installs setuptools and wheel, both of which we need.
Fix pip
At this point, pip will malfunction as described in issue 1918. The fix is not difficult.
Use sudo vim to edit these 3 scripts —
/usr/local/bin/pip
/usr/local/bin/pip2
/usr/local/bin/pip2.7
In each, change the first line from this —
#!/usr/bin/python
to this —
#!/usr/local/bin/python
Enjoy, and Build Some Wheels!
You’re done! Go build some great wheels!