
Building XZ Utils on Windows
============================

Introduction
------------

    This document explains shortly where to get and how to install the
    build tool that are needed to build XZ Utils on Windows. The final
    binary package will be standalone in sense that it will depend only
    on DLLs that are included in all Windows installations.

    These instructions don't apply to Cygwin. XZ Utils can be built under
    Cygwin in the same way as many other packages.

    These instructions don't apply to MinGW and MSYS developers either,
    who may want to package XZ Utils for MinGW or MSYS distributions.
    You know who you are, and will probably use quite different configure
    options etc. than what is described here.


Installing the toolchain(s)
---------------------------

    Some of the following is needed:
      - MSYS is always needed to use the GNU Autotools based build system.
      - MinGW builds 32-bit x86 binaries.
      - MingW-w32 builds 32-bit x86 executables too.
      - MinGW-w64 builds 64-bit x86-64 binaries.

    So you need to pick between MinGW and MinGW-w32 when building
    32-bit version. You don't need both.

    You might find 7-Zip <http://7-zip.org/> handy when extracting
    some files (especially the .tar.lzma files). The ready-made
    build script will also use 7-Zip to create the distributable
    .zip and .7z files.

    I used the following directory structure but you can use whatever
    you want. Just note that I will use these in my examples. Each of
    these should have a subdirectory "bin":

        C:\devel\tools\msys
        C:\devel\tools\mingw
        C:\devel\tools\mingw-w32
        C:\devel\tools\mingw-w64


Installing MSYS

    You can download MSYS from MinGW's Sourceforge page:

        http://sourceforge.net/projects/mingw/files/

    It's under "MSYS Base System". I recommend using MSYS 1.0.11
    (MSYS-1.0.11.exe or msysCORE-1.0.11-bin.tar.gz) because that
    package includes all the required tools. At least some of the
    later versions include only a subset and thus you would need to
    download the rest separately. The old version will work fine for
    building XZ Utils.

    You can use either the .exe or .tar.gz package. I prefer .tar.gz,
    because it can be extracted into any directory and later removed
    without worrying about uninstallers.


Installing MinGW

    You can download the required packages from MinGW's Sourceforge page:

        http://sourceforge.net/projects/mingw/files/

    These version numbers were the latest when I wrote this document, but
    you probably should pick the latest versions:

        MinGW Runtime -> mingwrt-3.17-mingw32-dev.tar.gz
        MinGW API for MS-Windows -> w32api-3.14-mingw32-dev.tar.gz
        GNU Binutils -> binutils-2.20-1-bin.tar.gz
        GCC Version 4 -> gcc-full-4.4.0-mingw32-bin-2.tar.lzma

    The full GCC package is quite big, but if you want a smaller
    download, you will need to download more than one file, so I'm
    using the full package in this document for simplicity.

    Extract the packages in the above order, possibly overwriting files
    from packages that were extracted earlier.


Installing MinGW-w32 or MinGW-w64

    You can find the latest MinGW-w32 and MinGW-w64 builds here:

        http://sourceforge.net/projects/mingw-w64/files/

    Locate the appropriate files:

        Toolchains targeting Win32 -> mingw-w32-*-mingw*.zip
        Toolchains targeting Win64 -> mingw-w64-*-mingw*.zip

    I don't know what is the most recommended one. I used sezero's
    versions from "Personal Builds", since they seemed to have
    a stable GCC (judging from the GCC version number only).

    If you will install both MinGW-w32 and MinGW-w64, remember to
    extract them into different directories.


Building XZ Utils
-----------------

    Start MSYS by going to the directory C:\devel\tools\msys and running
    msys.bat there (double-click or use command prompt). It will start
    at "home" directory, which is C:\devel\tools\msys\home\YourUserName.

    If you have xz-5.x.x.tar.gz in C:\devel, you should be able to build
    it now with the following commands:

        cd /c/devel
        tar xzf xz-5.x.x.tar.gz
        cd xz-5.x.x
        bash windows/build.bash

    If you used some other directory than C:\devel\tools for the build
    tools, edit the variables near the beginning of build.bash first.

    If you want to build manually, read the buildit() function in
    build.bash. Look especially at the latter configure invocation.

    Be patient. Running configure and other scripts used by the build
    system is (very) slow under Windows.


Using a snapshot from the Git repository

    To use a snapshot, the build system files need to be generated with
    autogen.sh or "autoreconf -fi" before trying to build using the the
    above build instructions. You can install the relevant extra packages
    from MinGW or use Cygwin or use e.g. a GNU/Linux system to create a
    source package with the required build system files.

