~~~~~~~~~~~~~~~~~
BRLTTY on Windows
~~~~~~~~~~~~~~~~~

.. include:: prologue.rst
.. _Cygwin's Web Site: http://www.cygwin.com/
.. _MinGW's Web Site: http://mingw.sourceforge.net/
.. _LibUSB-Win32's Web Site: http://libusb-win32.sourceforge.net/
.. _LibUSB-1.0's Web Site: http://www.libusb.org/wiki/windows_backend
.. _Cygwin Ports: http://cygwinports.org/
.. _Cygwin java-ecj jar: ftp://sourceware.org/pub/java/ecj-4.5.jar

Building BRLTTY
===============

System Requirements
-------------------

The earliest release of Windows that is supported by BRLTTY is Windows 98.

Pre-built versions of BRLTTY are available for download on
`BRLTTY's Web Site`_. Their names begin with ``brltty-win-``. Those with the
``.zip`` extension are archives, and those with the ``.exe`` extension are
installers.

In order to build BRLTTY yourself from a prepared source tarball, you'll need
Cygwin (see `Cygwin's Web Site`_) and/or MinGW (see `MinGW's Web Site`_).
You'll also need the following additional packages:

*  gcc
*  make
*  w32api (version 3.6 or later)

If you'd like to build BRLTTY from its source repository (rather than from one
of the prepared source tarballs) then you'll also need these packages:

*  autoconf
*  tcltk

If you'd like to prepare the documentation (by doing ``make`` within the
``Documents/`` subdirectory) then you'll need these packages:

*  linuxdoc-tools (not pre-packaged in Cygwin)
*  doxygen

If you're using MSYS (the MinGW command shell) for running ``configure`` and
``make``, you should always use Windows-like paths (e.g. ``c:/brltty``) rather
than MSYS paths (e.g. ``/c/brltty``) because BRLTTY does **not** understand
MSYS paths.

Windows 98 and ME Limitation
----------------------------

On Windows versions 2000, XP, 2003, and later, BRLTTY automatically accesses
the Windows console that you're currently using as you switch between them.
This isn't possible on earlier versions. One way to still achieve this
functionality, though, is to run one BRLTTY on the root window that directly
accesses your braille device, and another one on each console that indirectly
accesses your braille device via BrlAPI. This scheme may sound complicated,
but it can be set up to run automatically.

The first (or root) BRLTTY should be run as part of Windows startup. It must be
run with the options that are necessary for it to access your braille device,
e.g. ``-b`` (to specify the driver), ``-d`` (to specify the device), and
(maybe) ``-B`` (to specify driver-sspecific parameters). It must also be given
the ``-Xroot=yes`` option (which attaches it to the root window).

An additional BRLTTY must then be run for each new console. It should be
invoked like this::

   brltty -bba -N

The ``-bba`` option tells it to access the root BRLTTY via BrlAPI, and the
``-N`` option tells it not to start a BrlAPI server of its own.

These (non-root) BRLTTYs can be started automatically by, for example, invoking
them from your ``.bashrc`` script. Each of these BRLTTYs only reviews the
console it's running within, and connects, via BrlAPI, to the root BRLTTY in
order to access your braille device.

If you're not concerned with security, and would rather not fiddle with the
``brlapi.key`` file, then add the ``-Aauth=none`` option to the command line
that starts the root BRLTTY. You don't need to worry about unauthorized access
over the network since the default is that only locally running programs can
connect to BrlAPI.

Package Management via the Command Line
---------------------------------------

Managing Cygwin Packages
~~~~~~~~~~~~~~~~~~~~~~~~

A convenient way to manage Cygwin packages from the command line
is to use the ``apt-cyg`` command.
It's similar to the ``apt-get`` command which some Linux distributions use.

As of the time of this writing, this is how you can install it::

   svn --force export http://apt-cyg.googlecode.com/svn/trunk/ /usr/local/bin/
   chmod +x /usr/local/bin/apt-cyg

If you're using the 64-bit Cygwin platform, then, after installing apt-cyg,
you'll need to make a couple of simple modifications to it. Using your
favourite text editor, and remembering that the actual line numbers within your
version may differ from those shown below, edit ``/usr/local/bin/apt-cyg`` and
make the following changes:

1) On line 98, change ``$mirror/setup.bz2`` to ``$mirror/x86_64/setup.bz2``.

2) On line 105, change ``$mirror/setup.ini`` to ``$mirror/x86_64/setup.ini``.

To search for a package, you can do:

.. parsed-literal:: apt-cyg find *pattern*

To install a package, you can do:

.. parsed-literal:: apt-cyg install *name*

For full details, you can do:

.. parsed-literal:: apt-cyg help

Managing MinGW Packages
~~~~~~~~~~~~~~~~~~~~~~~

A convenient way to manage MinGW packages from the command line
is to use the ``mingw-get`` command.
Be sure to invoke it with arguments because
when invoked with no arguments its graphical interface is used.

To list all of the packages, you can do:

.. parsed-literal:: mingw-get list

To install a package, you can do:

.. parsed-literal:: mingw-get install *name*

For full details, you can do:

.. parsed-literal:: mingw-get -h

USB Support
-----------

USB devices are supported thanks to the ``LibUSB-Win32`` and the ``LibUSB-1.0``
packages. If both are installed, preferrence is given to ``LibUSB-1.0``.

Pre-built versions of BRLTTY have USB support compiled in, and the required
Windows drivers are also included, so you just need to let the installer set
them up.

In order to build BRLTTY yourself with USB support enabled, you'll need to
**first** install at least one of LibUSB-Win32 or LibUSB-1.0.

LibUSB-Win32
~~~~~~~~~~~~

At the time of this writing, LibUSB-Win32 binaries can be found on
`LibUSB-Win32's Web Site`_. They'll be named something like
``libusb-win32-bin-<version>.exe``, and should be available on
``http://sourceforge.net/project/showfiles.php?group_id=78138``.

*  On Cygwin:

   1) Install the ``libusb-win32`` package.

*  On MinGW:

   1) Unpack the archive somewhere.

   2) Symlink the header and library files into your MinGW
      installation::

         ln -s LibUSB-Win32/include/lusb0_usb.h /mingw/include/usb.h
         ln -s LibUSB-Win32/lib/gcc/libusb.a /mingw/lib/
         ln -s LibUSB-Win32/bin/x86/libusb0_x86.dll /mingw/bin/libusb0.dll

In order to be able to use the LibUSB-Win32 driver, you'll need to copy its
run-time files into BRLTTY's source tree::

   cp LibUSB-Win32/bin/x86/libusb0.sys brltty/hotplug/libusb0.sys
   cp LibUSB-Win32/bin/x86/libusb0_x86.dll brltty/hotplug/libusb0.dll
   cp LibUSB-Win32/bin/amd64/libusb0.sys brltty/hotplug/libusb0_x64.sys
   cp LibUSB-Win32/bin/amd64/libusb0.dll brltty/hotplug/libusb0_x64.dll

Then, either right-click on ``brltty/hotplug/brltty.inf`` and select
``install``, or, on braille device plug, point at the
``brltty/hotplug/brltty.inf`` file.

LibUSB-1.0
~~~~~~~~~~

As of the time of this writing, LibUSB-1.0 binary snapshots can be found on
`LibUSB-1.0's Web Site`_. They'll be named something like
``libusb_<date>.7z``.

*  On Cygwin:

   1) Install the ``libusb1.0-devel`` package.

*  On MinGW:

   1) Unpack the archive somewhere.

   2) Symlink the header and library files into your MinGW
      installation::

         ln -s LibUSB-1.0/include/libusbx-1.0 /mingw/include/libusb-1.0
         ln -s LibUSB-1.0/MinGW32/dll/libusb-1.0.dll.a /mingw/lib/
         ln -s LibUSB-1.0/MinGW32/dll/libusb-1.0.dll /mingw/bin/

   3) Copy the file ``libusb-1.0.pc`` in the ``Windows/`` subdirectory of
      BRLTTY's source tree into MinGW's ``/mingw/lib/pkgconfig/`` directory. If
      the ``pkgconfig/`` subdirectory doesn't already exist then create it.

In order to be able to use the LibUSB-1.0 driver, you'll need to either
right-click on ``brltty/hotplug/brltty-libusb-1.0.inf`` and select ``install``,
or, on braille device plug, point at the
``brltty/hotplug/brltty-libusb-1.0.inf`` file.

Configuring a BRLTTY Build
--------------------------

Some of BRLTTY's configure options are of particular interest to users of the 
Windows platform:

--enable-relocatable-install
   The default is for BRLTTY to refer to its components via absolute paths. On
   the Windows platform, however, the convention is for a package to use
   relative paths so that it's entirely self-contained. This enables it to be
   installed into an arbitrary directory, and to be moved around thereafter at
   well. This option builds BRLTTY such that relative paths are used.

Missing Java Class Definitions on Cygwin
----------------------------------------

You may get a Java failure that looks something like this::

   Exception in thread "main" java.lang.NoClassDefFoundError:
   org.eclipse.jdt.internal.compiler.batch.GCCMain
      at gnu.java.lang.MainThread.run(Unknown Source)
   Caused by: java.lang.ClassNotFoundException:
   org.eclipse.jdt.internal.compiler.batch.GCCMain
   not found in gnu.gcj.runtime.SystemClassLoader
   {urls=[], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}

This problem occurs when the ``java-ecj`` package isn't installed. It can be
obtained from `Cygwin Ports`_. You can also resolve the probem by downloading
the `Cygwin java-ecj jar`_, and installing it into ``/usr/share/java/ecj.jar``.

Using BRLTTY
============

Windows Scripts for Managing BRLTTY
-----------------------------------

These ``.bat`` scripts are in the top-level folder where BRLTTY has been installed.
They should be run by a user that has administrative privileges.

``run-brltty.bat``
~~~~~~~~~~~~~~~~~~

Manually run BRLTTY with a log level of ``info``.
Logs are written to the file ``brltty.log``
in the top-level folder where BRLTTY has been installed.
All arguments are passed through to BRLTTY.

``debug-brltty.bat``
~~~~~~~~~~~~~~~~~~~~

Manually run BRLTTY, via the ``run-brltty.bat`` script, with options that
set the log level to ``debug`` and enable several useful log categories.
All arguments are passed through to the ``run-brltty.bat`` script.

``kill-brltty.bat``
~~~~~~~~~~~~~~~~~~~

Forceably terminate the manually-run BRLTTY process.

``enable-brlapi.bat``
~~~~~~~~~~~~~~~~~~~~~~

Install the BrlAPI service and start it.

``disable-brlapi.bat``
~~~~~~~~~~~~~~~~~~~~~~~~

Stop the BrlAPI service and uninstall it.

Sticking to a Console
---------------------

It may be useful to have BRLTTY only review the console that it's started in,
i.e.  for it not to follow the keyboard focus. To achieve this, set the
``FollowFocus`` parameter of BRLTTY's ``Windows`` screen driver to ``no``. This
can be done:

On the Command Line:
   ``-Xwn:FollowFocus=no``

In ``brltty.conf``:
   ``screen-parameter wn:FollowFocus=no``

Sharing the Braille Device with Other Screen Readers
----------------------------------------------------

When you're not on a window that BRLTTY can handle, its default action is to
retain control of the braille device and to present a short message explaining
the problem. If you have another braille-capable screen reader and would like
it to take over instead, then both BRLTTY and that other screen reader must be
instructed to share the braille device.

BRLTTY can be instructed to share the braille device via its
``--release-device`` option (the short form of this option is ``-r``). When
this option is in effect, BRLTTY releases the braille device when you move onto
a window that it can't handle, and then tries to regain control of the braille
device when you move onto a window that it can handle. Note that these actions
take a noticeable amount of time so you should only use this option if it's
actually needed.

Sharing with JAWS
~~~~~~~~~~~~~~~~~

A common case wherein a JAWS user might want BRLTTY to be in control of the
braille device when on a console window is when using Cygwin.

There are two phases to configuring JAWS to run in the background while BRLTTY
controls the braille device. First, a usable window title must be established
and stable. Second, JAWS braille must be put to sleep.

.. topic:: What is a Window Title?

   Every window in Windows has a title bar that contains the name of the
   application that's running in it, as well as some controls to do things like
   move and resize the window. BRLTTY doesn't show this title bar.

   For a program window, JAWS uses the name of the program's executable as the
   name of the configuration files to load when that program gains focus. For a
   console application such as Cygwin, however, it uses the title of the window
   instead. You must, therefore, tell JAWS within the window title that this is
   a Cygwin window.

.. topic:: Setting the Window Title

   JAWS uses one of the words in the window title as the name of the
   configuration file set to load. This file set is what tells JAWS the
   specifics of how to handle the application. It is, therefore, where JAWS
   must be instructed to put its braille component to sleep.

   As of this writing, it appears that JAWS uses the following algorithm for
   choosing which word in the title to use as the name of the file set:

   1) If there are no slashes (``/``) or backslashes (``\``) in the title then
      JAWS uses the first word. Thus, if the title is ``Cygwin Bash Shell``
      then JAWS will load the ``Cygwin`` configuration file set.

   2) If there's at least one slash (``/``) or backslash (``\``) in the title
      then JAWS uses the last word. Thus, if the title is ``$PWD - Cygwin``
      then JAWS will similarly load the ``Cygwin`` configuration file set.

.. topic:: Setting Cygwin's Window Title

   First, it is imperative that you replace, or at least modify, the default
   ``PS1`` (primary shell prompt) setting. The default for this setting, as
   distributed by Cygwin, places ``$PWD`` (the path to the current working
   directory) in the window title, thus requiring you to have a separate JAWS
   configuration for every directory on the system! One possible way to resolve
   this "problem" is to uncomment the ``settitle`` function (which can be found
   near the end of ``.bashrc``). This function allows you to place a string of
   your own choice in the title. You can use this function, therefore, as
   follows::

      export PROMPT_COMMAND='settitle "$PWD - Cygwin"'
      export PS1='$ '

   The first of these lines causes the window title to be set just before each
   shell prompt. Since ``$PWD`` always contains at least one slash (``/``), the
   operative word in the title will be ``Cygwin`` (the last word), and JAWS,
   therefore, will load any ``Cygwin`` configuration files that it finds.

   The second of these lines sets the primary shell prompt to the customary
   dollar (``$``) sign. More importantly, though, it replaces Cygwin's default
   ``PS1`` setting which, because it contains escape sequences that overwrite
   the title with ``$PWD``, renders the window unrecognizable by JAWS.

.. topic:: Putting JAWS Braille to Sleep

   Now that a stable window title has been established, JAWS braille can
   finally be put to sleep. While in Cygwin, and with BRLTTY not running, do
   the following:

   1) Press Insert+F2 to bring up the ``Run JAWS Manager`` dialog.

   2) Down-Arrow to ``Configuration Manager``, and press Enter. Verify that the
      title on the top line contains ``Cygwin.jcf``.

   3) Press Alt+S for ``Set Options``.

   4) Press B for ``Braille``.

   5) Press S for ``Braille Sleep Mode``.

   6) Verify that the box is checked. It should look like ``<x>`` (rather than
      like ``< >``). Press Space to toggle the setting if the ``x`` isn't there.

   7) Press Enter to leave the menu.

   8) Press Control+S to save the file.

   9) Press Alt+F4 to exit the configuration manager.

.. topic:: Putting JAWS Speech to Sleep

   If you'd like to use JAWS speech in Windows, but not in Cygwin, you can do
   the following:

   1) Press Insert+F2 to bring up the ``Run JAWS Manager`` dialog.

   2) Down-Arrow to ``Configuration Manager`` and press Enter. Verify that the
      title on the top line contains ``Cygwin.jcf``.

   3) Press Alt+S for ``Set Options``.

   4) Press A for ``Advanced``.

   5) You should be on an item labelled ``Sleep Mode Enable`` with an empty
      check box (``< >``). Press Space to check it (``<x>``). 

   6) Press Enter to leave the menu.

   7) Press Control+S to save the file.

   8) Press Alt+F4 to exit the configuration manager.

.. topic:: Known Problem

   You'll always be able to switch to Cygwin, and BRLTTY (if it's running) will
   take control of the braille device automatically. Switching back to Windows
   and JAWS, however, may be problematic. The degree of success seems to depend
   on the type of braille device being used. It usually works properly.
   Sometimes, however, when using a USB device, the cable needs to be
   unplugged/replugged to allow JAWS to regain control. In extreme cases, you
   may need to exit BRLTTY before going to Windows.

MinGW Scripts for Building BRLTTY
=================================

The ``mkwin`` Script
--------------------

The ``mkwin`` script,
which can be found in the ``Windows/`` subdirectory of BRLTTY's source tree,
builds the Windows archive and installer for BRLTTY.

Software Components Required by ``mkwin``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Links to the pages where we found these
installers, components, and files are listed.
In case any of these links becomes out-of-date, however,
copies of some of them have been preserived at
`<http://BRLTTY.app/archive/Windows/>`_.

The following software components should already be installed:

*  ``MinGW`` [32-bit] (from `<http://mingw.org/>`_)

The following ``MinGW`` packages may still need to be installed:

*  ``msys-bison``
*  ``msys-dos2unix``
*  ``msys-groff``
*  ``msys-m4``
*  ``msys-tar``
*  ``msys-unzip``
*  ``msys-wget``
*  ``msys-zip``
*  ``mingw32-libpdcurses``
*  ``mingw32-pthreads-w32``
*  ``mingw32-tcl``

The following packages should also be installed:

*  ``AutoHotkey`` (from `<http://www.autohotkey.com/>`_)

   The ``mkwin`` script assumes that it has been installed in
   ``C:\Program Files (x86)\AutoHotkey``.
   The ``-A`` (AutoHotkey) option can be used to specify another location.
   The installer currently being used is named ``AutoHotkey104805_Install.exe``.

*  ``NSIS`` (from `<http://nsis.sourceforge.net/>`_)

   The ``mkwin`` script assumes that it has been installed in
   ``C:\Program Files (x86)\NSIS``.
   The ``-N`` (NSIS) option can be used to specify another location.
   The installer currently being used is named ``nsis-3.0b0-setup.exe``.

*  ``Python`` (from `<http://www.python.org/>`_)

   The 32-bit variants are required. Version 2 or 3 may be used. If the
   ``python`` command isn't in your command search path, or if you'd like to
   use a different version of ``Python``, then use the ``-P`` (Python) option
   to specify the top-level directory of the desired ``Python`` version.

*  ``Cython`` (from `<http://cython.org/>`_)

   A corresponding version of ``Cython`` must be installed for each version of
   ``Python``. Each ``Cython`` version is installed within the corresponding
   ``Python`` version's hierarchy. Install ``Cython`` with the command::

      pip install cython

   Some systems, either in addition to or in place of the ``pip`` command,
   have the ``pip2`` and/or the ``pip3`` command. As you might have guessed,
   ``pip2`` corresponds to ``Python2`` and ``pip3`` corresponds to ``Python3``.
   It's best to use the one with the most explicit version suffix.

   If the ``pip`` command isn't already included within  the version of
   ``Python`` that you're using (usually within its ``scripts`` subdirectory)
   then you can install it from `<https://pip.pypa.io/en/stable/installing/>`_.

   Copies of the files mentioned below are at
   `<http://BRLTTY.app/archive/Windows/Cython/>`_:

   +  To force use of MinGW's (rather than Microsoft's) C compiler,
      add ``distutils.cfg`` to the ``Python/lib/distutils/`` directory.
      It should contain these lines::

         [build]
         compiler = mingw32

   +  If you get a message like "Unknown MS Compiler version 1900"
      then you'll probably need to apply the patch ``patch1``
      (from `<https://bugs.python.org/file40608/patch.diff>`_)
      when within the ``Python/lib/distutils/`` directory::

         cd Python/lib/distutils
         patch patch1

   +  If you get a message like "cannot find -lvcruntime140"
      then you'll need to add the 32-bit version of ``vcruntime140.dll``
      (from `<http://www.dll-files.com/>`_)
      to the ``Python/libs/`` directory.
      You can verify that you have the 32-bit version with the ``file`` command::

         file vcruntime140.dll
         vcruntime140.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows

      A message like "vcruntime140.dll: file not recognized: File format not recognized"
      probably means that you don't have the 32-bit version of the DLL.

*  ``LibUSB-Win32`` (from `<http://libusb-win32.sourceforge.net/>`_)

   The ``mkwin`` script assumes that it has been installed in
   ``C:\LibUSB-Win32``.
   The ``-U`` (LibUSB-Win32) option can be used to specify another location.
   The archive currently being used is named ``libusb-win32-bin-1.2.6.0.zip``.
   Our copy of this archive has a top-level directory named ``libusb-win32-bin-1.2.6.0``.

*  ``LibUSB-1.0`` (from `<http://www.libusb.org/wiki/windows_backend>`_)

   The ``mkwin`` script assumes that it has been installed in
   ``C:\LibUSB-1.0``.
   The ``-X`` (libusbx) option can be used to specify another location.
   The archive currently being used is named ``libusbx-1.0.18-win.7z``.
   Our copy of this archive doesn't have a top-level directory.
   We have an alternate copy of this archive named ``libusbx-1.0.18-win.tar.gz``.

*  ``WinUSB`` (from `<http://www.libusb.org/wiki/windows_backend>`_)

   The ``mkwin`` script assumes that it has been installed in
   ``C:\WinUSB``.
   The ``-W`` (WinUSB) option can be used to specify another location.
   The archive currently being used is named ``winusb.zip``.
   Our copy of this archive doesn't have a top-level directory.

*  ``ICU`` (from `<http://icu-project.org/>`_)

   The ``mkwin`` script assumes that it has been installed in ``C:\ICU``.
   The ``-I`` (ICU) option can be used to specify another location.
   The archive currently being used is named ``icu4c-53_1-Win32-msvc10.zip``.
   Our copy of this archive has a top-level directory named ``icu``.
   Since Windows file systems don't have case sensitive names,
   renaming it from ``icu`` to ``ICU`` is optional.

*  ``pkg-config`` (from `<http://gtk.org/download/win32.php>`_)

   The archive currently being used is named ``pkg-config_0.28-1_win32.zip``.
   Our copy of this archive doesn't have a top-level directory.
   It should be unpacked when in MinGW's ``/mingw/`` directory.

*  ``Glib`` (from `<http://gtk.org/download/win32.php>`_)

   The archive currently being used is named ``glib_2.34.3-1_win32.zip``.
   Our copy of this archive doesn't have a top-level directory.
   It should be unpacked when in MinGW's ``/mingw/`` directory.

*  ``gettext-runtime`` (from `<http://gtk.org/download/win32.php>`_)

   Only install it if your MinGW installation doesn't already have it.
   Check for the presence of a ``libintl`` DLL in MinGW's ``/mingw/bin/`` directory.

The ``mkwin`` script uses the ``lib`` command,
which belongs to MSVC (Microsoft Visual C++).
On newer Windows systems, MSVC has become
a component of Microsoft Visual Studio.
If you don't have it then you'll need to get
the following files from someone who does.
Copies of them are at `<http://BRLTTY.app/archive/Windows/MSVC/>`_.

*  lib.exe
*  link.exe
*  mspdb100.dll
*  msvcr100.dll

All of them should be placed within the same directory
(MinGW's ``/usr/local/bin/`` directory may be a good place).
Either add this directory to your command search path
or use the ``-M`` (MSVC) option to specify its location.

If you'd like to have USB support then create the symbolic links as described
within the MinGW instructions for using `LibUSB-Win32`_ and/or `LibUSB-1.0`_.
You'll also need to create ``.pc`` (pkg-config) files for them within MinGW's
``/mingw/lib/pkgconfig>`` directory. The ones we've created are at
`<http://BRLTTY.app/archive/Windows/pkgconfig/>`_.

If you'd like to have Bluetooth support then you'll need to add
the files listed below to MinGW's ``/mingw/include/`` directory.
Copies of them are at `<http://BRLTTY.app/archive/Windows/Bluetooth/>`_.

*  ws2bth.h
*  bthdef.h
*  bthsdpdef.h

More ``mkwin`` Options
~~~~~~~~~~~~~~~~~~~~~~

``-u`` (USB)
   Specify which USB package is to be used. The following USB packages are
   supported:

   *  libusb (for LibUSB-Win32)
   *  libusb-1.0 (for LibUSB-1.0 + WinUSB)

``-C`` (Cygwin)
   Specify the root (top-level) directory of a Cygwin installation.
   If it isn't specified then ``/cygwin`` (if it exists) is assumed.
   Cygwin's ``bin/`` directory is added to the end of the command search path
   as a last resort for finding needed commands that MinGW may not have.

``-s`` (shell)
   Invoke an interactive shell just before the archive is created so that you
   can have a look at and/or modify what it will contain. If the ``SHELL``
   environment variable is set then that shell is used. If not, ``/bin/sh`` is
   assumed.

``-t`` (temporary directory)
   Specify the temporary directory that is to be used for the build.
   It must not already exist.
   If it isn't specified then an internally generated path is used.

``-k`` (keep)
   Don't remove the temporary directory
   at the end of a successful build.
   It isn't removed if the build fails
   so that you can have a look at what went wrong.

.. include:: common-options.rst

``mkwin`` Parameters
~~~~~~~~~~~~~~~~~~~~

The ``mkwin`` script accepts two parameters:

1) The path to the top-level directory of BRLTTY's source tree.
   It may be either relative or absolute.
   This parameter is required.

2) The build revision.
   It may be any character sequence that doesn't include whitespace.
   It is appended, with a prepended dash (``-``), to
   BRLTTY's version number in order to construct the build version.
   This parameter is optional - if it isn't specified then
   the revision number part of the build identifier is used.

The build name is used as:

*  the name of the top-level directory within the archive
*  the file name of the archive (which has the ``.zip`` extension)
*  the file name of the installer (which has the ``.exe`` extension)

It has the following form::

   brltty-win-buildVersion-buildRevision-usbPackage

For example:

*  if your current working directory is the ``Windows/`` subdirectory of
   BRLTTY's source tree,

*  if the current BRLTTY version is 5.2,

*  and remembering that the default USB package is ``libusb``,

then invoking the following command::

   ./mkwin .. 4

will create these files within the current working directory:

*  brltty-win-5.2-4-libusb.zip (the archive)
*  brltty-win-5.2-4-libusb.exe (the installer)

The ``winsetup`` Script
-----------------------

The ``winsetup`` script,
which can be found in the ``Windows/`` subdirectory of BRLTTY's source tree,
ensures that all needed components are installed on your system
so that `the mkwin script`_ can successfully build BRLTTY.

``winsetup`` Options
~~~~~~~~~~~~~~~~~~~~

``-a`` (archive URL)
   Specify the location for BRLTTY's Windows archive.

``-d`` (dry run)
  Don't actually install anything.

``-k`` (keep)
   Don't remove the temporary directory.

``-p`` (Python directory)
   Specify the location where Python has been installed.

``-t`` (temporary directory)
   Specify the temporary directory that is to be used for the installs.
   It must not already exist.
   If it isn't specified then an internally generated path is used.

.. include:: common-options.rst

