# Installation On MacOS X

If you are using MacOS X, mod_wsgi can be compiled from source code against the standard versions of Python and Apache httpd server supplied with the operating system. To do this though you will first need to have installed the Xcode command line tools.

The Xcode command line tools package provides a C compiler, along with header files and support tools for the Apache httpd server. If you have already set up your system so as to be able to install additional Python packages which include C extensions, you likely will already have the Xcode command line tools.

## Install Xcode command line tools

To install the Xcode command line tools you should run the command:

    xcode-select --install

If this gives you back the error message:

    xcode-select: error: command line tools are already installed, use "Software Update" to install updates

then the tools have already been installed. As noted by the warning message, do make sure you have run a system software update to ensure that you have the latest versions of these tools.

If you do not already have the Xcode command line tools installed, running that `xcode-select` command should result in you being prompted to install them. This may ask you to provide the details of an administrator account along with the password for that account.

Note that it is not necessary to install the whole of the Xcode developer application from the MacOS X App Store, only the command line tools using `xcode-select`. If you have installed the Xcode developer application, still ensure that the command line tools are installed and ensure you have run the system software update.

## Configuring and building mod_wsgi

If you are using the Python and Apache httpd server packages provided with the operating system, all you need to do to configure the mod_wsgi source code before building it is to run in the mod_wsgi source code directory:

    ./configure

This should yield output similar to:

    checking for apxs2... no
    checking for apxs... /usr/sbin/apxs
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking for prctl... no
    checking Apache version... 2.4.18
    checking for python... /usr/bin/python
    configure: creating ./config.status
    config.status: creating Makefile

The `configure` script should show that it has detected `apxs` as being located at `/usr/sbin/apxs` and `python` as being at `/usr/bin/python`.

If you get different values for `apxs` and `python` then it means that you likely have a separate installation of Python or the Apache httpd server installed on your system. If this is the case, to ensure that you use the versions of Python and Apache httpd server provided with the operating system instead use the command:

    ./configure --with-python=/usr/bin/python --with-apxs=/usr/sbin/apxs

Once you have configured the source code by running `configure`, you can build mod_wsgi using the command:

    make

This will compile the mod_wsgi source code and produce a single `mod_wsgi.so` file which then needs to be installed into a common location so that the Apache httpd server can use it.

## Installing the mod_wsgi module

What you need to do to install the mod_wsgi module depends on which version of MacOS X you are using.

For the Apache httpd server provided by the operating system, the directory `/usr/libexec/apache2` is used to store the compiled modules. Prior to MacOS X El Capitan (10.11) this directory was writable and the mod_wsgi module could be installed here along with all the default modules. With the introduction of the System Integrity Protection (SIP) feature in MacOS X El Capitan this directory is not writable, not even to the root user.

Because of this, if you are using a version of MacOS X prior to MacOS X El Capitan (10.11) you can use the command:

    sudo make install

to install the mod_wsgi module. As `sudo` is being run, you will be prompted for your password. The module will be installed into the directory `/usr/libexec/apache2`. Within the Apache httpd server configuration file you can then use the standard `LoadModule` line of:

    LoadModule wsgi_module libexec/apache2/mod_wsgi.so

If however you are using MacOS X El Capitan (10.11) or later, the mod_wsgi module will need to be installed into a different location. If you don’t and try to run just `sudo make install`, it will fail with the output:

    ./apxs -i -S LIBEXECDIR=/usr/libexec/apache2 -n 'mod_wsgi' src/server/mod_wsgi.la
    /usr/share/httpd/build/instdso.sh SH_LIBTOOL='./libtool' src/server/mod_wsgi.la /usr/libexec/apache2
    ./libtool --mode=install install src/server/mod_wsgi.la /usr/libexec/apache2/
    libtool: install: install src/server/.libs/mod_wsgi.so /usr/libexec/apache2/mod_wsgi.so
    install: /usr/libexec/apache2/mod_wsgi.so: Operation not permitted
    apxs:Error: Command failed with rc=4653056
    .
    make: *** [install] Error 1

The directory you use to install the mod_wsgi module is up to you, but one suggested option is that you use the directory `/usr/local/httpd/modules`. Just ensure that this isn’t already used by a separate installation of the Apache httpd server.

To install the mod_wsgi module into this directory use the command:

    sudo make install LIBEXECDIR=/usr/local/httpd/modules

The output from the command will be similar to:

    mkdir -p /usr/local/httpd/modules
    ./apxs -i -S LIBEXECDIR=/usr/local/httpd/modules -n 'mod_wsgi' src/server/mod_wsgi.la
    /usr/share/httpd/build/instdso.sh SH_LIBTOOL='./libtool' src/server/mod_wsgi.la /usr/local/httpd/modules
    ./libtool --mode=install install src/server/mod_wsgi.la /usr/local/httpd/modules/
    libtool: install: install src/server/.libs/mod_wsgi.so /usr/local/httpd/modules/mod_wsgi.so
    libtool: install: install src/server/.libs/mod_wsgi.lai /usr/local/httpd/modules/mod_wsgi.la
    libtool: install: install src/server/.libs/mod_wsgi.a /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: chmod 644 /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: ranlib /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: warning: remember to run `libtool --finish /usr/libexec/apache2'
    chmod 755 /usr/local/httpd/modules/mod_wsgi.so

The warning about needing to run `libtool --finish` can be ignored as it is not required for everything to work.

With the mod_wsgi module installed in this location, the `LoadModule` line in the Apache httpd configuration file should be:

    LoadModule wsgi_module /usr/local/httpd/modules/mod_wsgi.so

Normal steps to then configure the Apache httpd server and mod_wsgi for your specific WSGI application would then be followed.