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 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.@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>
