@c -*- mode: texinfo; coding: utf-8; -*-

@node Install, Run, Intro, Top
@chapter Installing YAP
@cindex installation


@menu
* Configuration Options:: Tuning the Functionality of YAP Machine
* Machine Options:: Tuning YAP for a Particular Machine and Compiler
@end menu

To compile YAP it should be sufficient to:

@enumerate 
@item @command{autoconf}. Recent versions of YAP try to follow GNU
conventions on where to place software.

@itemize @bullet
@item The main executable is placed at @var{$BINDIR}. This executable is
actually a script that calls the Prolog engine, stored at @var{$LIBDIR}.

@item @var{$LIBDIR} is the directory where libraries are stored. YAPLIBDIR is a
subdirectory that contains the Prolog engine and a Prolog library.

@item @var{$INCLUDEDIR} is used if you want to use YAP as a library.

@item @var{$INFODIR} is where to store @code{info} files. Usually
@file{/usr/local/info}, @file{/usr/info}, or @file{/usr/share/info}.
@end itemize

@item @command{make}.

@item If the compilation succeeds, try @command{./yap}.

@item If you feel satisfied with the result, do @command{make install}.

@item @command{make install-info} will create the info files in the
standard info directory.

@item @command{make html} will create documentation in html format in the
predefined directory.

@end enumerate
In most systems you will need to be superuser in order to do
@command{make install} and @command{make info} on the standard directories.

@node Configuration Options, Machine Options, ,Install
@section Tuning the Functionality of YAP 
@cindex syntax

Compiling YAP with the standard options give you a plain vanilla
Prolog. You can tune YAP to include extra functionality by calling
@command{configure} with the appropriate options:

@itemize @bullet
 @item @command{--enable-rational-trees=yes} gives you support for infinite
rational trees.

 @item @command{--enable-coroutining=yes} gives you support for coroutining,
including freezing of goals, attributed variables, and
constraints. This will also enable support for infinite rational
trees.

 @item @command{--enable-depth-limit=yes} allows depth limited evaluation, say for
implementing iterative deepening.

 @item @command{--enable-low-level-tracer=yes} allows support for tracing all calls,
retries, and backtracks in the system. This can help in debugging your
application, but results in performance loss.

 @item @command{--enable-wam-profile=yes} allows profiling of abstract machine
instructions. This is useful when developing YAP, should not be so
useful for normal users.

 @item @command{--enable-condor=yes} allows using the Condor system that
support High Throughput Computing (HTC) on large collections of
distributively owned computing resources.

 @item @command{--enable-tabling=yes} allows tabling support. This option
is still experimental.

 @item @command{--enable-parallelism=@{env-copy,sba,a-cow@}} allows
or-parallelism supported by one of these three forms. This option is
still highly experimental.

 @item @command{--with-max-workers} allows definition of the maximum 
number of parallel processes (its value can be consulted at runtime 
using the flag @command{max_workers}).

 @item @command{--with-gmp[=DIR]} give a path to where one can find the
@code{GMP} library if not installed in the default path.

 @item @command{--enable-threads} allows using of the multi-threading 
predicates provided by YAP. Depending on the operating system, the 
option @command{--enable-pthread-locking} may also need to be used.

 @item @command{--with-max-threads} allows definition of the maximum 
number of threads (the default value is 1024; its value can be consulted 
at runtime using the flag @code{max_threads}).

@end itemize

Next section discusses machine dependent details.

@node Machine Options, , Configuration Options,Install
@section Tuning YAP for a Particular Machine and Compiler
@cindex machine optimizations

The default options should give you best performance under
@command{GCC}. Although the system is tuned for this compiler
we have been able to compile versions of YAP under lcc in Linux,
Sun's cc compiler, IBM's xlc, SGI's cc, and Microsoft's Visual C++
6.0.

@menu
* Tuning for GCC:: Using the GNUCC compiler
* Compiling Under Visual C++:: Using Microsoft's Visual C++ environment
* Tuning for SGI cc:: Compiling Under SGI's @command{cc}
@end menu


@node Tuning for GCC, Compiling Under Visual C++, , Machine Options
@section Tuning YAP for @command{GCC}.

YAP has been developed to take advantage of @command{GCC} (but not to
depend on it). The major advantage of @command{GCC} is threaded code and
explicit register reservation.

YAP is set by default to compile with the best compilation flags we
know. Even so, a few specific options reduce portability.  The option 
@itemize @bullet
 @item @command{--enable-max-performance=yes} will try to support the best
available flags for a specific architectural model. Currently, the option
assumes a recent version of @command{GCC}.
 @item @command{--enable-debug-yap} compiles YAP so that it can be debugged
by tools such as @command{dbx} or @command{gdb}.
@end itemize

Here follow a few hints:

On x86 machines the flags:

@example
YAP_EXTRAS= ... -DBP_FREE=1
@end example

tells us to use the @code{%bp} register (frame-pointer) as the emulator's
program counter. This seems to be stable and is now default.

On  Sparc/Solaris2 use:

@example
YAP_EXTRAS= ...   -mno-app-regs -DOPTIMISE_ALL_REGS_FOR_SPARC=1
@end example

and YAP will get two extra registers! This trick does not work on
SunOS 4 machines.

Note that versions of GCC can be tweaked to recognize different
processors within the same instruction set, e.g. 486, Pentium, and
PentiumPro for the x86; or Ultrasparc, and Supersparc for
Sparc. Unfortunately, some of these tweaks do may make YAP run slower or
not at all in other machines with the same instruction set, so they
cannot be made default.

Last, the best options also depends on the version of GCC you are using, and
it is a good idea to consult the GCC manual under the menus "Invoking
GCC"/"Submodel Options". Specifically, you should check
@command{-march=XXX} for recent versions of GCC/EGCS. In the case of
@command{GCC2.7} and other recent versions of @command{GCC} you can check:

@itemize @bullet

@item 486:
In order to take advantage of 486 specific optimizations in GCC 2.7.*:

@example
YAP_EXTRAS= ... -m486 -DBP_FREE=1
@end example

@item Pentium:
@example
YAP_EXTRAS= ... -m486 -malign-loops=2 -malign-jumps=2 \
                      -malign-functions=2
@end example

@item PentiumPro and other recent Intel and AMD machines:
PentiumPros are known not to require alignment. Check your version of
@command{GCC} for the best @command{-march} option.

@item Super and UltraSparcs:
@example
YAP_EXTRAS= ... -msupersparc
@end example

@item MIPS: if have a recent machine and you need a 64 bit wide address
space you can use the abi 64 bits or eabi option, as in:
@example
CC="gcc -mabi=64" ./configure --...
@end example
Be careful. At least for some versions of @command{GCC}, compiling with
@command{-g} seems to result in broken code.

@item WIN32: GCC is distributed in the MINGW32 and CYGWIN packages.

The Mingw32 environment is available from the URL:

@url{http://www.mingw.org}

You will need to install the @command{msys} and @command{mingw}
packages. You should be able to do configure, make and make install.

If you use mingw32 you may want to search the contributed packages for
the @command{gmp} multi-precision arithmetic library. If you do setup YAP
with @code{gmp} note that @file{libgmp.dll} must be in the path,
otherwise YAP will not be able to execute.

CygWin environment is available from the URL:

@url{http://www.cygwin.com}

@noindent
and mirrors. We suggest using recent versions of the cygwin shell. The
compilation steps under the cygwin shell are as follows:

@example
mkdir cyg
$YAPSRC/configure --enable-coroutining \\
                  --enable-depth-limit \\
                  --enable-max-performance
make
make install
@end example

By default, YAP will use the @command{-mno-cygwin} option to
disable the use of the cygwin dll and to enable the mingw32 subsystem
instead. YAP thus will not need the cygwin dll. It instead accesses
the system's @file{CRTDLL.DLL} @code{C} run time library supplied with
Win32 platforms through the mingw32 interface. Note that some older
WIN95 systems may not have @file{CRTDLL.DLL}, in this case it should
be sufficient to import the file from a newer WIN95 or WIN98 machine.

You should check the default installation path which is set to
@file{/YAP} in the standard Makefile. This string will usually
be expanded into @file{c:\YAP} by Windows.

The cygwin environment does not provide @t{gmp} on the MINGW
subsystem. You can fetch a dll for the @t{gmp} library from
@url{http://www.sf.net/projects/mingwrep}.

It is also possible to configure YAP to be a part of the cygwin
environment. In this case you should use:
@example
mkdir cyg
$YAPSRC/configure --enable-max-performance \\
                  --enable-cygwin=yes
make
make install
@end example
YAP will then compile using the cygwin library and will be installed
in cygwin's @file{/usr/local}. You can use YAP from a cygwin console,
or as a standalone application as long as it can find
@file{cygwin1.dll} in its path. Note that you may use to use
@command{--enable-depth-limit} for Aleph compatibility, and that you may
want to be sure that GMP is installed.

@end itemize

@node Compiling Under Visual C++, Tuning for SGI cc, Tuning for GCC, Machine Options
@subsection  Compiling Under Visual C++

YAP compiles cleanly under Microsoft's Visual C++ release 6.0. We next
give a step-by-step tutorial on how to compile YAP manually using this
environment.

First, it is a good idea to build YAP as a DLL:

@enumerate

@item create a project named yapdll using File.New. The project will be a
DLL project, initially empty.

Notice that either the project is named yapdll or you must replace the
preprocessors variable @var{$YAPDLL_EXPORTS} to match your project names
in the files @file{YAPInterface.h} and @code{c_interface.c}.

@item add all .c files in the @file{$YAPSRC/C} directory and in the
@file{$YAPSRC\OPTYAP} directory to the Project's @code{Source Files} (use
FileView).

@item add all .h files in the @var{$YAPSRC/H} directory,
@var{$YAPSRC\include} directory and in the @var{$YAPSRC\OPTYAP}
subdirectory to the Project's @code{Header Files}.

@item Ideally, you should now use @code{m4} to generate extra  .h from .m4 files and use
@code{configure} to create a @code{config.h}. Or, you can be lazy, and
fetch these files from @var{$YAPSRC\VC\include}.

@item You may want to go to @code{Build.Set Active Configuration} and
set @code{Project Type} to @code{Release}

@item To use YAP's own include directories you have to set the Project
option  @code{Project.Project Settings.C/C++.Preprocessor.Additional Include Directories} to include the directories @var{$YAPSRC\H},
@var{$YAPSRC\VC\include}, @var{$YAPSRC\OPTYAP} and
@var{$YAPSRC\include}.  The syntax is:

@example
$YAPSRC\H, $YAPSRC\VC\include, $YAPSRC\OPTYAP, $YAPSRC\include
@end example

@item  Build: the system should generate an @file{yapdll.dll} and an @file{yapdll.lib}.

@item Copy the file @file{yapdll.dll} to your path. The file
@file{yapdll.lib} should also be copied to a location where the linker can find it.
@end enumerate

Now you are ready to create a console interface for YAP:
@enumerate
@item create a second project  say @code{wyap} with @code{File.New}. The project will be a
WIN32 console project, initially empty.

@item add @var{$YAPSRC\console\yap.c} to the @code{Source Files}.

@item add @var{$YAPSRC\VC\include\config.h} and the files in @var{$YAPSRC\include} to
the @code{Header Files}.

@item You may want to go to @code{Build.Set Active Configuration} and set
@code{Project Type} to @code{Release}.

@item you will eventually need to bootstrap the system by booting from
@code{boot.yap}, so write:

@example
        -b $YAPSRC\pl\boot.yap
@end example

        in @code{Project.Project Settings.Debug.Program Arguments}.

@item You need the sockets and yap libraries. Add

@example
ws2_32.lib yapdll.lib
@end example

to @code{Project.Project Settings.Link.Object/Library Modules}

You may also need to set the @code{Link Path} so that VC++ will find @code{yapdll.lib}.

@item set @code{Project.Project Settings.C/C++.Preprocessor.Additional Include Directories} to include the 
@var{$YAPSRC/VC/include} and
@var{$YAPSRC/include}.

The syntax is:

@example
$YAPSRC\VC\include, $YAPSRC\include
@end example

@item Build the system.

@item Use @code{Build.Start Debug} to boot the system, and then create the saved state with

@example
['$YAPSRC\\pl\\init'].
qsave_program('startup.yss').
^Z
@end example

That's it, you've got YAP and the saved state!
@end enumerate

The $YAPSRC\VC directory has the make files to build YAP4.3.17 under VC++ 6.0.

@node Tuning for SGI cc, , Compiling Under Visual C++ ,Machine Options
@subsection  Compiling Under SGI's cc

YAP should compile under the Silicon Graphic's @code{cc} compiler,
although we advise using the GNUCC compiler, if available.

@table @code
@item 64 bit
Support for 64 bits should work by using (under Bourne shell syntax):
@example
CC="cc -64" $YAP_SRC_PATH/configure --...
@end example
@end table

