Another Python/Mercurial/mod_wsgi on CentOS HOWTO – 1/2

This is how I got Mercurial up and running on CentOS 5.5 x64. The goal here was to deploy this as a “central” repository Mercurial server so the dev team can push their updates to this box.

For this build I used:

Python 2.7.2
PyPi Setup Tools 0.6c11
mod_wsgi 3.3
Docutils 0.8.1
Mercurial 1.9.3

First off download all of the files listed above to /usr/local/src:

cd /usr/local/src
tar zxf Python-2.7.2.tgz
tar zxf sqlite-autoconf-3070800.tar.gz
tar zxf mod_wsgi-3.3.tar.gz
tar zxf docutils-0.8.1.tar.gz
tar zxf mercurial-1.9.3.tar.gz

Install Dependencies
There are a few dependencies we’ll need, some might already be installed:

yum -y install gcc gdbm-devel readline-devel ncurses-devel zlib-devel bzip2-devel sqlite-devel db4-devel openssl-devel tk-devel bluez-libs-devel make

Build and install SQLite3:

cd sqlite-autoconf-3070800
make install
cd ..

CentOS 5.5 ships with Python 2.4 which is fine for Mercurial but I wanted to use Python 2.7 for some other stuff as well. This explains how to install Python 2.7 side by side with 2.4 (which would be a real bugger to evict from your system due to the huge number of dependencies there are – yum for example).

I installed Python 2.7 into /opt/python2.7.2, to do this:

cd Python-2.7.2
./configure --prefix=/opt/python2.7.2 --with-threads --enable-shared
make install
cd ..

When you execute make it’s possible you’ll get this message:

Python build finished, but the necessary bits to build these modules were not found:
bsddb185 dl imageop

Don’t worry, Python was built successfully, it just means these modules aren’t supported. For our purposes it won’t break anything not to have these modules, they are either deprecated or not relevant.

Next we need to tell ld where to find our Python 2.7 shared libraries:

touch /etc/
echo "/opt/python2.7.2/lib/" >> /etc/

Then we create a link to Python 2.7 in /usr/bin and fix up our bash profile to use 2.7:

ln -sf /opt/python2.7.2/bin/python /usr/bin/python2.7
echo "alias python=/opt/python2.7.2/bin/python" >> ~/.bash_profile
echo "alias python2.7=/opt/python2.7.2/bin/python" >> ~/.bash_profile
echo "PATH=$PATH:/opt/python2.7.2/bin" >> ~/.bash_profile
source ~/.bash_profile

If all is well you should see the following when you launch python:

Python 2.7.2 (default, Oct 21 2011, 10:46:56)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Press Ctrl+D to exit back to bash.

PyPi, pip, virtualenv (optional)
Although not strictly necessary I also installed these to flesh out my Python dev environment:

cd /usr/local/src
sh setuptools-0.6c11-py2.7.egg --prefix=/opt/python2.7.2
/opt/python2.7.2/bin/easy_install pip
ln -sf /opt/python2.7.2/bin/pip /usr/bin/pip
pip install virtualenv
ln -sf /opt/python2.7.2/bin/virtualenv /usr/bin/virtualenv

Mercurial requires Docutils. When installed this for the first time I had to explicitly call python 2.7 to ensure that Docutils was installed to /opt/python2.7 and not the default Python 2.4 install (that said it’s no big deal if it does also end up being installed there):

cd docutils-0.8.1
python2.7 install
cd ..

Drop into the mercuria source directory:

cd mercurial-1.9.3

Build and install Mercurial:

make PYTHON=/opt/python2.7.2/bin/python PREFIX=/opt/python2.7.2 all
make PYTHON=/opt/python2.7.2/bin/python PREFIX=/opt/python2.7.2 install
cd ..

Pay particular attention to the PYTHON=/opt/python2.7.2/bin/python and PREFIX=/opt/python2.7.2 arguments, these ensure that mercurial is built using our Python 2.7 install and gets installed in the correct site-packages folder.

Enter hg version and hit return, if all is good you should see:

Mercurial Distributed SCM (version 1.9.3)
(see for more information)

Copyright (C) 2005-2011 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO

To build mod_wsgi you need to ensure that the httpd-devel package is installed, I’m assuming you already have apache installed, so go ahead and do that now:

yum install httpd-devel

Next we do the build, and be sure to configure for Python 2.7:

cd mod_wsgi-3.3
./configure --with-python=/opt/python2.7.2/bin/python
make install

If all is good then you’ll find in your apache modules folder:

$ ll /usr/lib/httpd/modules/
-rwxr-xr-x 1 root root 303801 Oct 21 12:12 /usr/lib/httpd/modules/

Continued in Part #2…

This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *