This is a port of GNU Libiconv @VER@ 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 licv@packageversion@b.zip      or
          djtarx licv@packageversion@b.zip       or
          pkunzip -d licv@packageversion@b.zip



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

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

        If you want to run the check you will need also:
          dif272b.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 version of
        shl112b.zip (date: 2000-08-11). This updated version has 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 these packages may do the job as well
        but I have not tested this.

3.2.:   Create a temporary directory and copy the source package: licv@packageversion@s.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 licv@packageversion@s.zip      or
          djtarx licv@packageversion@s.zip       or
          pkunzip -d licv@packageversion@s.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 @V@/djgpp/fnchange.lst @V@.tar.gz > lst
          djtar -x -n lst @V@.tar.gz

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

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

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

        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 <bruno@clisp.org>.


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