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

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

        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>
