Extracted from the documentation:
   http://xmlsoft.org/FAQ.html#Compilatio

See also the generic INSTALL file for configure options

Compilation

   1.What is the process to compile libxml ? 

     As most UNIX libraries libxml follows the "standard":

     gunzip -c xxx.tar.gz | tar xvf -

     cd libxml-xxxx

     ./configure --help

     to see the options, then the compilation/installation proper

     ./configure [possible options]

     make

     make install

     At that point you may have to rerun ldconfig or similar utility to
     update your list of installed shared libs.

     At this point you can check that the library is properly functionning
     by running

     make tests

   2.What other libraries are needed to compile/install libxml ? 

     Libxml does not requires any other library, the normal C ANSI API
     should be sufficient (please report any violation to this rule you
     may find).

     However if found at configuration time libxml will detect and use
     the following libs:

         libz: a highly portable and available widely compression library 
             http://www.info-zip.org/pub/infozip/zlib/
         iconv: a powerful character encoding conversion library. It's
	     included by default on recent glibc libraries, so it doesn't
	     need to be installed specifically on linux. It seems it's
	     now part of the official UNIX specification. Here is one
	     implementation of the library which source can be found here.
             http://clisp.cons.org/~haible/packages-libiconv.html
             ftp://ftp.ilog.fr/pub/Users/haible/gnu/

   3.make tests may fail on some platforms 

     Sometime the regression tests results don't completely match the
     value produced by the parser, and the makefile uses diff to print
     the delta. On some platforms the diff return breaks the compilation
     process, if the diff is small this is probably not a serious problem

Daniel
veillard@redhat.com
