~~~~~~~~~~~~~~~~~~~~~~~~~
Managing BRLTTY with Stow
~~~~~~~~~~~~~~~~~~~~~~~~~
:Author: B Daix
:Date: 2003-09-10

.. include:: prologue.rst

Purpose
=======

BRLTTY is a critical software for those who rely on it to access their box.
Upgrading such a tool can't be done without paying some special attention.

What will be explained here is how to keep ``/usr/local/bin/brltty`` up to date
without removing old versions.  We decide to put BRLTTY in ``/usr/local`` as
we don't want to break filesystem root distribution (i.e. ``/bin/brltty``
should only come from a packaged version of BRLTTY for your distribution. If
you install software that adheres to this rule, you'd install it in
``/usr/local``). Also, we want not to have to keep source files to be able to
remove things cleanly. After installing a software, you shouldn't have to rely
on a by-software uninstallation suite.

You should install Stow to be able to run it and to find more details about it.
It's a common utility:

On Debian:
   ``apt-get install stow``

On Fedora:
   ``yum install stow``

Why Stow can help
=================

Stow manages files as if they were packaged by creating symlinks
to sets of files, each of which in its own directory, instead of directly copying them.

We recommend to attentively read Stow Info files, to realize what it can do,
how, and specially why it is so useful when you have to manage personally
compiled software you rely on.

The procedure
=============

So we want to run a BRLTTY version, taken from a set of personally compiled
ones, and safely keep all of them around. The current working release will be run
from the ``/usr/local`` root, while the files for all releases will be kept in a "safe
place" - the **Stow directory** (``/usr/local/stow/``). For example, releases
(bins/configs/libs/mans, not source trees) will be stored there like this:

*  ``/usr/local/stow/brltty-3.2/``
*  ``/usr/local/stow/brltty-3.3-with-api/``
*  ``/usr/local/stow/brltty-3.3/``
*  and so on

Compiling/installing BRLTTY for Stow file management
----------------------------------------------------

We have to use ``configure`` flags to indicate we want BRLTTY to be run
From ``/usr/local`` root, and installed in ``/usr/local/stow/brltty-3.2/``
root. Stow will do symlinks for us then. The distinction between execution root
and installation root is critical (c.f. Stow Info)::

   ./configure --with-execute-root=/usr/local \
               --with-install-root=/usr/local/stow/brltty-3.2

You may add whatever flags then, except those which change directories as we
already managed this.

Then, simply::

   make
   make install

The command::

   ls /usr/local/stow/brltty-3.2/

should show you all what would have been put in ``/usr/local`` if we haven't
managed files with Stow.

Reproduce this for each version you want to install, for example, we built a
brltty-3.3-with-api directory by applying above principles and adding dedicated
flag for enabling API to ``configure`` command line. We did the same for a
standard brltty-3.3 too, and so on, all stored in ``/usr/local/stow/``. As you
see, we cleanly separate things - one directory per version on one hand,
building vs. using on the other. Testing is now far lighter.

Managing safely kept versions with Stow
---------------------------------------

Before asking for Stow to create symlinks, we have to be sure we won't get any
conflicts, i.e. we haven't already asked for Stow to create symlinks on the
same software without removing them first, or we don't forget we have already
installed BRLTTY directly::

   ls /usr/local/{bin,sbin}

should be enough to see if we have to clean things up before going any further.
Note we'll see how to use Stow to remove created symlinks just after explaining
how to ask for it to create them (we hope you read from up to below...)::

   cd /usr/local/stow
   stow brltty-3.2

will create the symlinks, in parent directory. For example:

*  ``ln -s brltty-3.2/bin ../bin`` (if ``../bin`` didn't exist)
*  ``ln -s brltty-3.2/bin/brltty ../bin/brltty`` (otherwise)
*  and so on

Now, running ``/usr/local/bin/brltty`` will work perfectly, looking for its
config files in ``/usr/local/etc/brltty/`` and so on, even if it's all
symlinks - as if BRLTTY-3.2 was installed there.

When you want to switch to another version, you simply have to ask for Stow to
remove symlinks it created::

   cd /usr/local/stow/
   stow -D brltty-3.2 # if current release points to this version

and then::

   stow brltty-3.3-with-api

Doesn't it look powerful?!
