
Apache Xalan-C/C++ XSLT Library Version 1.11

Project Description:
    The Apache Xalan C/C++ Project provides a library and a 
    command line program to transform XML documents using a
    stylesheet that conforms to XSLT 1.0 standards.

    The source package contains all the code to create the library,
    a command line transform utility and the documentation.

    The documentation packages provide pre-built html documents
    for web browser use.

    Binary prebuilt packages are available for some platforms.
    We could use help providing packages for more platforms.

    Xalan is a project of the Apache Software Foundation.

Project Website:
    http://xalan.apache.org/xalan-c/

Subversion Repository:
    http://svn.apache.org/repos/asf/xalan/c/trunk

Mirror Download Site:
    http://www.apache.org/dyn/mirrors/mirrors.cgi/xalan/xalan-c

Prerequisite:
    Apache Xerces-C/C++ XML Parser Library
        Version 3.0 or newer
        Version 3.1.1 preferred

Prerequisite:
    Gnu Make
        This is required when building the Xalan-C library
        on UNIX/Linux platforms.

UNIX PACKAGE INSTALL PROJECTS:

(prefix)/share/doc/xalan-c-1.11/
    README        - This Document
    LICENSE       - The Software License
    NOTICE        - The Software Attributions
    html/         - The HTML documentation package when available

(prefix)/bin/
    Xalan         - command line XSLT stylesheet transform utility

(prefix)/include/xalanc/
    - directory containing library header files

(prefix)/lib/
    libxalan-c.so             -> libxalan-c.so.111.0
    lib/libxalan-c.so.111     -> libxalan-c.so.111.0
    libxalan-c.so.111.0
    libxalanMsg.so            -> libxalanMsg.so.111.0
    libxalanMsg.so.111        -> libxalanMsg.so.111.0
    libxalanMsg.so.111.0

WINDOWS PACKAGE INSTALL PRODUCTS:

(prefix)/doc/xalan-c-1.11/
    README        - This Document
    LICENSE       - The Software License
    NOTICE        - The Software Attributions
    html/         - The HTML documentation package when available

(prefix)/bin/
    Xalan.exe     - command line XSLT stylesheet transform utility
    Xalan-C_1_11.dll         - Release build library
    Xalan-C_1_11D.dll        - Debug build library
    XalanMessages_1_11.dll   - Release build messages
    XalanMessages_1_11D.dll  - Debug build messages

(prefix)/include/xalanc/
    - directory containing library header files

(prefix)/lib/
    Xalan-C_1.exp            - Windows DLL export definitions
    Xalan-C_1.lib            - Windows DLL library definitions
    Xalan-C_1D.exp           - Windows DLL export definitions
    Xalan-C_1D.lib           - Windows DLL library definitions
    XalanMessages_1_11.exp   - Windows DLL export definitions
    XalanMessages_1_11.lib   - Windows DLL library definitions
    XalanMessages_1_11D.exp  - Windows DLL export definitions
    XalanMessages_1_11D.lib  - Windows DLL library definitions

SUPPORTED PLATFORMS:
    - This is only a partial list
    Linux/Gnu      GCC 4.4
    Windows        VC7.1         Visual Studio .NET 2003
    Windows        VC8           Visual Studio .NET 2005
    Windows        VC9           Visual Studio .NET 2008
    Windows        VC10          Visual Studio .NET 2010
    Solaris-10     CC            SunStudio 12
    OpenBSD 5.1    GCC 4.1
    FreeBSD 9      GCC 4.2
    - Known from previous releases
    AIX            GCC
    AIX            ALC
    BSD            GCC
    HPUX           ACC
    Mac OS X       GCC
    Cygwin         GCC
    MinGW          GCC


===============================================================

README for XalanC project at xalan.apache.org

Steps for doing a UNIX build from source distributions
For users who want to build in the UNIX environment,

   1. The Xalan build files are written for GNU make, and will not work with 
      other make utilities.

   2. Set the XERCESCROOT environment variable to the path to the root directory 
      of Xerces-C++.

   3. Set the XALANCROOT environment variable to the path to the c directory in 
      the root directory of the Xalan-C++ distribution. For example, if the 
      distribution is located in "/home/mydir", you would set the XALANCROOT to 
      "/home/mydir/xml-xalan/c".

   4. (Optional) If you decide to build with ICU, integrate the build with ICU 
      by installing the ICU (see Using the ICU) and defining XALAN_USE_ICU to a 
      value, for example: export XALAN_USE_ICU=true. Set the ICUROOT environment 
      variable to the path to the root directory of ICU. Note that building Xalan 
      with ICU requires that Xerces must also be built with ICU.

   5. Change directory to XALANCROOT. You can also build Xalan-C outside of the 
      source tree, but you will need to adjust the path to the runConfigure script 
      in the next step.

   6. Run the runConfigure utility and provide the platform, C compiler, and 
      C++ compiler flags as indicated below. The runConfigure utility is used to 
      generate the appropriate Makefile for the desired build platform based on 
      the options specified by the user. Valid options for the runConfigure 
      utility are:

      ./runConfigure -p <value> -c <value> -x <value> [-[flag] <value>]

      flag      Description 
      p         Build platform. Option must be provided by user. Valid values
      include: aix, linux, freebsd, netbsd, solaris, hp-10, hp-11, hp-11-ia64, irix,
      tru64, macosx, cygwin.  
      c         C compiler name. Example: gcc, cc, c89, xlc_r, etc. 
      x         C++ compiler name. Example: g++, xlC_r, CC, etc. 
      d         Indicates build is a debug build. Takes no values. Default is no
      debug. 
      t         Transcoder to use. Valid value is 'icu'. Default is null. 
      m         Type of localization support method. Valid values include: inmem,
      icu, and nls. Default is inmem. 
      M         Locale for Message Localization Support. Default is "en_US" 
      r         Threads option. Valid values include: pthread or dce. Default is
      pthread. (valid on HP-UX only) 
      b         Specify whether it is a 32-bit or 64-bit build. Valid values are 32
      and 64. Default is 32-bit 
      P         Install root directory. Used if invoking build with gmake install or
      gmake install-package. Default install root directory is /usr/local 
      l         Extra link options other than the default. Default is null 
      z         Extra compiler options other than the default. Default is null 
      C         Extra configuration options. 
      h         To get help on the above commands. Default is no help. 

      Linux using GCC:  ./runConfigure -p linux -c gcc -x g++
      Linux using the Intel compiler:  ./runConfigure -p linux -c icc -x icc
      AIX (32-bit):    ./runConfigure -p aix -c xlc_r -x xlC_r

      AIX (64-bit):    ./runConfigure -p aix -c xlc_r -x xlC_r -b 64

      Cygwin (32-bit):  ./runConfigure -p cygwin -c gcc -x g++

      HP-UX 11 (32-bit):  ./runConfigure -p hp-11 -c cc -x aCC

      HP-UX 11 (64-bit):  ./runConfigure -p hp-11 -c cc -x aCC -b 64

      HP-UX 11 for Itanium (32-bit):  ./runConfigure -p hp-11-ia64 -c cc -x aCC

      HP-UX 11 for Itanium (64-bit):  ./runConfigure -p hp-11-ia64 -c cc -x aCC -b 64

      Solaris (32-bit):  ./runConfigure -p solaris -c cc -x CC

      Solaris (64-bit):  ./runConfigure -p solaris -c cc -x CC -b 64

      if you choose to install the distribution after building the libraries and 
      executables, then you will need to indicate where you would like the distribution 
      to be installed. To specify the install directory for your distribution, specify 
      the flag -P <install directory>. for example, building and installing on the 
      AIX platform:

      ./runConfigure -p aix -c xlc_r -x xlC_r -P $HOME/my_xalan

      Note      The standard binary directories bin, lib, and include are created in 
      the specified directory only if the install or install-package option is specified 
      in the build process.

      To see the other runConfigure flags you may include, use the help flag:

           ./runConfigure -h

   7. Purge the previous build:

           make clean

   8. Run the new build:

           make
      or
           make targ

      where targ can be one of:
      targ      Description 
      all       Build the libraries and Xalan executable. This is the default target
                if no targ is specified. 
      clean     Deletes existing binaries, executables, libraries, tests, and
                samples. 
      install   Build the library, executables, and samples, and copy them (along with
                the header files) the specified install location. 
      install-package   Installs the library, executables, and samples to the
                specified location. 
      Samples   Builds the samples. 
      Tests     Builds the tests. 


