204 lines
7.0 KiB
Plaintext
204 lines
7.0 KiB
Plaintext
|
|
Building XZ Utils on Windows using MinGW-w64 and CMake
|
|
======================================================
|
|
|
|
1. Introduction
|
|
1.1. Licensing considerations
|
|
2. MSVCRT or UCRT
|
|
3. CMake
|
|
4. MinGW-w64 toolchains
|
|
4.1. MinGW-w64 with GCC
|
|
4.2. MinGW-w64 with Clang/LLVM
|
|
5. Building XZ Utils
|
|
5.1. Advanced build options
|
|
6. Creating an import library for MSVC / Visual Studio
|
|
|
|
|
|
1. Introduction
|
|
---------------
|
|
|
|
This document explains how to build XZ Utils using MinGW-w64,
|
|
GCC or Clang/LLVM, CMake, and GNU make (mingw32-make) natively
|
|
on Windows. The resulting XZ Utils library and executable files
|
|
will only depend on DLLs that are included in Windows.
|
|
|
|
The build tools can be extracted into separate directories and used
|
|
directly from there and deleted when no longer needed. There are no
|
|
installers to run for these and no configuration needed.
|
|
|
|
These instructions don't apply to Cygwin. XZ Utils can be built
|
|
under Cygwin in the same way as many other packages.
|
|
|
|
|
|
1.1. Licensing considerations
|
|
|
|
Parts of MinGW-w64 runtime are statically linked into the binaries
|
|
being built. The file COPYING.MinGW-w64-runtime.txt in MinGW-w64
|
|
contains the license notices that apply to some parts of the
|
|
runtime. The notices must be distributed alongside the binaries
|
|
that have been built with MinGW-w64.
|
|
|
|
MinGW-w64 includes getopt_long(). The GNU getopt_long() (LGPLv2.1)
|
|
included in XZ Utils isn't used when building with MinGW-w64.
|
|
|
|
The code from XZ Utils that ends up liblzma.dll and the *.exe files
|
|
is under the BSD Zero Clause License (0BSD) which doesn't require
|
|
any copyright or license notices to be included when distributing
|
|
the binaries. See the file COPYING in the parent directory.
|
|
|
|
|
|
2. MSVCRT or UCRT
|
|
-----------------
|
|
|
|
Both GCC and Clang/LLVM based MinGW-w64 toolchains come in MSVCRT
|
|
and Universal C runtime (UCRT) variants. MSVCRT is the old one.
|
|
32-bit builds of XZ Utils with MSVCRT should run on Windows 2000
|
|
and later (even Windows 95 should still be possible with trivial
|
|
edits to the source code).
|
|
|
|
UCRT is included in Windows 10, and it's possible to install UCRT
|
|
on Windows XP and later. UCRT might be the preferred choice if
|
|
out-of-the-box compatibility with Windows versions older than 10
|
|
is not required. Visual Studio 2015 and later produce binaries
|
|
that use UCRT.
|
|
|
|
If you want to build liblzma.dll for use with your application,
|
|
it's recommended to use the same CRT for all components. If this
|
|
isn't possible, see the file liblzma-crt-mixing.txt.
|
|
|
|
If you only need the command line tools, the choice of CRT isn't
|
|
important, at least for now.
|
|
|
|
|
|
3. CMake
|
|
--------
|
|
|
|
CMake is used for selecting build options and generating makefiles.
|
|
It can also be used to extract archives, including .tar.xz and .7z.
|
|
|
|
Download a CMake binary package (.zip) from its homepage:
|
|
|
|
https://cmake.org/download/
|
|
|
|
Extract it to, for example, C:\devel\cmake so that the executables
|
|
end up in C:\devel\cmake\bin. Avoid spaces and other special
|
|
characters in the path.
|
|
|
|
|
|
4. MinGW-w64 toolchains
|
|
-----------------------
|
|
|
|
There are a few choices of prebuilt toolchains listed on
|
|
the MinGW-w64 homepage:
|
|
|
|
https://www.mingw-w64.org/downloads/
|
|
|
|
These instructions list one GCC-based version and one
|
|
Clang/LLVM-based version. Both include mingw32-make too.
|
|
|
|
|
|
4.1. MinGW-w64 with GCC
|
|
|
|
For GCC, download appropriate packages from Mingw-builds depending
|
|
on if you want to build 32-bit or 64-bit x86 version of XZ Utils
|
|
and if the XZ Utils binaries should link against MSVCRT or UCRT:
|
|
|
|
https://github.com/niXman/mingw-builds-binaries/releases
|
|
|
|
i686-*-release-win32-*-msvcrt-*.7z 32-bit, uses MSVCRT (old)
|
|
i686-*-release-win32-*-ucrt-*.7z 32-bit, uses UCRT (new)
|
|
x86_64-*-release-win32-*-msvcrt-*.7z 64-bit, uses MSVCRT (old)
|
|
x86_64-*-release-win32-*-ucrt-*.7z 64-bit, uses UCRT (new)
|
|
|
|
Extract it, for example, to C:\devel so that the executables are
|
|
in C:\devel\mingw32\bin or C:\devel\mingw64\bin. To extract,
|
|
you can install 7-Zip from <https://7-zip.org/> or use CMake
|
|
on the command line:
|
|
|
|
set PATH=C:\devel\cmake\bin;%PATH%
|
|
c:
|
|
cd \devel
|
|
cmake -E tar xf x86_64-13.1.0-release-win32-seh-ucrt-rt_v11-rev1.7z
|
|
|
|
Then skip to the section "Building XZ Utils".
|
|
|
|
|
|
4.2. MinGW-w64 with Clang/LLVM
|
|
|
|
For Clang/LLVM, download an appropriate package from LLVM-MinGW:
|
|
|
|
https://github.com/mstorsjo/llvm-mingw/releases
|
|
|
|
llvm-mingw-*-msvcrt-i686.zip 32-bit, uses MSVCRT (old)
|
|
llvm-mingw-*-ucrt-i686.zip 32-bit, uses UCRT (new)
|
|
llvm-mingw-*-msvcrt-x86_64.zip 64-bit, uses MSVCRT (old)
|
|
llvm-mingw-*-ucrt-x86_64.zip 64-bit, uses UCRT (new)
|
|
|
|
Extract it, for example, to C:\devel so that the executables end up
|
|
in a directory like C:\devel\llvm-mingw-20230919-ucrt-x86_64\bin.
|
|
|
|
|
|
5. Building XZ Utils
|
|
--------------------
|
|
|
|
For a simple builds, you can use the included build-with-cmake.bat
|
|
which takes these arguments:
|
|
|
|
%1 = Path to CMake's bin directory. Example:
|
|
c:\devel\cmake\bin
|
|
|
|
%2 = Path to MinGW-w64's bin directory. Example:
|
|
c:\devel\mingw64\bin
|
|
|
|
%3 = ON or OFF: Set to ON to build liblzma.dll or OFF for
|
|
static liblzma.a. With OFF, the *.exe files won't
|
|
depend on liblzma.dll.
|
|
|
|
Example:
|
|
|
|
build-with-cmake C:\devel\cmake\bin C:\devel\mingw64\bin ON
|
|
|
|
If successful, the "build" directory should then contain:
|
|
|
|
liblzma.dll liblzma compression library
|
|
liblzma.def DEF file for creating an import library
|
|
xz.exe xz command line tool
|
|
xzdec.exe Decompression-only tool (smaller than xz.exe)
|
|
lzmadec.exe Decompression-only tool for legacy .lzma files
|
|
lzmainfo.exe Shows header info of legacy .lzma files
|
|
|
|
Ignore the other files. :-)
|
|
|
|
|
|
5.1. Advanced build options
|
|
|
|
For 32-bit x86 builds, adding -msse2 to CFLAGS improves
|
|
compression speed a little (but not decompression speed).
|
|
There is no runtime detection for SSE2 support. It is
|
|
recommended to use 64-bit version when possible.
|
|
|
|
It's possible to omit features from the build to reduce code size.
|
|
There are several CMake configuration options available. One may
|
|
change from CMAKE_BUILD_TYPE=Release to =MinSizeRel as well but
|
|
it makes the code slower.
|
|
|
|
If building for multiple targets, keep only one toolchain in PATH
|
|
at a time.
|
|
|
|
|
|
6. Creating an import library for MSVC / Visual Studio
|
|
------------------------------------------------------
|
|
|
|
To link against liblzma.dll, you need to create an import library
|
|
first. You need the "lib" command from MSVC and liblzma.def. Here
|
|
is the command that works on 32-bit x86:
|
|
|
|
lib /def:liblzma.def /out:liblzma.lib /machine:ix86
|
|
|
|
On x86-64, the /machine argument has to be changed:
|
|
|
|
lib /def:liblzma.def /out:liblzma.lib /machine:x64
|
|
|
|
IMPORTANT: See also the file liblzma-crt-mixing.txt.
|
|
|