%%
%%  *** CGAL Installation Guide ***
%%
%% file:     installation.tex
%%
%% authors:  Michael Hoffmann, Dima Pasechnik and Wieger Wesselink
%%
%% $Revision$ $Date$
%%

%% macro for GNU
\newcommand{\gnu}{\textsc{Gnu}}

%% macro for GMP
\newcommand{\gmp}{\textsc{Gmp}}

%% macro for Windows-specific installation
\newcommand{\MSInst}{Windows-specific Installation}

%% macro for g++
\newcommand{\Gcc}[1]{\gnu~\texttt{g++}~{\rm #1}}
\newcommand{\gccurl}{\path'http://gcc.gnu.org/'}

%% macro for SUNPRO CC
\newcommand{\sunprocc}[1]{\textsc{Sunpro}~\texttt{CC}~{\rm #1}}

%% macro for SGI CC
\newcommand{\mipsprocc}{\textsc{SGI}~Mips(Pro)~\texttt{CC}}
\newcommand{\mipsprourl}{\path'http://www.sgi.com/developers/devtools/languages/mipspro.html'}

%% macro for Borland C++
\newcommand{\bcc}[1]{\textsc{Borland}~\texttt{C++}~{\rm #1}}
\newcommand{\bccurl}{\path'http://www.inprise.com/bcppbuilder/'}

%% macro for Microsoft Visual C++
\newcommand{\msvc}[1]{\textsc{MS}~Visual~\texttt{C++}~{\rm #1}}
\newcommand{\msvcurl}{\path'http://msdn.microsoft.com/visualc/'}

%% macro for Intel C++ Compiler
\newcommand{\icl}[1]{\textsc{Intel}~\texttt{C++}~{\rm #1}}
\newcommand{\iclurl}{\path'http://developer.intel.com/vtune/compilers/cpp/'}

%% macro for Kai Compiler
\newcommand{\kcc}[1]{\textsc{Kai}~\texttt{C++}~{\rm #1}}
%\newcommand{\kccurl}{\path'http://www.kai.com/C\_plus\_plus'}
\newcommand{\kccurl}{\ccAnchor{http://developer.intel.com/software/products/kcc/}{\texttt{http://developer.intel.com/software/products/kcc/}}}

%% macro for Microsoft Windows
\newcommand{\mswin}{\textsc{MS}~Windows}

%% macro for CGAL release number
%% \newcommand{\cgalrelease}{2.3}

%% macro for CGAL directory
\newcommand{\cgaldir}{\texttt{CGAL-\cgalrelease}}

%% macro for YOUR CGAL directory :)
\newcommand{\yourcgaldir}{$<$\textit{insert your \cgaldir\ dir}$>$}

%% macro for CGAL install config directory
\newcommand{\cgalinstconfdir}{\cgaldir\texttt{/config/install}\index{directories!config/install@\texttt{config/install}}}

%% macros for WWW pages
\newcommand{\cgalhomepage}{\path'http://www.cgal.org'}
\newcommand{\cgalwinlibmsvc}{\ccAnchor
{http://www.cgal.org/download/CGALWin/MS_windows/Visual_C++/CGALWin_msvc_native.zip}
{\texttt{http://www.cgal.org/download/CGALWin/MS\_windows/Visual\_C++/CGALWin\_msvc\_native.zip}}
}
\newcommand{\cgalwinlibbcc}{\ccAnchor
{http://www.cgal.org/download/CGALWin/MS_windows/Borland/CGALWin_bcc_native.zip}
{\texttt{http://www.cgal.org/download/CGALWin/MS\_windows/Borland/CGALWin\_bcc\_native.zip}}}

\newcommand{\cgalwinlibpage}{\path'http://www.cgal.org/download/CGALWin/'}
\newcommand{\sgistlpage}{\path'http://www.sgi.com/tech/stl/'}
\newcommand{\stlportpage}{\path'http://www.stlport.org/'}
\newcommand{\ledapage}{\path'http://www.mpi-sb.mpg.de/LEDA'}
\newcommand{\gmppage}{\path'http://www.gnu.org/software/gmp'}
\newcommand{\clnpage}{\path'http://clisp.cons.org/~haible/packages-cln.html'}
\newcommand{\trolltechpage}{\path'http://www.trolltech.com'}
\newcommand{\qtpage}{\path'http://doc.trolltech.com/'}
\newcommand{\qtmocpage}{\path'http://doc.trolltech.com/moc.html'}

%% write index in typewriter type. (c) Susan :-)
\newcommand{\TTindex}[1]{\index{#1@{\tt #1}}}
\newcommand{\TTsubindex}[2]{\index{#1@{\tt #1}!{#2}}}
\newcommand{\TTsubindextwo}[2]{\index{#1!#2@{\tt #2} }}

\lcHtml{\chapter{Installation}}
\section{Introduction}

\cgal\ is a \textit{Computational Geometry Algorithms Library\/} written
in \CC, which is developed in an {\sc Esprit Ltr} project. The goal is
to make the large body of geometric algorithms developed in the field
of computational geometry available for industrial application.

This document describes how to install \cgal\ on your system.  Besides
that, you will find some information about the makefile structure of
\cgal\ and the support for simultaneously using \cgal\ and \leda, the
Library of Efficient Datatypes and Algorithms\footnote{\ledapage}
Multiple Precision library GMP\footnote{\gmppage}, the Class
Library for Numbers (CLN)\footnote{\clnpage}, and
Trolltech\footnote{\trolltechpage} Qt toolkit.


\section{Prerequisites}\label{sec:prerequisites}

In order to build the \cgal\ libraries you need a \CC\ compiler.
Currently only a small number of recent compilers on Unix platforms
and \mswin\ are supported. The reason is that most compilers do not
conform to the ISO 14882 standard for \lcTex{\CC\footnote{see e.g.
    \path~http://www.research.att.com/~austern/csc/faq.html\#PartB~ for
    information}} \lcHtml{\CC\footnote{see e.g.
    \path~http://www.research.att.com/~austern/csc/faq.html\#PartB~ for
    information}} and some of them have so many limitations/bugs that
we could not work around all of them.

On \mswin, one has two options for installing: one is specifically
targeted for this OS and is described in
section~\ref{sec:wininst}\footnote{see also the file
  \texttt{INSTALL.win32} in the root directory of the installation}; the
other is using
Cygwin\footnote{\path~http://www.cygwin.com~} and the
generic installation procedure for Unix-like environments described in
section~\ref{sec:sample-inst} and subsequent sections.  If you are
going to install \cgal\ using Cygwin, please read section
\ref{sec:cygwin} first.


More precisely, \cgaldir\ supports the following compilers/operating
systems:

\begin{center}\index{compilers!supported}\index{supported compilers}
  \renewcommand{\arraystretch}{1.3}
  \gdef\lcTabularBorder{2}
  \begin{tabular}{|l|l|} \hline
    \textbf{compiler}        & \textbf{operating system}\\\hline\hline
    \mipsprocc\ 7.3 (n32) \footnotemark[7] 
    & IRIX 6.5\\\hline
    \kcc{4} \footnotemark[8]                 
    & Solaris 2.6+\\\hline
    \Gcc{2.95 and 3.0} \footnotemark[9]            
    & IRIX 6.5 / Solaris 2.6+ / Linux 2.x / 
      \mswin\ 95/98/2000/NT4\footnotemark[12]\\\hline
    \msvc{6.0} \footnotemark[10]           
    & \mswin\ 95/98/2000/NT4\\\hline
    \bcc{5.5} \footnotemark[11]                          
    & \mswin\ 95/98/2000/NT4\\\hline
  \end{tabular}
\end{center}
\footnotetext[7]{\mipsprourl}\addtocounter{footnote}{1}
\footnotetext[8]{\kccurl}\addtocounter{footnote}{1}
\footnotetext[9]{\gccurl}\addtocounter{footnote}{1}
\footnotetext[10]{\msvcurl}\addtocounter{footnote}{1}
\footnotetext[11]{\bccurl}\addtocounter{footnote}{1}
\footnotetext[12]{with Cygwin}\addtocounter{footnote}{1}

%%\msvc{5.0} and prior is not supported and there are no plans to
%%support it in future releases.  
%%The \sunprocc{4.2} compiler is not
%%supported anymore, please stay with \cgal-1.2 if you have to use it.
Support for \sunprocc{} will be reconsidered as soon as an acceptable
degree of standard-conformance is reached. Note that \Gcc{2.96/97} are
not official \texttt{gcc} releases that are neither supported by the
\texttt{GCC} team\footnote{\path'http://gcc.gnu.org/gcc-2.96.html'}
nor by \cgal. Please upgrade to \Gcc{3.0}, if you happen to have this
compiler.
%%Support for \icl{4.0} will be considered.

\section{Getting \cgal} \label{sec:gettingcgal}
\index{CGAL@\cgal!getting}\index{getting \cgal} 

This section applies to Unix-like environments, as well as to \mswin .

The \cgal\ library can be downloaded from the \cgal\ 
homepage:\index{CGAL@\cgal!homepage}
\begin{quote}
      \cgalhomepage
\end{quote}
and go to the `Download' section. Just follow the instructions on this
page to obtain your copy of the library.

After you have downloaded the file containing the \cgal\ library, you
have to decompress it. For the zipfile use the
command\footnote{\texttt{unzip} for \mswin\ can be downloaded, for
  instance, from \texttt{http://virtunix.itribe.net/}}.

\begin{verbatim}
      unzip <filename>.zip
\end{verbatim}

and for the gzipped file use the commands

\begin{verbatim}
      gunzip <filename>.tar.gz
      tar xvf <filename>.tar
\end{verbatim}

Alternatively, your browser might be able to invoke the right
decompression program by itself.
On \mswin\ you should use an unzip utility that can deal with long
filenames (like WinZip or InfoZip).

In both cases the directory \cgaldir\ will be created. This directory
contains the following subdirectories:\index{directories!structure}

\footnotetext[14]{\stlportpage}\addtocounter{footnote}{1}
\begin{center}
  \renewcommand{\arraystretch}{1.3}
  \gdef\lcTabularBorder{2}
  \begin{tabular}{|l|l|} \hline
    \textbf{directory} & \textbf{contents}\\\hline\hline
    \texttt{auxiliary} & packages that can optionally be used with \cgal\\\hline
    \texttt{config}    & configuration files for install script\\\hline
    \texttt{demo}      & demo programs (some of them need \leda, geomview
                         or other third-party products)\\\hline
    \texttt{doc\_html} & documentation (HTML)\\\hline
    \texttt{doc\_pdf}  & documentation (PDF)\\\hline
    \texttt{doc\_ps}   & documentation (Postscript)\\\hline
    \texttt{examples}  & example programs\\\hline
    \texttt{include}   & header files\\\hline
    \texttt{lib}       & (shared) object libraries\\\hline
    \texttt{make}      & files with platform dependent makefile settings\\\hline
    \texttt{scripts}   & some useful scripts (e.g. for creating makefiles)\\\hline
    \texttt{src}       & source files\\\hline
    \texttt{stlport}   & 
         a customized version of \texttt{Stlport-3.2.1}\footnotemark[14] 
         that is used with \msvc{6.0}\\\hline
  \end{tabular}
\end{center}

In order to avoid problems with installation routines, please make
sure that the full path to \cgaldir\ does not contain spaces
(the latter, while in principle possible on \mswin , in not supported
in the present release).

It is planned that in the future on \mswin\ the installation procedure
will be automated via InstallShield.


\subsection{Visualization}\label{sec:vis}

The programs in the \texttt{demo} directory provide visual output.
Most of these use the \ccc{CGAL::Window_stream}, which is currently
provided via the \leda\ library.  If you have \leda\ installed, you
need do nothing more than compile \cgal\ with \leda\ support to be
able to use the \ccc{Window_stream} and thus run these demo
programs.\index{visualization!LEDA}

Because \leda\ is no longer available for free for academic use, we
have made arrangements with Algorithmic Solutions Software GmbH, the
distributors of \leda\, to provide a separate
\texttt{CGALWin}\TTsubindextwo{visualization}{CGALWin}\TTindex{CGALWin}
library for those who do not have \leda\ installed. This library is
based on the \leda\ window but is available for download independently
of \leda\ from the \cgal\ download page. It is available in binary
form only and only for academic research and teaching use.

The installation of the \texttt{CGALWin} binary is described in
Section~\ref{sec:cgalwin}. 

\begin{itemize}
\item If you are installing \cgal\ on a Unix platform
or on \mswin\ using Cygwin, \texttt{CGALWin} should be installed only
after the \cgal\ libraries have been built.
\item If you are installing \cgal\ on \mswin\ using native tools, that is,
{\em not} using Cygwin, and are not planning using \leda\ for doing 
visualization, at this point you could already download\\
\cgalwinlibmsvc , or/and\\
 \cgalwinlibbcc , 
depending on the compiler you are to use, and upack into \cgaldir .
\end{itemize}

Some demo programs for 3D structures require the geomview program for
visualisation.\index{visualization!geomview} This is available from
\path'http://www.geomview.org' (note that it does not run on \mswin).

\section{Installing \cgal on Unix or Cygwin}

The directory \cgaldir\ contains a Bourne shell script called
\texttt{install\_cgal}\TTindex{install\_cgal}
\index{scripts!\texttt{install\_cgal}}. The script can be run in two
modes: a menu-driven interactive mode and a non-interactive mode.
Normally you should use the interactive mode, but in case you run into
problems with it or do not like it for some reason, you can still use
the non-interactive mode.

We first describe a sample installation in section
\ref{sec:sample-inst}. This provides you with an overview on how the
interactive installation works. If you want more detailed information
about specific menus and their options, take a look at section
\ref{sec:interactive-mode}. Finally, for the non-interactive mode
refer to section \ref{sec:non-interactive}.

If you want to use \leda\ together with \cgal, have a look at
section~\ref{sec:leda}.

\section{A Sample Installation on Unix or Cygwin}\label{sec:sample-inst}

In this section we sketch an example installation on a \textsc{Sun}
running Solaris 2.6 with the \Gcc{2.95} compiler. For a complete
description of the different menus and their options refer to section
\ref{sec:interactive-mode}.

\subsection{Starting the script}

Go to the \cgaldir\ directory and enter the command
\begin{verbatim}
      ./install_cgal -i
\end{verbatim}

You get a message indicating the \cgal\ version you are going to
install and that you are running the interactive mode. Then it takes
some time while the script locates a number of utility programs. You
will not get informed about this\footnote{If you are that curious what
  happens exactly, have a look at the file
  \texttt{\cgaldir/install.log}.\TTindex{install.log}}, but see some
dots written to the screen indicating progress.

{\ccTexHtml{\scriptsize}{}
\begin{alltt}
--------------------------------------------------------
  This is the install script for CGAL \cgalrelease
--------------------------------------------------------

starting interactive mode - one moment, please
......

  Choosing compiler GNU gcc-2.95.3
  Testing for STL ... ok.
  ...
  <tests for several compiler features>
  ...
  Saving current setup ... done.
.
\end{alltt}}
  
If there is any compiler installed on your system and accessible
through your \texttt{PATH} environment variable that is supported by
\cgal, one of these compilers is chosen and a number of tests are done
to check whether your compiler supports certain language constructs
respectively has specific bugs. There are quite a number of these
tests, so this step may take some time. For each test you should get a
message what particularly is tested at the moment and what the result
is. If there is more than one compiler installed on your system (and
supported by \cgal), you may later choose to use a different compiler
from the compiler menu.

A menu similar to the following will appear on your screen.\index{main
  menu}\index{menus!main}

{\ccTexHtml{\scriptsize}{} \label{pic:main-menu}
\begin{alltt}
  ****************************************************************
  **              CGAL 2.4 Installation Main Menu               **
  **              -------------------------------               **
  **                                                            **
  **   OS:                  sparc_SunOS-5.6                     **
  **   Compiler:            GNU gcc-2.95.3                      **
  **   LEDA:                not supported.                      **
  **   GMP:                 not supported.                      **
  **   CLN:                 not supported.                      **
  **                                                            **
  **   Compiler is supported by CGAL.                           **
  **   The setup has been tested ok.                            **
  **                                                            **
  **   There are no libs for this os/compiler.                  **
  **                                                            **
  **   <C>  Compiler Menu                                       **
  **   <L>  LEDA Menu                                           **
  **   <G>  GMP Menu                                            **
  **   <M>  CLN Menu                                            **
  **   <K>  Qt Menu                                             **
  **   <T>  Test (and save) setup                               **
  **   <A>  Run all setup tests (no cache)                      **
  **                                                            **
  **   <B>  Build CGAL Libraries                                **
  **                                                            **
  **   <Q>  Back to OS                                          **
  **                                                            **
  **   Your Choice:                                             **
  **                                                            **
  ****************************************************************
\end{alltt}}

The first lines below the headline contain some kind of status report:
current OS and compiler, are \leda, GMP and CLN supported etc.
Moreover you can see that the current setup has been tested and that
there do not exist \cgal\ libraries for this OS/compiler combination
in the \cgal\ lib directory by now.

The fact that your setup has been tested implies that the current
settings have been saved to a file in the directory \cgalinstconfdir.
Thus, if you run the install script a second time for this
OS/compiler, you will not have to go through the whole config-/test
cycle again, but the configuration will be retrieved from the
corresponding config file instead.

\subsection{Building the \cgal\ libraries}\label{sec:build-the-libs}

We are now ready to build the \cgal\ libraries.  Just type ``{\tt b}''
to start compilation. Building consists of three steps:
\begin{enumerate}
\item writing the include makefile,
\item compiling the static libraries \textit{and}
\item compiling the shared libraries.
\end{enumerate}
The include makefile\index{include makefile} encapsulates the OS-- and
compiler-specific settings and should be included (hence the name) in
all makefiles that compile \cgal\ applications. If everything went ok,
the output should look as follows (if not, you should have a look at
the error messages from compiler or linker).

{\ccTexHtml{\scriptsize}{}
\begin{verbatim}
  ****************************************************************
  **                                                            **
  **                     Compiling CGAL 2.4                     **
  **                     ------------------                     **
  **                                                            **
  ****************************************************************

  OS:           sparc_SunOS-5.6
  COMPILER:     GNU gcc-2.95.3
  LEDA:         not supported
  GMP:          not supported
  CLN:          not supported

  Generating Makefiles ... done.
  Building CGAL_lib ... done.
  Building CGAL_sharedlib ... done.

  ****************************************************************
  **             Please press <ENTER> to continue.              **
  ****************************************************************
\end{verbatim}}
{
}  

That's all, it's done. Press ``\texttt{<ENTER>}'' to return to the
main menu and proceed by installing for a different compiler (go to
the compiler menu and choose ``\texttt{c}'' to get a list of supported
compilers detected on your system) or with \leda, GMP, CLN or Qt
support (go to the \leda, GMP, CLN, or Qt menu resp.) or simply quit
the install script by typing ``\texttt{q}''. When leaving the script,
you get a list of successful builds during the session. Furthermore,
the script prints the setting of \texttt{CGAL\_MAKEFILE} for the last
active configuration. Remember to set this environment variable before
compiling \cgal\ applications. On bourne shell derivatives, you would
type in our example
\begin{alltt}
      export CGAL_MAKEFILE=\cgaldir/make/makefile_sparc_SunOS-5.6_g++-2.95.3
\end{alltt}
while for \texttt{csh} descendants the syntax is
\begin{alltt}
      setenv CGAL_MAKEFILE \cgaldir/make/makefile_sparc_SunOS-5.6_g++-2.95.3
\end{alltt}
In Section~\ref{sec:makefiles} you can find more information on the
\cgal\ makefile structure, and how to set \texttt{CGAL\_MAKEFILE} when
using \cgal\ on several platforms.

If you want to use the visualization provided by
\ccc{CGAL::Window_stream} (Section~\ref{sec:vis}) and you do not have
the \leda\ libraries installed, or do not want to use them with \cgal, 
you should now proceed to
Section~\ref{sec:cgalwin} and install the \texttt{CGALWin} library.

%% Now it would be a good idea to print and read the document ``Getting
%% Started with \cgal'' that can be found in various formats in the
%% \texttt{doc\_html}, \texttt{doc\_pdf} and \texttt{doc\_ps}
%% directories.

\section{Installing the \texttt{CGALWin} library}\label{sec:cgalwin}
\TTsubindextwo{installation}{CGALWin}\TTsubindextwo{visualization}{CGALWin}
\TTindex{CGALWin}

\textit{Note: This section applies only to those who do \textbf{not}
  have the \leda\ libraries installed on their system, or do not want to
use \leda\ with \cgal.}

The \texttt{CGALWin} library, as described in Section~\ref{sec:vis},
can be shipped in binary format only because of licensing
restrictions. 

\subsection{Installing \texttt{CGALWin}  on \mswin\ using native tools}
If you have not already downloaded and unpacked into \cgaldir\
the archive(s)\\
\cgalwinlibmsvc, or/and\\
 \cgalwinlibbcc, 
depending on the compiler you are to use, please do so now.
(This should place object library files in the subdirectory 
\cgaldir\texttt{$\backslash$lib$\backslash$win32$\backslash$<your-compiler>}.)
This is all that is needed to be done.

\subsection{Installing \texttt{CGALWin} on Unix or Cygwin}
The binaries are available at the \cgal\ download
pages\footnote{\cgalwinlibpage}. 

Fetch the file matching your operating system and compiler, uncompress
it, and place it into the corresponding \cgal\ lib directory. This
directory has been created during installation of the \cgal\ library
and it is called
\begin{alltt}
      \cgaldir/lib/<\textit{CGAL-OS-description}>
\end{alltt}
where $<$\textit{CGAL-OS-description}$>$ identifies your OS/compiler
combination in a way specified in section \ref{sec:os-compiler-id}.
When quitting \texttt{install\_cgal}, it prints the \cgal\ lib
directory (\texttt{CGAL\_LIB\_DIR})\TTindex{CGAL\_LIB\_DIR} of the
last active configuration.

If you do not find a binary format that works on your system, contact
us at \texttt{contact@cgal.org}, and we will try to accommodate your
needs.

Continuing the example from the previous section, you would download
the file \texttt{libCGALWin.a.gz} from 
\begin{verbatim}
      Solaris -> Solaris-2.6 -> g++-2.95.3
\end{verbatim}
and uncompress it.
\begin{alltt}
      gunzip libCGALWin.a.gz
\end{alltt}
Finally, you have to place it into the lib directory
\begin{alltt}
      cp libCGALWin.a \cgaldir/lib/sparc_SunOS-5.6_g++-2.95.3
\end{alltt}

\section{The interactive mode (Unix/Cygwin)}\label{sec:interactive-mode}
\index{interactive installation}\index{installation!interactive}
\TTsubindex{install\_cgal}{interactive mode}

To run the install script in the interactive mode, go to the \cgaldir\ 
directory and enter the command
\begin{verbatim}
      ./install_cgal -i
\end{verbatim}

After initialization during which certain utility programs are located
and your system is searched for compilers supported by \cgal, you get
into the \cgal\ installation \textit{main menu} (see page
\pageref{pic:main-menu} for a picture).

From the main menu you can reach a number of different sub-menus, of
which the most important maybe is the \textit{compiler menu}. This is
where you can choose the compiler you want to work with and set custom
compiler or linker options.  The compiler menu is described in section
\ref{sec:compiler-menu}.

If you want to use \leda, GMP, CLN or Qt with \cgal, you will have to go
to the \textit{leda menu}, \textit{gmp menu}, \textit{cln menu} or
\textit{qt menu}.
These are described in section \ref{sec:leda-menu},
\ref{sec:gmp-menu}, \ref{sec:cln-menu}, respectively.

Finally you can build the \cgal\ libraries by typing \texttt{b}.
However, it is recommended to run the \textit{setup test} which is
available in all menus as option \texttt{t} before. The setup test
includes an \stl\ test, a \leda\ test, a GMP test, a CLN test and a Qt
test. But
not all tests are performed always; e.g. the \leda\ test is only done,
if you enabled \leda\ support. The install script keeps track of the
tests passed and only tests again, if you change the setup in a way
that might affect the test result. If you want to redo \textit{all}
tests, you have to choose option ``\texttt{a}'' from the main menu.
This also retests for \leda/GMP/CLN/Qt installation in system directories
which otherwise is only done the first time you enable \leda/GMP/CLN/Qt
support for an OS/compiler combination.

\subsection{Files created during installation}\label{sec:filescreated}

The install script stores all relevant settings for an OS/compiler
combination in the directory
\begin{center}
  \texttt{\cgalinstconfdir/$<$\textit{CGAL-OS-description}$>$}
\end{center}
where $<$\textit{CGAL-OS-description}$>$ identifies your OS/compiler
combination in a way specified in section \ref{sec:os-compiler-id}.
\footnote{Note that these files are only OS/compiler specific, i.e.
  there are no different files for with and without \leda\ support.}
This saves you typing everything again, if you upgrade
\index{upgrading \cgal}\index{CGAL@\cgal!upgrade} \cgal\ or another
package that makes recompiling the \cgal\ libraries necessary.

Besides the config files, \texttt{install\_cgal} uses several
temporary files during interactive installation. Most of them are
removed after use, but some are not, since it might be helpful to keep
some information about the last run.  You can keep or delete them as
you like, as they are not needed anymore once the script terminated.
A list of these files (all are plain ASCII and reside in \cgaldir)
follows.
\begin{center}\index{files!temporary}\index{logfiles}
  \renewcommand{\arraystretch}{1.3}
  \gdef\lcTabularBorder{2}
  \begin{tabular}{|l|l|} \hline
    \textbf{filename} & \textbf{content}\\\hline\hline
    \texttt{install.log}\TTindex{install.log} & 
    detailed overall protocol\\\hline
    \texttt{install.completed}\TTindex{install.completed} &
    list of systems for which \cgal\ libraries 
    have been built\\\hline
    \texttt{compile.log}\TTindex{compile.log} & 
    output of the last compiler call\\\hline
  \end{tabular}
\end{center}

\subsection{The Compiler Menu}\label{sec:compiler-menu}
\index{compiler menu}\index{menus!compiler}

Here is the place to set the compiler specific options, such as the
compiler to use (if more than one has been detected) and custom
compiler or linker flags.\bigskip

\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf Compiler Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$C$>$] Choose the compiler to be used from the list of
  detected compilers.\index{compilers!choosing}
\item[$<$F$>$] Set custom compiler flags. These are the first flags
  given to the compiler in every call. Under normal circumstances
  there should be no need to set any such
  flag.\index{compilers!setting custom flags}
\item[$<$L$>$] Set custom linker flags. These are the first flags
  given to the linker in every call. Under normal circumstances
  there should be no need to set any such flag.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}

\subsection{The \leda\ Menu}\label{sec:leda-menu}
\index{LEDA@\leda!menu}\index{menus!\leda}

This is the place to set \leda\ specific options, if you plan to use
\leda\ together with \cgal\ (see also section \ref{sec:leda}). In
order to enable \leda\ support in \cgal, \leda\ has to be installed on
your system.

If \leda\ support is enabled the first time, the script tests whether
\leda\ is installed in standard system directories. If this test does
not succeed, you have to supply directories containing the \leda\ 
header files (\texttt{LEDA\_INCL\_DIR})\TTindex{LEDA\_INCL\_DIR} and
\leda\ libraries ({\tt LEDA\_LIB\_DIR})\TTindex{LEDA\_LIB\_DIR}.  Even
if the tests are passed, you still have the option to set these
directories differently.\bigskip

\index{LEDA@\leda!enable support}
\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf \leda\ Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$E$>$] Enable/Disable \leda\ support in \cgal.
\item[$<$I$>$] (\textit{present if \leda\ support is enabled)} Set the
  include directory for \leda .
\item[$<$J$>$] (\textit{present if \leda\ support is enabled, \leda\ headers
    have been found in a system include directory and {\tt
      LEDA\_INCL\_DIR} has been set)} Use \leda\ header from system
  include directory.
\item[$<$L$>$] (\textit{present if \leda\ support is enabled)} Set the
  directory containing the \leda\ libraries.
\item[$<$M$>$] (\textit{present if \leda\ support is enabled, \leda\ 
    libs have been found in a system lib directory and
    \texttt{LEDA\_LIB\_DIR} has been set)} Use \leda\ libraries from
  system lib directory.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}

\subsection{The GMP Menu}\label{sec:gmp-menu}
\index{GMP@\gmp!menu}\index{menus!\gmp}

This menu is to set GMP (\gnu\ Multiple Precision Library) specific
options, if you plan to use GMP together with \cgal . In the {\tt
  auxiliary} directory you can find a GMP distribution, if you do not
already have it installed on your system. This menu contains an option
to install GMP in your \cgal\ directory tree\footnote{This option is
  on \msvc\ just unpacks the corresponding pre-compiled library that
  comes with \cgal\ distribution.}, but of course you can also install
it independently from \cgal .

If GMP support is enabled the first time, the script tests whether GMP
is installed in standard system directories or in the \cgal\ tree. If
this test does not succeed, you have to supply directories containing
the GMP header files (\texttt{GMP\_INCL\_DIR})\TTindex{GMP\_INCL\_DIR}
and GMP libraries ({\tt GMP\_LIB\_DIR})\TTindex{GMP\_LIB\_DIR}.  Even
if the tests are passed, you still have the option to set these
directories differently.\bigskip

\index{GMP@\gmp!installing}\index{GMP@\gmp!enable support}
\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf GMP Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$C$>$] Install the GMP distribution shipped with \cgal\ in the
  \cgal\ directory tree.
\item[$<$G$>$] Enable/Disable GMP support in \cgal.
\item[$<$I$>$] (\textit{present if GMP support is enabled)} Set the
  include directory for GMP.
\item[$<$L$>$] (\textit{present if GMP support is enabled)} Set the
  directory containing the GMP libraries.
\item[$<$M$>$] (\textit{present if GMP support is enabled, there is a GMP
    installation in system directories or in the \cgal\ tree and {\tt
      GMP\_INCL\_DIR} or \texttt{GMP\_LIB\_DIR} have been set)} Use GMP
  installation from system directories / \cgal\ tree.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}

\subsection{The CLN Menu}\label{sec:cln-menu}
\index{CLN!menu}\index{menus!CLN}

This menu is to set CLN (Class Library for Numbers) specific options,
if you plan to use CLN together with \cgal . Note that for use with
\cgal, CLN version 1.0.3 (or later) is required. In order to enable
CLN support in \cgal, CLN has to be installed on your system first.
Unlike for GMP, there is no option to install CLN from the \cgal\ 
installation script.  For information on CLN, please refer to
\begin{quote}
  \clnpage
\end{quote}

If CLN support is enabled the first time, the script tests whether CLN
is installed in standard system directories. If this test does not
succeed, you have to supply directories containing the CLN header
files (\texttt{CLN\_INCL\_DIR})\TTindex{CLN\_INCL\_DIR} and CLN
libraries ({\tt CLN\_LIB\_DIR})\TTindex{CLN\_LIB\_DIR}. Even if the
tests are passed, you still have the option to set these directories
differently.\bigskip

\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf CLN Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$G$>$] Enable/Disable CLN support in \cgal.\index{CLN!enable
    support}
\item[$<$I$>$] (\textit{present if CLN support is enabled)} Set the
  include directory for CLN.
\item[$<$L$>$] (\textit{present if CLN support is enabled)} Set the
  directory containing the CLN libraries.
\item[$<$M$>$] (\textit{present if CLN support is enabled, there is a
    CLN installation in system directories and {\tt CLN\_INCL\_DIR} or
    \texttt{CLN\_LIB\_DIR} have been set)} Use CLN installation from
  system directories.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}

\subsection{The Qt Menu}\label{sec:qt-menu}
\index{Qt!menu}\index{menus!Qt}

This menu is to set Qt specific options, if you plan to use Qt
together with \cgal . Note that for use with \cgal, Qt version 2.2 (or
later) if required. In order to enable Qt support in \cgal, Qt has to
be installed on your system first.
Unlike for GMP, there is no option to install Qt from the \cgal\ 
installation script.  For information on Qt, please refer to
\begin{quote}
  \qtpage
\end{quote}

\begin{ccAdvanced}
The Qt menu has a basic mode and an advanced one. If your Qt
installation is standard, you shouldn't have to go into the advanced
mode.

The Qt menu starts in basic mode, unless Qt is installed in standard
system directories (because in that case, the advanced mode is quicker).
\end{ccAdvanced}

\subsubsection{Basic mode (to use with a standard Qt installation)}

If Qt support is enabled the first time, the script tests whether the
\texttt{\$QTDIR} environment variable points to a valid Qt directory.
is installed in standard system directories. If that is not the case,
you have to supply the Qt directory containing your Qt
installation. Even if the test passed, you still have the option to
set this directory differently.
If your Qt installation is not standard, you would have to go into the
advanced mode.\bigskip

\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf Qt basic Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$K$>$] Enable/Disable Qt support in \cgal.\index{Qt!enable
    support}
\item[$<$A$>$] (\textit{present if Qt support is enabled)} Go to the
  advanced mode
\item[$<$D$>$] (\textit{present if Qt support is enabled}) Set the
  Qt directory.
\item[$<$E$>$] (\textit{present if Qt support is enabled,
    \texttt{\$QTDIR} points to a valid Qt directory and {\tt QT\_DIR}
    has been set}) Use \texttt{\$QTDIR} as Qt directory.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}



\begin{ccAdvanced}
\subsubsection{Advanced mode (to use with a non-standard Qt
  installation) }

In that mode, you have to specify separately directories containing the Qt
header files (\texttt{QT\_INCL\_DIR})\TTindex{QT\_INCL\_DIR} and the
Qt library (\texttt{QT\_LIB\_DIR})\TTindex{QT\_LIB\_DIR}, and the
path to the MOC\footnote{\qtmocpage} executable
(\texttt{QT\_MOC})\TTindex{QT\_MOC} unless they are in system
directories. Even in that case, you still have the option to set them
differently.

\fbox{
\begin{minipage}{.95\linewidth}
\vspace{2pt}
\centerline{{\large{\bf Qt advanced Menu}}}
\vspace{2pt}
\begin{description}
\item[$<$K$>$] Enable/Disable Qt support in \cgal.\index{Qt!enable
    support}
\item[$<$B$>$] (\textit{present if Qt support is enabled)} Go to the
  basic mode
\item[$<$I$>$] (\textit{present if Qt support is enabled}) Set the
  directory containing Qt headers.
\item[$<$J$>$] (\textit{present if Qt support is enabled, Qt headers
    are in system directories and {\tt QT\_INCL\_DIR} has been set})
  Use Qt headers from system include directories.
\item[$<$L$>$] (\textit{present if Qt support is enabled}) Set the
  directory containing Qt library.
\item[$<$M$>$] (\textit{present if Qt support is enabled, Qt library
    is in system directories and {\tt QT\_LIB\_DIR} has been set})
  Use Qt library from system library directories.
\item[$<$O$>$] (\textit{present if Qt support is enabled}) Set the
  path to MOC executable.
\item[$<$P$>$] (\textit{present if Qt support is enabled, MOC is in path and {\tt QT\_MOC} has been set})
  Use Qt MOC executable in path.
\end{description}
\vspace{2pt}
\end{minipage}
\hfill}

\end{ccAdvanced}

\section{The non-interactive mode}\label{sec:non-interactive}
\index{non-interactive
  installation}\index{installation!non-interactive}
\TTsubindex{install\_cgal}{non-interactive mode}

To run the install script in the non-interactive mode, go to the
\cgaldir\ directory and enter the command
\begin{verbatim}
      ./install_cgal -ni <compiler>
\end{verbatim}
where \texttt{<compiler>} is the C++ compiler
executable.\index{compilers!choosing}\\ You can either specify a full
path, e.g. \texttt{/usr/local/bin/g++}, or just the basename, e.g.
\texttt{g++}, which means the script searches your \texttt{PATH} for
the compiler location. If your compiler call contains whitespaces it
has to be quoted, e.g.  \texttt{./install\_cgal -ni "CC -n32"}.  The
options given this way become part of your \cgal-OS
description\index{OS description} (see section
\ref{sec:os-compiler-id}) which is useful e.g. to distinguish between
different compilers using the same frontend (\mipsprocc\ on
\texttt{IRIX6}).

There are a number of additional command line options to customize
your \cgal\ setup which are discussed below. You should read the
corresponding paragraphs before you continue, especially if one or
more of the following conditions apply to you:
\begin{itemize}
\item you want to use \leda\ together with \cgal\ (section
  \ref{sec:leda-setup}),
\item you want to use \gnu\ GMP together with \cgal\ (section
  \ref{sec:gmp-setup}) \textit{or}
\item you want to use CLN together with \cgal\ (section
  \ref{sec:cln-setup}).
\item you want to use Qt together with \cgal\ (section
  \ref{sec:qt-setup}).
\end{itemize}

Once you started the script, it should give you a message indicating
the \cgal\ version you are going to install and that you are running
the non-interactive mode. Then it proceeds by locating some utility
programs, determining your OS and compiler version and displaying the
settings you gave via command line. Your compiler is also checked for
a number of bugs resp. support of certain language features; a message
\texttt{ok} always indicates that your compiler works as it should
i.e. a feature is supported resp. a bug is \textit{not} present. On
the other hand \texttt{no} resp.  \texttt{unfortunately} indicate a
lack of support resp. presence of a bug.

Finally the current setup is summarized, system specific directories
for makefiles and libraries are created (if they did not exist before)
and a new include makefile is written into the makefile directory. If
there already exists a makefile for the current OS/compiler
combination, it is backed up and you should get a corresponding
message.

To compile the \cgal\ libraries go now to the \texttt{src} directory.
Then type \texttt{make -f makefile\_lib} to compile the \cgal\ object
library and \texttt{make -f makefile\_sharedlib} to compile the \cgal\ 
shared object library. If you want to make changes to the makefiles
first, see section \ref{sec:makefiles} for an explanation of the
makefile structure of \cgal.

When this is finished it would be a good idea to print and read the
`Getting Started with \cgal'\index{CGAL@\cgal!getting started} document
\texttt{getting\_started.ps} that can be found in the \texttt{doc\_ps}
directory.

\subsection{Setting up \leda\ support}\label{sec:leda-setup}
\index{LEDA@\leda!enable support}

See also section \ref{sec:leda}. By default there is no support for
\leda, but you can change this easily by use of the command line
option ``\texttt{-leda}''. If \leda\ is installed in system
directories on your system, you should indicate this by setting the
flags ``{\tt --leda-sys-incl}'' resp.  ``\texttt{--leda-sys-lib}''. If
this is not the case, you have to supply the directories containing
the \leda\ header files (``\texttt{--LEDA\_INCL\_DIR}
\textit{$<$dir$>$}'')\TTindex{LEDA\_INCL\_DIR} resp. the \leda\ 
libraries for your compiler (``\texttt{--LEDA\_LIB\_DIR} {\it
  $<$dir$>$}''\TTindex{LEDA\_LIB\_DIR}).

\subsection{Setting up support for GMP}\label{sec:gmp-setup}
\index{GMP@\gmp!enable support}

By default there is no support for GMP, but you can change this easily
by use of the command line option ``\texttt{-gmp}''. If GMP is
installed in system directories on your system, you are already done
now. If this is not the case, you have to supply the directories
containing the GMP header files (``\texttt{--GMP\_INCL\_DIR}
\textit{$<$dir$>$}'')\TTindex{GMP\_INCL\_DIR} and the GMP library
(``\texttt{--GMP\_LIB\_DIR}
\textit{$<$dir$>$}'')\TTindex{GMP\_LIB\_DIR}.

\subsection{Setting up support for CLN}\label{sec:cln-setup}
\index{CLN!enable support}

By default there is no support for CLN, but you can change this easily
by use of the command line option ``\texttt{-cln}''. If CLN is
installed in system directories on your system, you are already done
now. If this is not the case, you have to supply the directories
containing the CLN header files (``\texttt{--CLN\_INCL\_DIR}
\textit{$<$dir$>$}'')\TTindex{CLN\_INCL\_DIR} and the CLN library
(``\texttt{--CLN\_LIB\_DIR}
\textit{$<$dir$>$}'')\TTindex{CLN\_LIB\_DIR}.

\subsection{Setting up support for Qt}\label{sec:qt-setup}
\index{Qt!enable support}

By default there is no support for Qt, but you can change this easily
by use of the command line option ``\texttt{-qt}''. If Qt is installed
in system directories on your system or the \texttt{\$QTDIR}
environment variable points to the Qt directory, you are already done
now. If this is not the case, you have to supply either the Qt
directory (``\texttt{--QT\_DIR}~\textit{$<$dir$>$}'')\TTindex{QT\_DIR}
if your Qt installation is standard, either directories containing the
Qt header files
(``\texttt{--QT\_INCL\_DIR}~\textit{$<$dir$>$}'')\TTindex{QT\_INCL\_DIR}
and the Qt library
(``\texttt{--QT\_LIB\_DIR}~\textit{$<$dir$>$}'')\TTindex{QT\_LIB\_DIR},
and the path to the MOC\footnote{\qtmocpage} executable
(``\texttt{--QT\_MOC} \textit{$<$exe$>$}'')\TTindex{QT\_MOC} if your
Qt installation is not standard.

\subsection{Setting custom compiler/linker flags}\label{sec:custom-setup}
\index{compilers!setting custom flags}

You can supply custom compiler and linker flags using the options
\mbox{(``\texttt{--CUSTOM\_CXXFLAGS}
  \textit{$<$flags$>$}'')\TTindex{CUSTOM\_CXXFLAGS}} and
\mbox{(``\texttt{--CUSTOM\_LDFLAGS}
  \textit{$<$flags$>$}'')\TTindex{CUSTOM\_LDFLAGS}}.  These are the
first flags given to the compiler/linker in every call.

\textit{Note:} Do not forget to quote your options in case they
contain spaces. Example:
\begin{verbatim}
  ./install_cgal -ni g++ --CUSTOM_CXXFLAGS "-I/my/include -O2"
\end{verbatim}

\subsection{Other Options}\label{sec:other-options}

There are some less important features of the install script we will
summarize here.

First of all, you can get the version number of \texttt{cgal\_install}
with option ``\texttt{--version}''. Note that all other options are
ignored in this case.\TTsubindex{install\_cgal}{version number}

Second there is an option ``\texttt{-os \textit{$<$compiler$>$}}''
where \textit{$<$compiler$>$} is your \CC\ compiler. This allows you
to determine your \cgal-OS description\index{OS description} (see section
\ref{sec:os-compiler-id}). The compiler can either be given by an
absolute path like
\begin{verbatim}
./install_cgal -os /usr/local/gcc-2.95.3/sun/bin/g++
\end{verbatim}
or just by denoting its basename, as long as it is on your path:
\begin{verbatim}
./install_cgal -os CC
\end{verbatim}
The option is intended for testing purposes and automatic detection of
the correct include makefile (see also section \ref{sec:makefiles}).

Finally, there exists an option
``\texttt{--verbose}''\TTsubindex{install\_cgal}{verbose mode} that
can be set in interactive mode as well as in non-interactive mode.
When set you get a detailed summary of error messages occurring during
\textit{any} compiler test (determining \stl\ version etc.). Normally
you only get these messages, if a required test (such as the general
\stl\ test) fails, otherwise you are just informed, \textit{if} it
succeeded or not.  This option is not recommended for general use, but
it can be useful to check why a certain test fails that was expected
to be passed.

\section{Upgrading a previous \cgal\ installation (Unix/Cygwin)}
\label{sec:upgrade}\index{upgrading \cgal}\index{CGAL@\cgal!upgrade}

In case you already have a previous release of \cgal\ installed on
your system, you might like to reuse your configuration files and GMP
installations. Simply use the following command to copy them into the
right place:\TTsubindex{install\_cgal}{upgrade option}
\begin{verbatim}
./install_cgal --upgrade <OLD_CGAL_DIR>
\end{verbatim}
where \texttt{<OLD\_CGAL\_DIR>} is the root directory of your existing
\cgal\ installation\\ (e.g. \texttt{/pub/local/CGAL-2.3}).  You can
then build all libraries for the actual operating system that existed
in your previous \cgal\ installation with
\TTsubindex{install\_cgal}{rebuild-all option}
\begin{verbatim}
./install_cgal --rebuild-all
\end{verbatim}

If you want to install \cgal\ for more than one operating system in
the same directory structure, you have to run the latter command
(\texttt{rebuild-all}) once on each operating system.

\textbf{Note} that some compilers that have been supported in previous
\cgal\ releases might not be supported in \cgal-\cgalrelease\ anymore,
see section \ref{sec:prerequisites}. Trying to build
\cgal-\cgalrelease\ with these compilers will most probably fail. You
can solve this problem by deleting the obsolete config files (see
section \ref{sec:filescreated}) from \cgalinstconfdir\ before issuing
the \texttt{rebuild-all} command.

Similarly, you might want to use compilers with \cgal-\cgalrelease\ 
that have not been supported in previous releases. For these compilers
please follow the usual procedure as described in section
\ref{sec:interactive-mode} or \ref{sec:non-interactive}.

\section{Identifying OS and Compiler (Unix/Cygwin)}\label{sec:os-compiler-id}
\index{OS description}\index{identifying OS and compiler}

Since \cgal\ supports several different operating systems and
compilers, this is also reflected in the structure of the \cgal\ 
directory tree. Each OS/compiler combination has its own lib directory
under \texttt{\cgaldir/lib}) (and analogously its own include
makefile\index{include makefile} in \texttt{\cgaldir/make}) named as
determined by the following scheme.
\begin{center}
  \textit{$<$arch$>$\texttt{\_}$<$os$>$\texttt{-}$<$os-version$>$\texttt{\_}$<$comp$>${\tt
    -}$<$comp-version$>$}[\texttt{\_}LEDA]
\end{center}

\begin{description}
\item[$<$arch$>$] is the system architecture as defined by ``{\tt
    uname -p}'' or ``\texttt{uname -m}'',
\item[$<$os$>$] is the operating system as defined by ``\texttt{uname
    -s}'',
\item[$<$os-version$>$] is the operating system version as defined by
  ``\texttt{uname -r}'',
\item[$<$comp$>$] is the basename of the compiler executable (if it
  contains spaces, these are replaced by "-") \textit{and}
\item[$<$comp-version$>$] is the compiler's version number (which
  unfortunately can not be derived in a uniform manner, since it is
  quite compiler specific).
\end{description}

The suffix \texttt{\_}LEDA is appended to indicate \leda\ support. 

We call the resulting string \cgal-OS description.\\ Examples are
\texttt{mips\_IRIX-6.2\_CC-7.2} or {\tt
  sparc\_SunOS-5.5\_g++-2.95.3\_LEDA}.\\ You can use the install script
to get your \cgal-OS description, see section \ref{sec:other-options}.

\section{The \cgal\ makefile structure (Unix/Cygwin)}\label{sec:makefiles}
\index{makefile structure}

The \cgal\ distribution contains the following makefiles:
\begin{itemize}
\item \texttt{\cgaldir/src/makefile\_lib} for compiling the \cgal\ 
  object library \texttt{libCGAL.a},
  
\item \texttt{\cgaldir/src/makefile\_sharedlib} for compiling the
  \cgal\ shared object library \texttt{libCGAL.so},
  
\item \texttt{\cgaldir/examples/makefile} as sample makefile
  \textit{and}
  
\item \texttt{\cgaldir/examples/*/makefile} for compiling the \cgal\ 
  example programs.
\end{itemize}

All these makefiles are generic: they can be used for more than one
compiler.  To achieve this, the first section of each makefile
contains an include statement that looks as follows:

\begin{verbatim}
      CGAL_MAKEFILE = /users/jannes/CGAL-2.4/make/makefile_<CGAL-OS description>
      include $(CGAL_MAKEFILE)
\end{verbatim}
%$

The file \texttt{CGAL\_MAKEFILE}\TTindex{CGAL\_MAKEFILE} is an include
file\index{include makefile} with platform dependent makefile
settings. The abbreviation \texttt{<CGAL-OS description>} (see section
\ref{sec:os-compiler-id} for details) is used to identify the
operating system and compiler for which the settings hold. For
example, the file \texttt{makefile\_mips\_IRIX64-6.5\_CC-n32-7.30}
contains makefile settings for the IRIX 6.5 operating system and the
\mipsprocc\ 7.3 compiler.  These include files are automatically
generated by the \texttt{install\_cgal} script and they are all
located in the \texttt{\cgaldir/make} directory.  For convenience, the
\texttt{install\_cgal} script will substitute the include makefile
that was generated most recently.

If you want to compile an application or an object library with a
different compiler, the only thing you need to do is to substitute
another include makefile for the \texttt{CGAL\_MAKEFILE} variable. An
alternative way to do this is to create an environment variable
\texttt{CGAL\_MAKEFILE}. To pass the value of the environment variable
to the makefile you can either comment out the \texttt{CGAL\_MAKEFILE}
line in the makefile or use an appropriate command line option for the
make utility.  A comfortable way to set \texttt{CGAL\_MAKEFILE} is by
using \texttt{install\_cgal~-os} (see section
\ref{sec:other-options}).  E.g. if your compiler is \texttt{g++}, you
would type
\begin{alltt}
CGAL_MAKEFILE=`\yourcgaldir/install_cgal -os g++`
\end{alltt}
in bourne shell resp.
\begin{alltt}
setenv CGAL_MAKEFILE `\yourcgaldir/install_cgal -os g++`
\end{alltt}
in csh derivatives. 

\textit{Tip:} Include the setting of \texttt{CGAL\_MAKEFILE} into your
shell startup script (e.g. \texttt{.}(\texttt{t})\texttt{cshrc} for
(\texttt{t})\texttt{csh} or \texttt{.bashrc} for \texttt{bash}).

All makefiles contain sections with compiler and linker flags.  You
can add your own flags here. For example, you might want to add the
flag \texttt{-DCGAL\_NO\_PRECONDITIONS} to turn off precondition
checking. The flags \texttt{\$(CGAL\_CXXFLAGS)} and
\texttt{\$(CGAL\_LDFLAGS)} should never be removed.

The default extension for \cgal\ source files is \texttt{.C}.  The
last section of the makefiles contains a suffix rule that tells the
compiler how to create a \texttt{.o}-file from a \texttt{.C}-file.  If
you want to use the default rule that is defined by the make utility,
you may want to remove this suffix rule.  However, note that this may
have consequences for the makefile variables \texttt{CGAL\_CXX} and
\texttt{CXXFLAGS}.

\section{Compiling a \cgal\ application (Unix/Cygwin)}
\index{building applications} 
\index{compiling applications}

The directory \texttt{\cgaldir/examples} contains a small program
(example.C) and a sample makefile with some comments. The
\texttt{CGAL\_MAKEFILE} variable in this makefile (see section
\ref{sec:makefiles}) is automatically substituted by the
\texttt{install\_cgal} script and equals the most recently generated
include makefile in the \texttt{\cgaldir/make} directory. After the
installation of \cgal\ this sample makefile is ready for use. Just
type '\texttt{make example}' to compile the program
\texttt{example.C}. There is a script for conveniently creating
makefiles for \cgal\ applications, see
section~\ref{sec:create_cgal_makefile}.

Furthermore the directories \texttt{\cgaldir/examples} and
\texttt{\cgaldir/demo} contain many subdirectories with non-graphical
and graphical example programs.  In all these directories you will
find a makefile that is ready for use.

\section{Installation on Cygwin}\label{sec:cygwin}
\index{Cygwin!installation on}\index{installation!on Cygwin}

Cygwin is a free Unix-like environment for MS-Windows, distributed by
Cygnus Solutions. For our tests we have used version 1.3.2 and
$B$-20.1.

It consists of a port of a large number of GNU tools, such as bash,
make, gcc, gas, file utilities, etc, as well as tools ensuring an
ability to emulate Unix-like access to resources, for instance mount.
For a comprehensive introduction and details, see
\path~http://www.cygwin.com/~ .

Make sure that the link \texttt{/bin/sh.exe} exists. If not, create
it:
\begin{verbatim}
cd /bin
ln -s bash.exe sh.exe
\end{verbatim}

\subsection{Pathnames}
\index{Cygwin!pathnames}

Cygwin has a UNIX-like way of navigating hard drives, NFS shares, etc.
This is also the way in which directories and pathnames have to given
to the installation script. They are automatically converted to
Win32-style pathnames when given to the compiler or linker.

The main difference is that directories are seperated by slash (``/'')
rather than by backslash (``$\backslash$'').  The other difference is
concerned with specifying drives. One way is to use POSIX-style
pathnames that map Win32-style drives (\texttt{A:}, \texttt{B:}) to
\texttt{//a/\ldots}, \texttt{//b/\ldots} respectively. For instance,
the path
\texttt{D:$\backslash$Mystuff$\backslash$Mydir$\backslash$LEDA}
translates to \texttt{//d/Mystuff/Mydir/LEDA}.

Alternatively, it can be done using the mount utility, that can be
used to establish a map between Win32-style drives and the Unix-like
style. More precisely, it maps the forest of the directories/files on
Win32-drives to a tree with the root that is usually located at the top
level of the boot drive, say \texttt{C:}.  The root location can be
seen by typing \texttt{mount} command without parameters.  For
instance, if \texttt{D:} is mounted on
\texttt{C:$\backslash$ddrive}\footnote{by typing \texttt{mount D:
    /ddrive}} then the path
\texttt{D:$\backslash$Mystuff$\backslash$Mydir$\backslash$LEDA}
translates to \texttt{/ddrive/Mystuff/Mydir/LEDA}.

\paragraph{Upper/lower case and spaces in file names}
Behavour of Cygwin in this regard might be different from the \mswin\ 
behaviour. In particular, using spaces in filenames should better be
avoided.

\paragraph{Links, shortcuts, etc} should be avoided as well.

\subsection{\msvc{6.0}-setup}
\index{Cygwin!setup for \msvc{6.0}}
\index{msvc@\msvc{}!setup on cygwin}

A number of environment variables has to be set (or updated)
in order to use the installation.

\texttt{PATH} should contain \msvc{6.0} command line tools locations.
The environment variables \texttt{INCLUDE} and \texttt{LIB} should
point to the location of \msvc{6.0} header files and to the location
of the \msvc{6.0} libraries, respectively.
The interface for doing this is different for NT and for Win9*.

\paragraph{\mswin-NT4.0.}
\index{Cygwin!setup on NT4}

One can set the corresponding environment variables using the
usual NT interface\footnote{open MyComputer, press right mouse button,
  select Properties, select Environment, set the relevant variables}.
Alternatively, they can be set in the \texttt{.bashrc} file for the
particular user, or in the system-wide \texttt{bash} customization
file (usually \texttt{/etc/bashrc}).

The result should look roughly as follows, assuming that
\texttt{C:$\backslash$PROGRA$\sim$1$\backslash$MICROS$\sim$2$\backslash$}
is the location of the \msvc{} installation.
\begin{verbatim}
LIB=C:\PROGRA~1\MICROS~2\VC98\LIB
INCLUDE=C:\PROGRA~1\MICROS~2\VC98\INCLUDE
\end{verbatim}
and \texttt{PATH} should contain
\begin{verbatim}
/PROGRA~1/MICROS~2/Common/msdev98/BIN:
/PROGRA~1/MICROS~2/VC98/BIN:/PROGRA~1/MICROS~2/Common/TOOLS:
/PROGRA~1/MICROS~2/Common/TOOLS/WINNT
\end{verbatim}

\paragraph{\mswin-9*.} 
\index{Cygwin!setup on \mswin-9*}

First, the memory for environment variables has to be increased.
Select the Cygwin icon from the Start-menu, press the right mouse
button and choose \textit{Properties}. Go to \textit{Memory}, select
\textit{Initial Environment}, set it to at least 2048 and
\textit{apply} the changes.

Second, edit the file \texttt{cygwin.bat} (or \texttt{cygnus.bat} in
Cygwin~0.9), located in the cygwin main directory and add the line
\begin{verbatim}
call C:\PROGRA~1\MICROS~2\VC98\Bin\MSCVARS32.BAT
\end{verbatim}
where
\nonlinkedpath'C:\PROGRA~1\MICROS~2\'
%\texttt{C:$\backslash$PROGRA$\sim$1$\backslash$MICROS$\sim$2$\backslash$}
has to be customized according to where \msvc{} is installed on your
system. Depending on the version of \msvc{} you might have to replace
\texttt{MSCVARS32.BAT} by \texttt{VCVARS32.BAT}.

\section{Installation on \mswin\ with native tools} \label{sec:wininst}
\index{mswin@\mswin, installation on}\index{installation!on \mswin}

\cgal-\cgalrelease\ provides a basic support for \msvc{6.0} compiler
and for Inprise Borland C++ Builder 5, known also as \bcc{5.5}.  The
use of these with \cgal\ is briefly described in file
\texttt{INSTALL.win32} located in the directory \cgal-\cgalrelease.

Downloading and contents of the distribution are described in 
section~\ref{sec:gettingcgal} above.

In order to install and use \cgal\ with \msvc , you need \msvc\ 
command line tools installed and working\footnote{To make sure that
  certain environment variables are set correctly, one should execute
  \texttt{VCVARS32.BAT} located in the same directory as the \msvc\ 
  executables. A possible \mswin-9* - specific problem (and a
  solution) is discussed in section \ref{subs::inicu}}. 
Certain familiarity with using Windows command prompt
and these tools is assumed. A reasonable amount of system resources,
that is enough memory to run large compilations (64 Mb on NT4.0) and
about 15MB of disk space, is required. Note, however, that 
executables, object files and debug-related files in subdirectories
\texttt{demo/} and \texttt{examples/} can occupy several hunderd
megabytes all together.

\cgal\ has interfaces to a number of 3rd party
packages, that provide, in particular, arbitrary precision arithmetic,
and visualization. On Windows these packages are \leda\ and \gnu\ MP
(also known as \gmp ).  \gmp\ is supported by default; see
section~\ref{sect:wingmp} for details.  \leda\ configuration is
described below.

\newcommand{\CGALR}{\texttt{CGALROOT}}
\newcommand{\bslsh}{$\backslash$}

In what follows \CGALR\ will refer to the full path to the
directory \cgal-\cgalrelease , where the downloaded source is
unpacked.

\subsection{Initial customization}\label{subs::inicu}

Change to \CGALR\ and run the batch file \texttt{cgal\_config.bat} at the
command prompt.  This script will set the appropriate makefiles for
subsequent compilation.\footnote{
{\bf \mswin-9*.} 
The memory for environment variables might have to be increased.
Select the MS-DOS icon from the Start-menu, press the right mouse
button and choose \textit{Properties}. Go to \textit{Memory}, select
\textit{Initial Environment}, set it to at least 2048 and
\textit{apply} the changes. Then press \textit{OK} and kill the window.
}

\texttt{cgal\_config.bat} accepts 4 parameters.
\begin{enumerate}
\item the compiler type (\texttt{msc} or \texttt{bcc})
%
\item (optional) compiler options (to enable debugging and/or threads
                support)
%
\item (optional) \texttt{LEDAROOT} (the location where \leda\ lib files are installed)
%
\item (optional) the location where \leda\ header files are installed.
                If omitted, it is assumed to be 
\texttt{LEDAROOT\bslsh incl}.
\end{enumerate}

Without \leda, one would run a command like
\begin{verbatim}
K:\cgal\> cgal_config msc mld
\end{verbatim}

to configure \cgal\ for \msvc{6.0} in single thread debug mode.


Or, assuming that \leda\ is installed in \texttt{k:\bslsh
  LEDA-4.1}, one would run at the command prompt:
\begin{verbatim}
K:\cgal\> cgal_config msc k:\LEDA-4.1
\end{verbatim}

Otherwise, if \leda\ header files are not in \texttt{LEDAROOT\bslsh incl}, 
one would run, say,

\begin{verbatim}
K:\cgal\> cgal_config msc k:\LEDA-4.1\msvc k:\LEDA-4.1\incl
\end{verbatim}

It is assumed that paths to \texttt{LEDAROOT} and \leda\ include
directories do not have names with spaces.

Running \texttt{cgal\_config.bat} without parameters prints out the detailed
options list (in particular, the compiler and linker options).


\subsection{Building the library, examples and demos}

Change (if necessary)
to \CGALR\ and run \texttt{make\_lib.bat} at the command prompt. Namely,
\begin{verbatim}
K:\cgal\> make_lib
\end{verbatim}

builds the library with the compiler and linker options specified
by the last run of \texttt{cgal\_config.bat}.
For other settings, one would have to reconfigure and recompile
(same as for current \leda\ installation).
\begin{verbatim}
K:\cgal\> make_examples
\end{verbatim}
compiles and links the examples and
\begin{verbatim}
K:\cgal\> make_demos
\end{verbatim}
compiles and links the demos. 

Examples and demos can also be built on per directory, or even on per
executable basis.  Each \texttt{examples/} and \texttt{demo/}
subdirectory contains a \texttt{makefile.mak} file that is a \mswin\ 
\texttt{nmake} makefile.  For instance, change to
\texttt{\cgal-\cgalrelease\bslsh demo\bslsh Point\_set\_2} and type
\texttt{nmake -f makefile.mak all} to build all the examples there.
Typing \texttt{nmake -f makefile.mak ps\_test1} will build the
particular demo program \texttt{ps\_test1}.

The corresponding executable(s) then can be run as usual, from the
command prompt, or via Explorer.

Note that demos requiring \leda\ would not work if \cgal\ was
configured without \leda\ support.  \leda\ must be compiled and used
with \texttt{LEDA\_STD\_HEADERS} flag on. See
section~\ref{subs:ledastlconfl} for details.


\subsection{Developing for \cgal\ with \msvc{6.0}}
\index{msvc@\msvc{}!developing for \cgal\ with}

Here we give some hints on the use of \cgal\ with native \msvc\ tools;
C++ language issues, troubleshooting and the use of \cgal\ with Cygwin
are covered above.

The most important issue is the following. \cgal\ uses C++ STL
(Standard Template Library) quite extensively.  To resolve many C++
Standard compliance problems of the native \msvc\ STL, we chose to use
a drop-in replacement for it, \texttt{STLPort} (see \stlportpage). We
have customized \texttt{STLPort-3.2.1} to partially support
\texttt{std::iterator\_traits} template of STL.

For this to work, the compiler should have \texttt{STLPort}
subdirectory first in its search path.  This issue is taken care of in
the makefiles generated.  Customization of IDE is described in Sect
\ref{sssect:mscide} below.


\subsubsection{Using nmake makefiles.}
Simply adapt a makefile \texttt{makefile.mak} 
from an \texttt{examples/} or \texttt{demos/} subdirectory.
This means changing the target \texttt{all} and changing the targets that
create executables (look in the subsection ``target entries'' there).
For instance, you would like to create an executable \texttt{demo\_beta.exe}
from a C++ source file \texttt{demo\_beta.C}.  Then your 
\texttt{makefile}, that would
include the ``main'' makefile makefile.mak in \CGALR\ would have
\begin{verbatim}
all: demo_beta

demo_beta: demo_beta.obj
        $(CGAL_CXX) $(LIBPATH) $(EXE_OPT)demo_beta demo_beta.obj \
        $(LDFLAGS)
\end{verbatim}

and a ``suffix rule'' that describes creation of an object file from a
.C - file, e.g.
\begin{verbatim}
.C.obj:
        $(CGAL_CXX) $(CXXFLAGS) $(OBJ_OPT) $<
\end{verbatim}

Extra compiler and linker options are to be specified by changing
macros \texttt{CXXFLAGS} and \texttt{LDFLAGS}, respectively.

One way to specify the ``main'' makefile is by using environment
variable \texttt{CGAL\_MAKEFILE} to specify the full path to 
\texttt{makefile.mak} in
\CGALR .

%Probably such a makefile can also be used for a ``custom build'' via an
%IDE, although we never attempted this ourselves.


\subsubsection{Using \msvc\ IDE.}\label{sssect:mscide}
The compiler/linker options used to build the \cgal\ library should
match those used for the project. This can be done by
selecting {\em Project/Settings...}, the {\em C/C++} section,
{\em Code Generation} category, and choosing the right
library in {\em Use run-time library}:

\begin{tabular}{|l|l|} \hline
Single-Threaded&                 ml (or no option)\\
Multi-threaded &                 mt\\
Multi-threaded DLL&              md\\
Debug Single-Threaded &          mld\\
Debug Multi-threaded   &         mtd\\
Debug Multi-threaded DLL&        mdd\\\hline
\end{tabular}

Further necessary customization is as follows.
We hope that the forthcoming automatic installation will simplify
these elaborated procedures.


\paragraph{Customizing compilation.}
Additional include directories (in the right order!) and preprocessor
definitions have to be specified.  We assume that either 
\texttt{CGAL\_ROOT} is
an (already defined) environment variable (and then the include and
library paths can be entered as shown), or 
\texttt{\$(CGAL\_ROOT)} must be
replaced by the corresponding full path to the \cgal\ installation.

There are two ways of customizing this, either per project, or per workspace.
(It is assumed that your CGAL project is within this workspace.)
The latter is more user-friendly, because the choice of directories is
can be done with the usual Windows explorer wizard.

{\bf Customizing compilation within a workspace.}
Select Tools->Options->Directories from the main toolbar.
In ``Show directories'' for choose ``Include files''.
Add extra entries and arrange them in the following order.
\begin{verbatim}
   $(CGAL_ROOT)\stlport
   $(CGAL_ROOT)\include\CGAL\config\msvc
   $(CGAL_ROOT)\include
   $(CGAL_ROOT)\auxiliary\wingmp\gmp-2.0.2
\end{verbatim}
It is very important that {\tt stlport} appears first
in this list; otherwise a bunch
of ugly compiler error messages is guaranteed.

If \leda\ is used, don't forget to add 
\begin{verbatim}
   $(LEDAROOT)\incl
\end{verbatim}


{\bf Customizing compilation within a project.}
Select {\em Project/Settings...}, the {\em C/C++}
section, {\em Preprocessor} category. Add (in the following order)
\begin{verbatim}
   $(CGAL_ROOT)\stlport
   $(CGAL_ROOT)\include\CGAL\config\msvc
   $(CGAL_ROOT)\include
   $(CGAL_ROOT)\auxiliary\wingmp\gmp-2.0.2
\end{verbatim}
%$ %$ %$%$
to "Additional include directories:".
 It is very important that 
\texttt{\$(CGAL\_ROOT)\bslsh stlport} 
appears first in the list in {\em Additional include directories}. 
Otherwise a bunch
of ugly compiler error messages is guaranteed.

If \leda\ is used, don't forget to add 
\texttt{\$(LEDAROOT)\bslsh incl}
to {\em Additional include directories}.

Add \texttt{CGAL\_USE\_GMP} to {\em Preprocessor definitions}.\\
If \leda\ is used, also add \texttt{CGAL\_USE\_LEDA} and
\texttt{LEDA\_PREFIX} there.


Should your source file(s) have suffices that are not recognized by
\msvc{6.0} IDE as C++ source files,
(like all the \cgal\ source files, by the way)
add \texttt{/TP} to options {\em Project Settings} in the {\em C/C++} section,
{\em Preprocessor} category.


\paragraph{Customizing linking.}
Additional libraries and library directories have to be specified.

To specify extra libraries, 
select {\em Project/Settings...}, {\em Link} section, {\em Input} 
category. Add 
\texttt{CGAL.lib}, \texttt{CGALWin.lib}, and \texttt{gmp.lib}
in {\em Object/library modules}: list.
If \leda\ is used, do not add \texttt{CGALWin.lib}, but also add
\texttt{libP.lib},
\texttt{libG.lib}, and 
   \texttt{libL.lib}.

If \leda\ Window is used, also add there \texttt{libW.lib}.
In addition, make sure that you link against the system libraries
\texttt{user32.lib, gdi32.lib, comdlg32.lib, shell32.lib, advapi32.lib}
(usually IDE has them already on the list).

If \leda\ Geowin is used, one should as well add
\texttt{libGeoW.lib} and \texttt{libD3.lib}
to {\em Object/library modules}.

To specify the corresponding library directories,
select Tools->Options->Directories from the main toolbar.
In ``Show directories for'' choose ``Library files''.
Add  \verb=$(CGAL_ROOT)\lib\msvc= 
and
\begin{verbatim}
$(CGAL_ROOT)\lib\win32\msvc\XXX,
\end{verbatim}
where \verb=XXX= denotes one of the 
6 compiler options (ML, MLd, MT, MTd, MD, MDd)
used within the workspace, there.
If \leda\ is used, add the path to the location of the \leda\ object
libraries, too.

If \gmp\ is used, add the path to the location of the corresponding
object library, see Sect.~\ref{sect:wingmp} for the location.

\subsection{\gmp\ support}\label{sect:wingmp}
\index{msvc@\msvc{}!GMP@\gmp\ support}

A pre-compiled for \msvc{6.0}, using Cygwin \gnu\ C compiler and 
\gnu\ assembler, 
static object library \texttt{gmp.lib} is located in 
\texttt{CGALROOT\bslsh auxiliary\bslsh wingmp\bslsh gmp-2.0.2\bslsh msvc}
and the corresponding header file \texttt{gmp.h} in
\texttt{CGALROOT\bslsh auxiliary\bslsh wingmp\bslsh gmp-2.0.2}.

It was created using M.Khan's Cygwin-specific patches to \gmp-2.0.2,
that are available from
\path'http://www.xraylith.wisc.edu/~khan/software/gnu-win32/'
and then slightly modified (by adding a few routines, like
\texttt{random}, and creating a separate \msvc{6.0}-compiled library
that does I/O of the GMP numbers.)  It was checked that all tests that
come with \gmp\ distribution pass.  For details see 
\nonlinkedpath'CGALROOT\auxiliary\wingmp\gmp-2.0.2\msvc\src'.

Subject to time and labour 
constraints, we might provide a smoother \gmp\ support
for \msvc\ in the future. At the time of writing, the
major release of \gmp\ is 3.1.1. One can compile it using the gcc
compiler that comes with Mingw (see \path'http://www.mingw.org')
and so that it will link against \msvc{6.0}-compiled object files.
(But this still needs minor patches in \gmp\ source.)

\lcTex{\begin{appendix}}

\section{Using \cgal\ and \leda}\label{sec:leda}
\index{LEDA@\leda!support in \cgal}
\cgal\ supports \leda\ in the following ways.

\begin{enumerate}
\item There are support functions defined for the \leda\ number types
  \texttt{big\_float}, \texttt{integer}, \texttt{rational} and
  \texttt{real} (see the files \texttt{<CGAL/leda\_*>}).
\item For all two-dimensional geometric objects there are input/output
  operators for a \texttt{leda\_window}.
\item For all two-dimensional geometric objects there are output
  operators to a \texttt{leda\_ps\_file}.
\item The registration functions needed to interact with a
  \texttt{leda\_geowin} are defined for all geometric objects from the
  \cgal\ kernel.
\item \cgal\ defines the following \leda-related compiler flags:
\begin{itemize}
\item When \leda\ is used, the flags \texttt{CGAL\_USE\_LEDA} and
  \texttt{LEDA\_PREFIX} will be set.
\item When \leda\ is used, the \leda\ handles and memory management
  will be used in \cgal.  This can be turned off by setting the flag
  \texttt{CGAL\_NO\_LEDA\_HANDLE}. In that case, \cgal\ handles will
  be used (see \texttt{<CGAL/Handle.h>}).
\end{itemize}
\end{enumerate}

The include makefiles in the \texttt{\cgaldir/make} directory
corresponding to \leda\ can be recognized by the suffix
``\texttt{\_LEDA}''.

\section{Compiler workarounds}
\index{compilers!workarounds}\index{workaround flags}

In \cgal\ a number of compiler flags is defined, all of them start
with the prefix \texttt{CGAL\_CFG}. These flags are used to work
around compiler bugs and limitations.  For example, the flag
\texttt{CGAL\_CFG\_NO\_MUTABLE} denotes that the compiler does not
know the keyword \texttt{mutable}. 

For each compiler a file \texttt{<CGAL/compiler\_config.h>}
\index{files!\texttt{compiler\_config.h}} is defined, with the correct
settings of all flags. This file is generated automatically by the
\texttt{install\_cgal} script. For this the test programs in the
directory \nonlinkedpath'CGAL-2.4/config/testfiles'
\index{directories!config/testfiles@\texttt{config/testfiles}} are
used.  The file \texttt{<CGAL/compiler\_config.h>} and the test
programs contain a description of the problem, so in case of trouble
with a \texttt{CGAL\_CFG} flag it is a good idea to take a look at it.

The file \texttt{<CGAL/config.h>} \index{files!\texttt{config.h}}
manages all configuration problems of the compiler.  This file
includes the file \texttt{CGAL/compiler\_config.h}.  It is therefore
important that the file \texttt{<CGAL/config.h>} is always included
before any other \cgal\ source file that depends on workaround flags.
In most cases you do not have to do anything special for this, because
many CGAL files already take care of including
\texttt{<CGAL/config.h>}. Nevertheless it would be a good idea to
always start your \cgal\ programs with including
\texttt{<CGAL/config.h>} (or \texttt{<CGAL/basic.h>}, which contains
some more basic \cgal\ definitions).

\section{Compiler Optimizations}\label{sec:compiler-optimisations}
\index{compilers!optimization}
\index{optimization compiler flags}

You may have noticed that we do not set optimizer flags as \texttt{-O}
by default in the include makefiles(see section~\ref{sec:makefiles} for
a description of the makefile structure in \cgal).  The main reason
for not doing this is that compilers run much more stable without. On
the other hand, most if not all \cgal\ programs will run considerably
faster when compiled with optimizations! So if you are going for
performance, you should/have to add \texttt{-O}, \texttt{-O3} or maybe
more specific optimizer flags (please refer to the compiler
documentation for that) to the \texttt{CXXFLAGS} variable in your
application makefile:
\begin{alltt}
#---------------------------------------------------------------------#
#                    compiler flags
#---------------------------------------------------------------------#
# The flag CGAL_CXXFLAGS contains the path to the compiler and is defined
# in the file CGAL_MAKEFILE. You may add your own compiler flags to CXXFLAGS.

CXXFLAGS = $(CGAL_CXXFLAGS) -O
\end{alltt}
%$

\section{Troubleshooting}\label{sec:troubleshooting}
\index{troubleshooting}

This section contains some remarks about known problems and the
solutions we propose. If your problem is not listed here, please have
a look at the \cgal\ homepage:
\begin{alltt}
\cgalhomepage
\end{alltt}
or send an email to \texttt{cgal@cs.uu.nl}.

\subsection{The ``Long-Name-Problem'' on IRIX6}\label{sec:longnameirix}
\index{problems with long names}\index{long name problem}

The system assembler and linker on IRIX6 cannot handle symbols with
more than 4096 characters. But this number can be exceeded where one
starts nesting templates into each other. So if you encounter strange
assembler or linker errors like
\begin{alltt}
as: Error: /var/tmp/ccPBl5vJ.s, line 41289: Truncating token: 
<some ridiculously long token snipped>
\end{alltt}
there is a good chance that you suffer from this ``long-name''
problem.

In contrast to Solaris, using the \gnu\ binutils does not work, since
\texttt{gas} has not been ported to IRIX6 yet. The solution proposed
in the GCC
faq\footnote{\path'http://gcc.gnu.org/cgi-bin/fom.cgi?file=41'} is to
compile with the (experimental) option \texttt{-fsquangle}, that
enables compression of symbol names. This option is experimental and
likely to disappear in GCC3, but there the problem will hopefully be
fixed by a new (standard) ABI.

Citing from the above FAQ:

\begin{alltt}
Note that this option is still under development, and subject to
change. Since it modifies the name mangling mechanism, you'll need to
build libstdc++ and any other C++ libraries with this option enabled.
Furthermore, if this option changes its behavior in the future, you'll
have to rebuild them all again. :-(

This option can be enabled by default by initializing
`flag_do_squangling' with `1' in `gcc/cp/decl2.c' (it is not
initialized by default), then rebuilding GCC and any C++ libraries.
\end{alltt}

\subsection{The ``Long-Name-Problem'' on Solaris}\label{sec:longnamesolaris}
\index{problems with long names}\index{long name problem}

The system assembler and linker on Solaris 2.5 and 2.6 cannot handle
symbols with more than 1024 characters. But this number is quickly
exceeded where one starts nesting templates into each other. So if you
encounter strange assembler or linker errors like 
\begin{alltt}
/usr/ccs/bin/as: "/var/tmp/cc0B5iGc.s", line 24: 
error: can't compute value of an expression involving an external symbol
\end{alltt}
there is a good chance that you suffer from this ``long-name''
problem.

A solution is to install the \gnu -binutils\footnote{see
  \path'http://www.gnu.org/software/binutils/'} and to tell the
compiler that it shall use the \gnu-- instead of the native tools.
From the compiler-menu (described in section \ref{sec:compiler-menu})
you can set the corresponding option through the custom compiler
flags, i.e. for \texttt{gcc} you would add
\begin{alltt}
  -B/my/path/to/gnu/binutils/bin
\end{alltt}
assuming you installed the \gnu -binutils executables in
\texttt{/my/path/to/gnu/binutils/bin}.

If you cannot (or do not want to) install \gnu -binutils, there is a
workaround that lets you compile, link and run your programs, but it
prevents debugging, since the executables have to be stripped. In
short the workaround is to compile with \texttt{-g} and to link with
\texttt{-z nodefs -s} on Solaris, \texttt{-U -s} on IRIX,
respectively.

In order to still have portable makefiles (see
section\ref{sec:makefiles}), we define flags
\texttt{LONG\_NAME\_PROBLEM\_CXXFLAGS} and
\texttt{LONG\_NAME\_PROBLEM\_LDFLAGS} in the include makefiles which
are empty except for the Solaris platform where they are set as stated
above. In order to use these flags, edit your application makefile and
add the flags to \texttt{CXXFLAGS} resp. \texttt{LDFLAGS} as indicated
below.
\begin{alltt}
#---------------------------------------------------------------------#
#                    compiler flags
#---------------------------------------------------------------------#
# The flag CGAL_CXXFLAGS contains the path to the compiler and is defined
# in the file CGAL_MAKEFILE. You may add your own compiler flags to CXXFLAGS.

CXXFLAGS = $(LONG_NAME_PROBLEM_CXXFLAGS) $(CGAL_CXXFLAGS) 

#---------------------------------------------------------------------#
#                    linker flags
#---------------------------------------------------------------------#
# The flag CGAL_LDFLAGS contains common linker flags and is defined
# in the file CGAL_MAKEFILE. You may add your own linker flags to CXXFLAGS.

LDFLAGS = $(LONG_NAME_PROBLEM_LDFLAGS) $(CGAL_LDFLAGS) 
\end{alltt}

\subsection{\leda\ and \stl\ conflicts}\label{subs:ledastlconfl}

If you are using an old version of \leda, the combination of \leda\ 
and \stl\ may give some problems. In order to avoid them, it is highly
recommended to use the latest \leda\ release, since this is what we
test \cgal\ with.

\index{LEDA@\leda!on \bcc}\index{LEDA@\leda!on \msvc}
With \msvc\ or \bcc, \leda\ has to be compiled and used with the
\texttt{LEDA\_STD\_HEADERS} flag set. \cgal\ uses \CC\ standard
conformant headers\footnote{the ones that do not have \texttt{.h}
  suffix}, while \leda\ can also work with the old-style header files;
but mixing the styles is strictly forbidden. Before compiling \leda\,
edit the file \texttt{\$(LEDAROOT)/incl/LEDA/system.h} and uncomment
the \texttt{\#define} in the following fragment there.
\begin{alltt}
// use c++ std headers
//#define LEDA_STD_HEADERS
\end{alltt}

\paragraph{\msvc-specific problems.}

Also, the \leda\ and \cgal\ libraries have to be compiled with the
same options controlling the use of debugging and multithreading.
\footnote{\msvc\ compilation/linking options \texttt{-ML, -MT, -MD,
    -MLD, -MTD, -MDD}}

If a binary release of \leda{} is used, make sure that it is one of
them that uses new-style headers. Namely, among the self-extracting
executables, choose one of these that have the name ending with
\texttt{-std.exe}.

\subsection{\msvc{6.0}-specific \CC\ problems}
\index{msvc@\msvc{}!specific \CC\ problems}

\cgal\ uses a modified drop-in replacement for STL, STLPort, version
3.2.1. Our modifications included
\begin{itemize}
\item modifying the code to enable
the use of \texttt{std::iterator\_traits} template, where possible;
\item providing \texttt{std::vector} class that does not use
a plain C pointer as \texttt{vector\_iterator}.
\end{itemize}
The latter allows using the full power of STL algorithms on
\texttt{std::vector} without the limitation given by the absence
of the support for partial specialization of template parameters.

Always make sure that the subdirectory
\texttt{\$(CGAL\_ROOT)/stlport/} %$
comes first in the list of additional include directories for \msvc.
This is handled automatically if you use \cgal-supplied (or \cgal-generated)
makefiles.


\paragraph{\texttt{std::iterator\_traits}} is only partially
supported, due to absence of partial specialization support in \msvc.
This means that \texttt{std::iterator\_traits<T>} must be explicitly
instantiated when \texttt{T} is a C pointer. 

\cgal\ provides
these instantiations for most commonly used primitive data types and
\cgal\ kernel types\footnote{\cgal\ \texttt{Point, Segment}, etc.}.
For other types the user must do this himself.  
This can be done by using the macro
\nonlinkedpath'CGAL_DEFINE_ITERATOR_TRAITS_POINTER_SPEC(T)'.
Note that the parameter of this macro cannot contain symbols $<$ and
$>$. Thus the macro cannot be used with types that contain $<$ and $>$
directly. However, one can be done by first define a new type using 
\texttt{typedef} and then applying the macro to this new type.
See e.g. \nonlinkedpath'examples/Getting_started/advanced_hull.C'
for an example of using this macro.

Note that this macro does not have any effect when other than
\msvc{6.0} compiler is used, so it can be safely left in the source code. 
\medskip

\textbf{Other problems.}

Here goes an incomplete list of problems encountered, and
\cgal-specific workarounds, if available.  Compiler error messages are
meant to be hints only, and do not pretend to be complete, as well.
\begin{enumerate}
%
\item Partial specialization of template parameters is not
supported. Do not use it. Error messages say that ``the class has
already been declared'', or ``unrecognizable template
declaration/definition''. See
\nonlinkedpath'config/testfiles/CGAL_CFG_NO_PARTIAL_CLASS_TEMPLATE_SPECIALISATION.C'\\
 for a test program illustrating the problem. \label{msvc::parspec}
%
\item Compiler does not always match the most
specialized instance of a function template correctly. So you get
``error C2667: none of 2 overload have a best conversion''.\\
See \texttt{config/testfiles/CGAL\_CFG\_MATCHING\_BUG\_2.C} \\
for a test program illustrating the problem.\label{msvc::matchbug2}
%
\item Compiler does not support the Koenig
lookup. That is, it does not search in the namespace of the arguments for
the function. See
\texttt{config/testfiles/CGAL\_CFG\_NO\_KOENIG\_LOOKUP.C}. \label{msvc::koenig}
%
\item A scope operator in  parameter types of a member function only
works when the function is defined inline. See
\texttt{config/testfiles/CGAL\_CFG\_NO\_SCOPE\_MEMBER\_FUNCTION\_PARAMETERS.C}. 
\label{msvc::scopememberfunc}
%
\item Passing a dependant type as template parameter cannot be done
with \texttt{typename} keyword on \msvc. Replace \texttt{typename}
by \texttt{CGAL\_TYPENAME\_MSVC\_NULL} in such places.\\ 
See \texttt{config/testfiles/CGAL\_CFG\_TYPENAME\_BUG.C}. \label{msvc::typename}
%
\item Template \texttt{friend} declarations must not contain $<>$.
Replace $<>$  by \texttt{CGAL\_NULL\_TMPL\_ARGS}.\\
See \texttt{config/testfiles/CGAL\_CFG\_NO\_TEMPLATE\_FRIEND\_DISTINCTION}.
\label{msvc::friend}
%
\item Using non-class template parameters often gives internal
  compiler errors.
%
\item Internal compiler errors can sometimes be avoided by increasing
  the amount of memory available to the compiler. Use \texttt{-Zm<number>}
option. In \cgal\ makefiles it is set to \texttt{-Zm900}, meaning
``using 900\% out of the usual memory limit''. \label{msvc::Zm}
%
\item \texttt{[...]/VC98/INCLUDE/xlocnum(268) :
    error C2587: '\_U' :\\
    illegal use of local variable as default parameter} can
  occur\footnote{For instance, in \cgal\ \texttt{Min\_circle}
    package}. The only workaround we know is to redefine the macro
  \texttt{\_VIRTUAL} in \texttt{<xlocnum>}\footnote{Yes, in the \msvc\ 
    header! You need not edit the actual file though. Copy it to
    \cgaldir\texttt{/stlport/} and edit it there. As
    \cgaldir\texttt{/stlport/} is searched by the compiler ahead of
    the other directories, your updates will be used.  DISCLAIMER:
    {\em We do not know if the actions described in this footnote are
      legal in your country. You are on your own here.}}
  to be empty. Search for\\
  \texttt{\#define~\_VIRTUAL~virtual} there and replace it by
  \texttt{\#define~\_VIRTUAL~}. \label{msvc::VIRTUAL}
%
\item Various matching failures for overloaded functions and ctors.
Use dummy parameters.
%
\item Avoid multiple forward declarations.
%
\item If necessary, simplify template parameters by using extra 
\texttt{typedef}s.
\end{enumerate}

\section{Scripts}

\subsection{\texttt{create\_makefile}}\label{sec:create_cgal_makefile}
\TTindex{create\_makefile}\index{scripts!\texttt{create\_makefile}}

The bourne-shell script \texttt{create\_makefile} is contained in the
\cgaldir\texttt{/scripts} directory. It can be used to create
makefiles for compiling \cgal\ applications. Executing
\texttt{create\_makefile} in an application directory creates a
\texttt{makefile} containing rules for every \texttt{*.C} file there.

In order to use this makefile, you have to specify the \cgal\ include
makefile (see section~\ref{sec:makefiles}) to be used. This can be
done be either setting the environment variable
\texttt{CGAL\_MAKEFILE} or by editing the line
\begin{alltt}
  # CGAL_MAKEFILE = ENTER_YOUR_INCLUDE_MAKEFILE_HERE
\end{alltt}
of the created makefile. First remove the ``\texttt{\#}'' at the
beginning of the line and then replace the text after ``\texttt{=}''
by the location of the include makefile. 

Finally type \texttt{make} to compile the application programs.

\subsection{\texttt{use\_cgal\_namespace}}\label{sec:use_cgal_namespace}
\TTindex{use\_cgal\_namespace}\index{scripts!\texttt{use\_cgal\_namespace}}

The perl script \texttt{use\_cgal\_namespace} is contained in the
\cgaldir\texttt{/scripts} directory. It can be used to convert
\cgal\texttt{-1.*} application sourcecode to the \cgal\texttt{-2.*}
format.  Basically, it replaces \texttt{CGAL\_} prefixes by
\texttt{CGAL::} namespace qualifiers. You have to give the files to
convert as arguments, e.g.
\begin{alltt}
  use_cgal_namespace my_great_file1.C *.h
\end{alltt}
The original files are kept with the suffix \texttt{.bck}.

In order to use it, you first have to set the perl path correctly,
i.e. replace \texttt{/net/bin/perl5} in the first line by the path to
perl on your system (try \texttt{which perl}(5), if you do not know).
Alternatively, you can type
\begin{alltt}
  perl -wi.bck -- use_cgal_namespace <FILES>
\end{alltt}

\lcTex{\end{appendix}}

%%
%% EOF
%%


