HOW TO ADD BZIP2 SUPPORT TO ZIP

This document describes how to add bzip2 support to Zip.

Compiling or linking in the bzip2 library adds an additional bzip2
compression method to Zip.  This new method can be selected instead
of the Zip traditional compression method deflation to compress files
and often gives a better compression ratio (perhaps at the cost of
greater CPU time).  The compression method is specified using the
"-Z method" command-line option, where "method" may be either "deflate"
(the default), or "bzip2" (if Zip is built with bzip2 support).  Zip
has been tested with bzip2 library 1.0.5 and earlier.

Notes

Compression method bzip2 requires a modern unzip.  Before using bzip2
compression in Zip, verify that a modern UnZip program with bzip2 support
will be used to read the resulting zip archive so that entries compressed
with bzip2 (compression method 12) can be read.  Older unzips probably
won't recognize the compression method and will skip those entries.

The Zip source kit does not include the bzip2 library or source files, but
these can be found at "http://www.bzip.org/" for example.  See below for
how to add bzip2 to Zip for various operating systems.

Zip using bzip2 compression is not compatible with the bzip2 application,
but instead provides an additional way to compress files before adding
them to a Zip archive.  It does not replace the bzip2 program itself,
which creates bzip2 archives in a different format that are not
compatible with zip or unzip.
 
The bzip2 code and algorithms are provided under the bzip2 license
(provided in the bzip2 source kit) and what is not covered by that license
is covered under the Info-ZIP license.  Info-ZIP will look at issues
involving the use of bzip2 compression in Zip, but any questions about
the bzip2 code and algorithms or bzip2 licensing, for example, should be
directed to the bzip2 maintainer.


Installation

To build Zip with bzip2 support, Zip generally needs one bzip2 header
file, "bzlib.h", and the object library, typically "libbz2.a", except
in cases where the source files are compiled in directly.  If you
are either compiling the bzip2 library or compiling in the bzip2
source files, we recommend defining the C macro BZ_NO_STDIO, which
excludes a lot of standalone error code (not used when bzip2 is
used as a library and makes the library smaller) and provides hooks
that Zip can use to provide better error handling.  However, a
standard bzip2 object library will work, though any errors that bzip2
generates may be more cryptic.

Building the bzip2 library from the bzip2 source files (recommended):

  Download the latest bzip2 package (from "http://www.bzip.org/", for
  example).
     
  Unpack the bzip2 source kit (bzip2-1.0.5.tar.gz was current as of
  this writing, but the latest should work).

  Read the README file in the bzip2 source kit.

  Compile the bzip2 library for your OS, preferably defining
  BZ_NO_STDIO.  Note: On UNIX systems, this may be done automatically
  when building Zip, as explained below.


Installation on UNIX (see below for installation on other systems):

  Note:  Zip on UNIX uses the "bzlib.h" include file and the compiled
  "libbz2.a" library to static link to bzip2.  Currently we do not
  support using the shared library (patches welcome).

  The easiest approach may be to drop the two above files in the
  bzip2 directory of the Zip source tree and build Zip using the
  "generic" target, that is, using a command like
    make -f unix/Makefile generic
  If all goes well, make should confirm that it found the files and
  will be compiling in bzip2 by setting the BZIP2_SUPPORT flag and
  then including the libraries while compiling and linking Zip.

  To use bzlib.h and libbz2.a from somewhere else on your system,
  define the "make" macro IZ_BZIP2 to point to that directory.  For
  example:
    make -f unix/Makefile generic IZ_BZIP2=/mybz2
  where /mybz2 might be "/usr/local/src/bzip2/bzip2-1.0.5" on some
  systems.  Only a compiled bzip2 library can be pointed to using
  IZ_BZIP2 and Zip will not compile bzip2 source in other than the
  bzip2 directory.

  If IZ_BZIP2 is not defined, Zip will look for the bzip2 files in
  the "bzip2" directory in the Zip source directory.  The bzip2
  directory is empty in the Zip source distribution (except for
  this install.txt file) and is provided as a place to put the
  bzip2 files.  To use this directory, either drop bzlib.h and
  libbz2.a in it to use the compiled library as noted above or drop
  the contents of the bzip2 source kit in this directory so that
  bzlib.h is directly in the bzip2 directory and Zip will try to
  compile it if no compiled library is already there.


  Unpacking bzip2 so Zip compiles it:

  To make this work, the bzip2 source kit must be unpacked directly
  into the Zip "bzip2" directory.  For example:

      # Unpack the Zip source kit.
      gzip -cd zip30.tar-gz | tar xfo -
      # Move down to the Zip kit's "bzip2" directory, ...
      cd zip30/bzip2
      # ... and unpack the bzip2 source kit there.
      gzip -cd ../../bzip2-1.0.5.tar.gz | tar xfo -
      # Move the bzip2 source files up to the Zip kit's bzip2 directory.
      cd bzip2-1.0.5
      mv * ..
      # Return to the Zip source kit directory, ready to build.
      cd ../..
      # Build Zip.
      make -f unix/Makefile generic


  Using a system bzip2 library:

  If IZ_BZIP2 is not defined and both a compiled library and the bzip2
  source files are missing from the Zip bzip2 directory, Zip will test
  to see if bzip2 is globally defined on the system in the default
  include and library paths and, if found, link in the system bzip2
  library.  This is automatic.


  Preventing inclusion of bzip2:

  To build Zip with _no_ bzip2 support on a system where the automatic
  bzip2 detection scheme will find bzip2, you can specify a bad
  IZ_BZIP2 directory.  For example:

      make -f unix/Makefile generic IZ_BZIP2=no_such_directory

  You can also define NO_BZIP2_SUPPORT to exclude bzip2.


  Verifying bzip2 support in Zip:

  When the Zip build is complete, verify that bzip2 support has been
  enabled by checking the feature list:

      ./zip -v

  If all went well, bzip2 (and its library version) should be listed.


Installation on other systems

  MSDOS:

  Thanks to Robert Riebisch, the DJGPP 2.x Zip port now supports bzip2.
  To include bzip2, first install bzip2.  The new msdos/makebz2.dj2
  makefile then looks in the standard bzip2 installation directories
  for the needed files.  As he says:
    It doesn't try to be clever about finding libbz2.a. It just
    expects bzip2 stuff installed to the default include and library
    folders, e.g., "C:\DJGPP\include" and "C:\DJGPP\lib" on DOS.

  Given a standard DJGPP 2.x installation, this should create a
  version of Zip 3.0 with bzip2 support.

  The bzip2 library for DJGPP can be found on any DJGPP mirror in
  "current/v2apps" (or "beta/v2apps/" for the latest beta). This
  library has been ported to MSDOS/DJGPP by Juan Manuel Guerrero.


  WIN32 (Windows NT/2K/XP/2K3/... and Windows 95/98/ME):

  For Windows there seems to be two approaches, either use bzip2
  as a dynamic link library or compile the bzip2 source in directly.
  I have not gotten the static library libbz2.lib to work, but that
  may be me.

  Using bzip2 as a dynamic link library:

    Building bzip2:

    If you have the needed bzlib.h, libbz2.lib, and libbz2.dll files
    you can skip building bzip2.  If not, open the libbz2.dsp project
    and build libbz2.dll

    This creates
      debug/libbz2.lib
    and
      libbz2.dll


    Building Zip:

    Copy libbz2.lib to the bzip2 directory in the Zip source tree.  This
    is needed to compile Zip with bzip2 support.  Also copy the matching
    bzlib.h from the bzip2 source to the same directory.

    Add libbz2.lib to the link list for whatever you are building.  Also
    define the compiler define BZIP2_SUPPORT.

    Build Zip.


    Using Zip with bzip2 as dll:

    Put libbz2.dll in your command path.  This is needed to run Zip with
    bzip2 support.

    Verify that bzip2 is enabled with the command

      zip -v

    You should see bzip2 listed.

  Compiling in bzip2 from the bzip2 source:

    This approach compiles in the bzip2 code directly.  No external
    library is needed.

    Get a copy of the bzip2 source and copy the contents to the bzip2
    directory in the Zip source tree so that bzlib.h is directly in
    the bzip2 directory.

    Use the vc6bz2 project to build Zip.  This project knows of the
    added bzip2 files.

    Verify that bzip2 is enabled with the command

      zip -v


  Windows DLL (WIN32):

    Working on it.  The new directory windll/vc6bz2 has new MSVS 6
    projects for the DLL and LIB libraries that include bzip2.  These
    use the compiling in from the bzip2 source method described above.

    Also, the api now can pass a compression method.

    The examples still need updating however, and then some testing,
    but that should be done by Zip 3.1c release.  The VB6z64 example
    seems to be working.


  Mac OS X:

  Follow the standard UNIX build procedure.  Mac OS X includes bzip2
  and the UNIX builders should find the bzip2 files in the standard
  places.  Note that the version of bzip2 on your OS may not be
  current and you can instead specify a different library or compile
  your own bzip2 library as noted in the Unix procedures above.


  OS/2:

  Nothing yet.


  VMS (OpenVMS):

  See [.vms]INSTALL_VMS.txt for how to enable bzip2 support on VMS.


Updated 26 March 2007, 15 July 2007, 9 April 2008, 27 June 2008,
12 May 2010
S. Schweda, E. Gordon
