
==================================================
STLport README for Borland C++ compilers.
==================================================

by: Francois Dumont, dums@stlport.com, last edited 20 May 2006

============
Introduction
============
This document describes how STLport can be compiled and used with
Borland compilers.

For any further comments or questions visit STLport mailing lists
http://stlport.sourceforge.net/Maillists.shtml or forums
https://sourceforge.net/forum/?group_id=146814

=============
Prerequisites
=============
To build and use STLport you will need following tools and libraries:
 - Borland C++ compiler package 5.5.1 or higher version.

    In order to build STLport the Borland compiler and linker have to
  be correctly configurated too. That is to say:

    * For the Borland compiler bcc32:

    In Borland's 'bin' directory (same directory as bcc32.exe), create a 
  bcc32.cfg file containing the compiler option giving it the path to 
  native Borland headers:

	-I%BORLAND_PATH%\BCC55\include

    * For the resource compiler brcc32:

    Create an environment variable INCLUDE containing path to native Borland
    headers and especially the windows.h file

	set INCLUDE=%BORLAND_PATH%\BCC55\include

    * For the Borland linker ilink32:

    You need to give path to both the Borland libs and Borland PSDK libs.
    For that you have to create, in the same directory as ilink32.exe, a 
    configuration file, ilink32.cfg, that contains:

	-L%BORLAND_PATH%\BCC55\lib;%BORLAND_PATH%\BCC55\lib\PSDK

 - A GNU make tool. You can get one from www.mingw.org or www.cygwin.com.
   See README.mingw or README.cygwin for additional informations.

===================
Configuring STLport
===================
  This is intended to be an optional step, if you want to use default
configuration simply jump to next chapter 'Building STLport'. Open a console
and go to the STLport build/lib folder. Run

	configure --help

  This command will present you the different available build options. Just follow
the instructions to set STLport configuration according your needs. For example,
to set the typical configuration for most Borland compilers, run 

    configure -c bcc

================
Building STLport
================
  This is a step by step description of the actions to take in order to build 
and install the STLport libraries:

1. Open a console, you can use a Msys, Cygwin or Windows console.

2. Go to the STLport build/lib folder:
	cd C:\STLport\build\lib

3. Run the following command:
	make -fbcc.mak install

	Where 'make' is the GNU make utility you have installed. The name of
GNU make utility may differ, such as 'mingw32-make'.  -f is a make option
telling it which makefile to use. You have of course to choose the 
appropriate makefile for your compiler, 'bcc.mak' in our case.

	Once the command returns you will have all the necessary import libraries 
in STLport's 'lib' folder and DLLs in STLport's 'bin' folder.  For a 
description of the generated libraries check the FAQ file in the 'doc' folder.  
For a quick start guide to the STLport make system, see the README file in the 
'build/lib' folder.

===============
Testing STLport
===============
You can use the unit tests to verify STLport behaves correctly. Change into
STLport's 'build/test/unit' folder and type:

  make -fbcc.mak install

This will build and install the unit tests with STLport dynamic libraries.
Once the unit tests are built you just need to run them.  They can be found
in STLport's bin, bin-g or bin-stlg folders.  To rebuild the unit tests 
with STLport static libraries, type:

  make -fbcc.mak clean
  make -fbcc.mak install-static

=============
Using STLport
=============
Adjust your include and link paths in Borland IDE or in the command line config
files. In the include files add the path to STLport's 'stlport' folder. Make sure
it is the first directory listed there. Add STLport's 'lib' folder for the library
files (order of paths doesn't matter here).

Now you should be ready to use STLport.

============
Known limitations
============

1. If you extend a locale facet based on a Standard facet definition you will
have to grant your own facet id defition. Ex extracted from
test/unit/fstream_test.cpp:

#include <locale>

using namespace std;

struct my_state {
  char dummy;
};

struct my_traits : public char_traits<char> {
  typedef my_state state_type;
  typedef fpos<state_type> pos_type;
};

class my_codecvt : public codecvt<char, char, my_state>
{};

// Mandatory locale facet id definition:
template <>
locale::id codecvt<char, char, my_state>::id;

2. If you get a linker memory error, e.g. LME351, it probably means that full
source debugging is enabled and Borland's .TDS file has exceeded the memory 
capacity of Borland's linker (ilink32.exe).  To resolve this error, check
Borland's website for the latest patch for ilink32.exe.  In the alternative,
disable full source debugging in build\Makefiles\gmake\bcc.mak by deleting 
the -v option in the OPT settings.

3. For "'uname' is not recognized . . .", see "Configuring STLport" above. 
