]> icculus.org git repositories - icculus/xz.git/blob - doc/history.txt
Let the user specify custom CFLAGS on the make command
[icculus/xz.git] / doc / history.txt
1
2 LZMA Utils history
3 ------------------
4
5 Tukaani distribution
6
7     In 2005, there was a small group working on Tukaani distribution, which
8     was a Slackware fork. One of the project goals was to fit the distro on
9     a single 700 MiB ISO-9660 image. Using LZMA instead of gzip helped a
10     lot. Roughly speaking, one could fit data that took 1000 MiB in gzipped
11     form into 700 MiB with LZMA. Naturally compression ratio varied across
12     packages, but this was what we got on average.
13
14     Slackware packages have traditionally had .tgz as the filename suffix,
15     which is an abbreviation of .tar.gz. A logical naming for LZMA
16     compressed packages was .tlz, being an abbreviation of .tar.lzma.
17
18     At the end of the year 2007, there's no distribution under the Tukaani
19     project anymore. Development of LZMA Utils still continues. Still,
20     there are .tlz packages around, because at least Vector Linux (a
21     Slackware based distribution) uses LZMA for its packages.
22
23     First versions of the modified pkgtools used the LZMA_Alone tool from
24     Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need
25     to interact with LZMA_Alone directly. But people soon wanted to use
26     LZMA for other files too, and the interface of LZMA_Alone wasn't
27     comfortable for those used to gzip and bzip2.
28
29
30 First steps of LZMA Utils
31
32     The first version of LZMA Utils (4.22.0) included a shell script called
33     lzmash. It was wrapper that had gzip-like command line interface. It
34     used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep,
35     zdiff, and related scripts from gzip were adapted work with LZMA and
36     were part of the first LZMA Utils release too.
37
38     LZMA Utils 4.22.0 included also lzmadec, which was a small (less than
39     10 KiB) decoder-only command line tool. It was written on top of the
40     decoder-only C code found from the LZMA SDK. lzmadec was convenient in
41     situations where LZMA_Alone (a few hundred KiB) would be too big.
42
43     lzmash and lzmadec were written by Lasse Collin.
44
45
46 Second generation
47
48     The lzmash script was an ugly and not very secure hack. The last
49     version of LZMA Utils to use lzmash was 4.27.1.
50
51     LZMA Utils 4.32.0beta1 introduced a new lzma command line tool written
52     by Ville Koskinen. It was written in C++, and used the encoder and
53     decoder from C++ LZMA SDK with little modifications. This tool replaced
54     both the lzmash script and the LZMA_Alone command line tool in LZMA
55     Utils.
56
57     Introducing this new tool caused some temporary incompatibilities,
58     because LZMA_Alone executable was simply named lzma like the new
59     command line tool, but they had completely different command line
60     interface. The file format was still the same.
61
62     Lasse wrote liblzmadec, which was a small decoder-only library based on
63     the C code found from LZMA SDK. liblzmadec had API similar to zlib,
64     although there were some significant differences, which made it
65     non-trivial to use it in some applications designed for zlib and
66     libbzip2.
67
68     The lzmadec command line tool was converted to use liblzmadec.
69
70     Alexandre SauvĂ© helped converting build system to use GNU Autotools.
71     This made is easier to test for certain less portable features needed
72     by the new command line tool.
73
74     Since the new command line tool never got completely finished (for
75     example, it didn't support LZMA_OPT environment variable), the intent
76     was to not call 4.32.x stable. Similarly, liblzmadec wasn't polished,
77     but appeared to work well enough, so some people started using it too.
78
79     Because the development of the third generation of LZMA Utils was
80     delayed considerably (roughly two years), the 4.32.x branch had to be
81     kept maintained. It got some bug fixes now and then, and finally it was
82     decided to call it stable, although most of the missing features were
83     never added.
84
85
86 File format problems
87
88     The file format used by LZMA_Alone was primitive. It was designed for
89     embedded systems in mind, and thus provided only minimal set of
90     features. The two biggest problems for non-embedded use were lack of
91     magic bytes and integrity check.
92
93     Igor and Lasse started developing a new file format with some help from
94     Ville Koskinen, Mark Adler and Mikko Pouru. Designing the new format
95     took quite a long time. It was mostly because Lasse was quite slow at
96     getting things done due to personal reasons.
97
98     Near the end of the year 2007 the new format was practically finished.
99     Compared to LZMA_Alone format and the .gz format used by gzip, the new
100     .lzma format is quite complex as a whole. This means that tools having
101     *full* support for the new format would be larger and more complex than
102     the tools supporting only the old LZMA_Alone format.
103
104     For the situations where the full support for the .lzma format wouldn't
105     be required (embedded systems, operating system kernels), the new
106     format has a well-defined subset, which is easy to support with small
107     amount of code. It wouldn't be as small as an implementation using the
108     LZMA_Alone format, but the difference shouldn't be significant.
109
110     The new .lzma format allows dividing the data in multiple independent
111     blocks, which can be compressed and uncompressed independenly. This
112     makes multi-threading possible with algorithms that aren't inherently
113     parallel (such as LZMA). There's also a central index of the sizes of
114     the blocks, which makes it possible to do limited random-access reading
115     with granularity of the block size.
116
117     The new .lzma format uses the same filename suffix that was used for
118     LZMA_Alone files. The advantage is that users using the new tools won't
119     notice the change to the new format. The disadvantage is that the old
120     tools won't work with the new files.
121
122
123 Third generation
124
125     LZMA Utils 4.42.0alphas drop the rest of the C++ LZMA SDK. The LZMA and
126     other included filters (algorithm implementations) are still directly
127     based on LZMA SDK, but ported to C.
128
129     liblzma is now the core of LZMA Utils. It has zlib-like API, which
130     doesn't suffer from the problems of the API of liblzmadec. liblzma
131     supports not only LZMA, but several other filters, which together
132     can improve compression ratio even further with certain file types.
133
134     The lzma and lzmadec command line tools have been rewritten. They uses
135     liblzma to do the actual compressing or uncompressing.
136
137     The development of LZMA Utils 4.42.x is still in alpha stage. Several
138     features are still missing or don't fully work yet. Documentation is
139     also very minimal.
140