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


        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 versions 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: lcset@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 lcset@packageversion@s.zip      or
          djtarx lcset@packageversion@s.zip       or
          pkunzip -d lcset@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 (localcharset.h, libcharset.a) 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\libchset.@treeversion@\djgpp\config x:/src/gnu/libchset.@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\libchset.@treeversion@\djgpp\config x:/src/gnu/libchset.@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. Libcharset specific
        bugs must be reported to Bruno Haible <bruno@clisp.org>.


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