XZ Utils on Windows =================== Introduction This document explains how to build XZ Utils for Microsoft Windows using MinGW (Minimalist GNU for Windows). This is currently experimental and has got very little testing. No ABI stability is promised for liblzma.dll. Why MinGW XZ Utils code is C99. It should be possible to compile at least liblzma using any C99 compiler. Compiling the command line tools may need a little extra work to get them built on new systems, because they use some features that aren't standardized in POSIX. MinGW is free software. MinGW runtime provides some functions that made porting the command line tools easier. Most(?) of the MinGW runtime, which gets linked into the resulting binaries, is in the public domain. While most C compilers nowadays support C99 well enough (including most compilers for Windows), MSVC doesn't. It seems that Microsoft has no plans to ever support C99. Thus, it is not possible to build XZ Utils using MSVC without doing a lot of work to convert the code. Using prebuilt liblzma from MSVC is possible though, since the liblzma API headers are in C89 and contain some non-standard extra hacks required by MSVC. Getting and Installing MinGW You can download MinGW for 32-bit Windows from Sourceforge: http://sourceforge.net/project/showfiles.php?group_id=2435 It is enough to pick Automated MinGW Installer and MSYS Base System. Using the automated installer, select at least runtime, w32api, core compiler, and MinGW make. From MSYS you actually need only certain tools, but it is easiest to just install the whole MSYS. To build for x86-64 version of Windows, you can download a snapshot of MinGW targeting for 64-bit Windows: http://sourceforge.net/project/showfiles.php?group_id=202880 You can use the 32-bit MSYS also for 64-bit build, since we don't link against anything in MSYS, just use the tools from it. You may use the make tool from 32-bit MinGW (mingw32-make.exe) although probably the make.exe from MSYS works too. Naturally you can pick the components manually, for example to try the latest available GCC. It is also possible to use a cross-compiler to build Windows binaries for example on GNU/Linux, or use Wine to run the Windows binaries. However, these instructions focus on building on Windows. Building for 32-bit Windows Add MinGW and MSYS to PATH (adjust if you installed to non-default location): set PATH=C:\MinGW\bin;C:\MSYS\1.0\bin;%PATH% Then it should be enough to just run mingw32-make in this directory (the directory containing this README): mingw32-make Building for 64-bit Windows For 64-bit build the PATH has to point to 64-bit MinGW: set PATH=C:\MinGW64\bin;C:\MSYS\1.0\bin;%PATH% You need to pass W64=1 to mingw32-make (or make if you don't have mingw32-make): mingw32-make W64=1 Additional Make Flags and Targets You may want to try some additional optimizations, which may or may not make the code faster (and may or may not hit possible compiler bugs more easily): mingw32-make CFLAGS="-O3 -fomit-frame-pointer -funroll-loops" If you want to enable assertions (the assert() macro), use DEBUG=1. You may want to disable optimizations too if you plan to actually debug the code. Never use DEBUG=1 for production builds! mingw32-make DEBUG=1 CFLAGS="-g -O0" To copy the built binaries and required headers into a clean directory, use the pkg target: mingw32-make pkg It first removes a possibly existing pkg directory, and then recreates it with the required files. TODO: The pkg target doesn't copy any license or other copyright related information into the pkg directory. Creating an Import Library for MSVC The included Makefile creates import library liblzma.a which works only(?) with MinGW. To use liblzma.dll for MSVC, you need to create liblzma.lib using the lib command from MSVC: lib /def:liblzma.def /out:liblzma.lib /machine:ix86 On x86-64, the /machine argument has to naturally be changed: lib /def:liblzma.def /out:liblzma.lib /machine:x64 To Do - Test Win64 support and add instructions about getting x86-64 version of MinGW. - Creating the import library for other compilers/linkers - Building with other compilers for Windows - liblzma currently uses cdecl. Would stdcall be more compatible? - Support building more size-optimized liblzma (the HAVE_SMALL define and other things that are needed) - Support selecting which parts of liblzma to build to make the library even smaller. - Use the configure script on Windows just like it is used on all the other systems? Bugs Report bugs to (in English or Finnish). Take into account that I don't have MSVC and I cannot very easily test anything on Windows. As of writing, I have tried MinGW and the resulting binaries only under 32-bit Wine.