This is a port of GNU Libiconv 1.8 to MSDOS/DJGPP.

1.:     DJGPP specific changes.
        =======================
        There are no DJGPP specific changes. This package should
        configure and compile out-of-the-box.
        Please read the documentation to become familiar with this
        product.


2.:     Installing the binary package.
        ==============================

2.1.:   Copy the binary distribution into the top DJGPP installation
        directory and unzip the binary distribution running *ONE* of
        the following commands:
          unzip32 licv18b.zip      or
          djtarx licv18b.zip       or
          pkunzip -d licv18b.zip



3.:     Building the binaries from sources.
        ===================================

3.1.:   To build the binaries you will need the following binary packages:
          djdev203.zip, bsh204b.zip, gcc2952b.zip,
          bnu210b.zip, mak3791b.zip, fil316b.zip,
          shl112b.zip, txt20b.zip, txi40b.zip,
          grep24b.zip and sed302b.zip


        All this packages can be found in the v2gnu directory of any
        Simtel.NET mirror.
        You will need bsh204b.zip and *NOT* a prior version or the build will fail.
        The same applies to djdev203.zip. You *MUST* use the updated versions of
        fil316b.zip (date: 2000-05-30) and shl112b.zip (date: 2000-08-11). This
        updated versions have been recompiled with djdev203.zip and know about
        the "/dev/env" functionality introduced with djdev203.zip. All the other
        packages are the ones I have used to build the binaries from this sources.
        Previuos and/or later versions of this packages may do the job as well but
        I have not tested this.

3.2.:   Create a temporary directory and copy the source package: licv18s.zip
        into the temporary directory. If you download the source distribution
        from one of the DJGPP archives, just unzip it preserving the directory
        structure, runnig ONE of the following commands:
          unzip32 licv18s.zip      or
          djtarx licv18s.zip       or
          pkunzip -d licv18s.zip

        Source distributions downloaded from one of the GNU FTP sites need
        some more work to unpack.  First, you MUST use the `djtar' program to
        unzip the package.  That's because some file names in the official
        distributions need to be changed to avoid problems on the various
        platforms supported by DJGPP.  `djtar' can rename files on the fly
        given a file with name mappings.  The distribution includes a file
        `djgpp/fnchange.lst' with the necessary mappings.  So you need first
        to retrieve that file, and then invoke `djtar' to unpack the
        distribution.  Here's how:

          djtar -x -p -o libiconv-1.7/djgpp/fnchange.lst libiconv-1.7.tar.gz > lst
          djtar -x -n lst libiconv-1.7.tar.gz

        (The name of the distribution archive and the top-level directory will
        be different for versions other than 1.7.)

3.3.:   The package is preconfigured for djdev203. To build the products you
        should run the following command:
          make

        After the compilation has finished, you can check the products
        running the command:
          make check

        To install the products run the command:
          make install

        This will install the products (iconv.exe iconv.h localcharset.h libconv.a
        libcharset.a iconv.1 iconv.3 iconv_open.3 iconv_close.3) into your DJGPP
        installation tree. As usual, prefix is defined as "/dev/env/DJDIR".
        If you prefer to install into same other directory run the command:
          make install prefix=z:/some/other/dir

        Of course, you should replace "z:/some/other/dir" by an appropriate path
        that will meet your requeriments.

3.4.:   If you need/want to reconfigure the package you will have to run the
        following commands:
          make distclean
          djgpp\config

        Please note that you *MUST* use the "distclean" option or the config.cache
        file will *NOT* be deleted. In this case you are *NOT* reconfiguring
        because the configuration informations is read from the cache file instead
        of being newly computed.
        To build the programs in a directory other than where the sources are,
        you must add the parameter that specifies the source directory,
        e.g:
          x:\src\gnu\libiconv.18\djgpp\config x:/src/gnu/libiconv.18

        Lets assume you want to build the binaries in a directory placed on a 
        different drive (z:\build in this case) from where the sources are,
        then you will run the following commands:
          z:
          md \build
          cd \build
          x:\src\gnu\libiconv.18\djgpp\config x:/src/gnu/libiconv.18

        You *MUST* use forward slashes to specify the source directory.
        After having configured the package run the folowing commands to create
        the binaries and docs and install them:
          make
          make check
          make install

        Send suggestions and bug reports concerning the DJGPP port to
        comp.os.msdos.djgpp or djgpp@delorie.com. Libiconv specific bugs
        must be reported to Bruno Haible <haible@clisp.cons.org>.


          Guerrero, Juan Manuel <st001906@hrz1.hrz.tu-darmstadt.de>
