This is a port of GNU Libiconv 1.11 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 licv111b.zip      or
          djtarx licv111b.zip       or
          pkunzip -d licv111b.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: licv111s.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 licv111s.zip      or
          djtarx licv111s.zip       or
          pkunzip -d licv111s.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.11/djgpp/fnchange.lst libiconv-1.11.tar.gz > lst
          djtar -x -n lst libiconv-1.11.tar.gz

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


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.16\djgpp\config x:/src/gnu/libiconv.16

        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.16\djgpp\config x:/src/gnu/libiconv.16

        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>
