# Introduction

wimlib is free and open source software that is available on both UNIX-like
systems and Windows.  This file provides additional information specifically
about the Windows version of wimlib and the command line tool `wimlib-imagex`
that is distributed with it.  It does not obsolete the generic
[README](README.md), which you should read too.

# Windows distribution

The Windows distribution of wimlib is a ZIP file containing the following items:

- `wimlib-imagex.exe`, a command-line tool to deal with WIM (.wim), split WIM
  (.swm), and ESD (.esd) files that is inspired by Microsoft's ImageX and DISM.
  This is a ready-to-run executable and not an installer.

- Very short batch scripts (e.g. `wimapply.cmd`) which are shortcuts to the
  corresponding `wimlib-imagex` commands (e.g. `wimlib-imagex apply`).

- The library itself in DLL format (`libwim-15.dll`).  `wimlib-imagex.exe`
  requires this to run.

- The documentation, including this file, the generic README, and PDF
  documentation for `wimlib-imagex` in the `doc` folder.

- License files for all software included.  These are all free software
  licenses.  `COPYING.txt` is the main license, and it refers to
  `COPYING.GPLv3.txt` and `COPYING.LGPL.txt`.  The other licenses are for
  third-party software included in the library.

- Development files in the `devel` folder.  These are only needed if you are
  developing C or C++ applications that use wimlib.

Note that there are separate ZIP files for 32-bit `i686` and 64-bit `x86_64`
binaries.  They are both fully supported, but you should prefer the 64-bit
binaries when possible as they can be noticeably faster.

# wimlib-imagex

`wimlib-imagex` supports most features of Microsoft's ImageX as well as some
features that are supported by DISM but not by ImageX.  wimlib-imagex also
supports some features that neither ImageX nor DISM support.  Some of the
advantages of `wimlib-imagex` compared to ImageX and DISM are:

- `wimlib-imagex` provides "extract" and "update" commands which allow you to
  quickly work with WIM images without mounting them.

- `wimlib-imagex` provides an easy-to-use "optimize" command which removes
  wasted space from a WIM file and optionally recompresses it with stronger
  compression.

- wimlib includes advanced implementations of all compression algorithms used in
  WIM files.  They usually outperform and outcompress their Microsoft
  equivalents.

- `wimlib-imagex` supports solid WIM files and LZMS compression, for example as
  used in ESD (.esd) files.  (These are partially supported by recent DISM
  versions but not by ImageX.)

- `wimlib-imagex` supports imaging a live Windows system.  Just use the
  `--snapshot` option.

- In many cases, `wimlib-imagex` has simpler command-line syntax than either
  ImageX or DISM.

- Whenever possible, `wimlib-imagex` includes improved documentation and
  informational output compared to Microsoft's software.

- wimlib and `wimlib-imagex` are free software, so you can modify and/or audit
  the source code.

However, some limitations of `wimlib-imagex` compared to ImageX and DISM are:

- On Windows, `wimlib-imagex` does not support mounting WIM images.

- `wimlib-imagex` has no awareness of Windows "packages".

# Additional notes

It's recommended to use `wimlib-imagex` in scripts to avoid having to
interactively enter commands.  However, note that `wimlib-imagex` is largely
just a command-line front-end for wimlib, and it's possible to use wimlib's API
in other front-ends or applications.  Currently there is no official graphical
user interface available for wimlib or `wimlib-imagex`.  However,
[Wimlib-clc](https://reboot.pro/files/file/588-wimlib-clc/) is an unofficial,
Windows-only graphical user interface for `wimlib-imagex`.

# Building from source

As with other open source software, advanced users may choose to build wimlib
from source, potentially with customizations.  Currently, wimlib depends on
MinGW-w64 for its Windows support; Visual Studio is not supported.  The Windows
binaries can be cross-compiled on Linux, or built on Windows using MSYS2 or
Cygwin.  The following instructions show the MSYS2 method.

First, install MSYS2 by running the installer from
[msys2.org](https://www.msys2.org).

Then, open any MSYS2 shell and run the following command:

    pacman -Syu --noconfirm

After that, open any MSYS2 shell again and run the following commands:

    pacman -Syu --noconfirm git
    git clone https://wimlib.net/git/wimlib

Note: By default the git repository will be on the `master` branch, which is the
latest development snapshot.  Optionally, you can check out a specific version,
e.g. `cd wimlib && git checkout v1.14.5`.  For old versions, please refer to the
documentation for that version, as things may have changed.  It is also possible
to use a release tarball (e.g. `wimlib-1.14.5.tar.gz`) instead of the git repo.

Finally, to actually do a build, close the MSYS2 shell you have open, then open
one of the following from the Start menu:

- "MSYS2 MINGW64" - for `x86_64` binaries, built with gcc
- "MSYS2 CLANG64" - for `x86_64` binaries, built with clang
- "MSYS2 MINGW32" - for `i686` binaries, built with gcc
- "MSYS2 CLANGARM64" - for ARM64 binaries (EXPERIMENTAL)

(If unsure, use "MSYS2 MINGW64".)  Then run the following commands:

    cd wimlib
    tools/windows-build.sh --install-prerequisites

The script will automatically download and install the packages needed to build
wimlib in the chosen MSYS2 environment, then build wimlib.  The output will be
in a folder named similarly to `wimlib-1.14.5-windows-x86_64-bin`.  Note that
your "home" folder within MSYS2 is `C:\msys64\home\%USERNAME%` by default.
Therefore, the full path to the output folder will be similar to
`C:\msys64\home\%USERNAME%\wimlib\wimlib-1.14.5-windows-x86_64-bin`.
