369 lines
14 KiB
Plaintext
369 lines
14 KiB
Plaintext
Installing OCaml on a Unix machine
|
|
----------------------------------
|
|
|
|
PREREQUISITES
|
|
|
|
* The GNU C compiler gcc is recommended, as the bytecode
|
|
interpreter takes advantage of gcc-specific features to enhance
|
|
performance. gcc is the standard compiler under Linux, MacOS X,
|
|
and many other systems.
|
|
|
|
* Under MacOS X 10.5, you need version 3.1 or later of the XCode
|
|
development tools. The version of XCode found on MacOS X 10.5
|
|
installation media causes linking problems. XCode updates
|
|
are available free of charge at http://developer.apple.com/tools/xcode/
|
|
|
|
* Under MacOS X up to version 10.2.8, you must raise the limit on the
|
|
stack size with one of the following commands:
|
|
|
|
limit stacksize 64M # if your shell is zsh or tcsh
|
|
ulimit -s 65536 # if your shell is bash
|
|
|
|
* If you do not have write access to /tmp, you should set the environment
|
|
variable TMPDIR to the name of some other temporary directory.
|
|
|
|
* Under HP/UX, the GNU C compiler gcc, the GNU assembler gas, and GNU make
|
|
are all *required*. The vendor-provided compiler, assembler and make
|
|
have major problems.
|
|
|
|
* GNU make is needed to build ocamlbuild and camlp4. If your system's
|
|
default make is not GNU make, you need to define the GNUMAKE environment
|
|
variable to the name of GNU make, typically with this command:
|
|
|
|
export GNUMAKE=gnumake
|
|
|
|
INSTALLATION INSTRUCTIONS
|
|
|
|
1- Configure the system. From the top directory, do:
|
|
|
|
./configure
|
|
|
|
This generates the three configuration files "Makefile", "m.h" and "s.h"
|
|
in the config/ subdirectory.
|
|
|
|
The "configure" script accepts the following options:
|
|
|
|
-prefix <dir> (default: /usr/local)
|
|
Set the PREFIX variable used to define the defaults of the
|
|
following three options. Must be an absolute path name.
|
|
|
|
-bindir <dir> (default: $(PREFIX)/bin)
|
|
Directory where the binaries will be installed.
|
|
Must be an absolute path name, or start with "$(PREFIX)"
|
|
|
|
-libdir <dir> (default: $(PREFIX)/lib/ocaml)
|
|
Directory where the OCaml library will be installed
|
|
Must be an absolute path name, or start with "$(PREFIX)"
|
|
|
|
-mandir <dir> (default: $(PREFIX)/man/man1)
|
|
Directory where the manual pages will be installed
|
|
Must be an absolute path name, or start with "$(PREFIX)"
|
|
|
|
-cc <C compiler and options> (default: gcc if available, cc otherwise)
|
|
C compiler to use for building the system
|
|
|
|
-libs <extra libraries> (default: none)
|
|
Extra libraries to link with the system
|
|
|
|
-no-curses
|
|
Do not use the curses library.
|
|
|
|
-host <hosttype> (default: determined automatically)
|
|
The type of the host machine, in GNU's "configuration name"
|
|
format (CPU-COMPANY-SYSTEM or CPU-COMPANY-KERNEL-SYSTEM).
|
|
This info is generally determined automatically by the
|
|
"configure" script, and rarely ever needs to be provided by
|
|
hand. The installation instructions for gcc or emacs contain a
|
|
complete list of configuration names.
|
|
|
|
-target <targettype> (default: same as -host)
|
|
The type of the target machine, in GNU's "configuration name"
|
|
format (CPU-COMPANY-SYSTEM or CPU-COMPANY-KERNEL-SYSTEM).
|
|
Setting this will setup OCaml as a cross-compiler which runs on
|
|
$host and produces code for $target. This requires a C toolchain
|
|
which also produces code for $target and a native OCaml
|
|
compiler of the exact same version (if you want a cross 4.00.1,
|
|
you need a native 4.00.1).
|
|
|
|
-x11include <include_dir> (default: determined automatically)
|
|
-x11lib <lib_dir> (default: determined automatically)
|
|
Location of the X11 include directory (e.g. /usr/X11R6/include)
|
|
and the X11 library directory (e.g. /usr/X11R6/lib).
|
|
|
|
-tkdefs <cpp flags> (default: none)
|
|
-tklibs <flags and libraries> (default: determined automatically)
|
|
These options specify where to find the Tcl/Tk libraries for
|
|
LablTk. "-tkdefs" helps to find the headers, and "-tklibs"
|
|
the C libraries. "-tklibs" may contain either only -L/path and
|
|
-Wl,... flags, in which case the library names are determined
|
|
automatically, or the actual libraries, which are used as given.
|
|
Example: for a Japanese tcl/tk whose headers are in specific
|
|
directories and libraries in /usr/local/lib, you can use
|
|
./configure -tklibs "-L/usr/local/lib -ltk8.0jp -ltcl8.0jp"
|
|
-tkdefs "-I/usr/local/include/tcl8.0jp -I/usr/local/include/tk8.0jp"
|
|
|
|
-tk-no-x11
|
|
Build LablTk without using X11. This option is needed on Cygwin.
|
|
|
|
-no-tk
|
|
Do not attempt to build LablTk.
|
|
|
|
-no-pthread
|
|
Do not attempt to use POSIX threads.
|
|
|
|
-with-pthread
|
|
Attempt to use POSIX threads (this is the default).
|
|
|
|
-no-shared-libs
|
|
Do not configure support for shared libraries
|
|
|
|
-dldefs <cpp flags>
|
|
-dllibs <flags and libraries>
|
|
These options specify where to find the libraries for dynamic
|
|
linking (i.e. use of shared libraries). "-dldefs" specifies
|
|
options for finding the header files, and "-dllibs" for finding
|
|
the C libraries.
|
|
|
|
-as <assembler and options> (default: determined automatically)
|
|
The assembler to use for assembling ocamlopt-generated code.
|
|
|
|
-aspp <assembler and options> (default: determined automatically)
|
|
The assembler to use for assembling the parts of the
|
|
run-time system manually written in assembly language.
|
|
This assembler must preprocess its input with the C preprocessor.
|
|
|
|
-with-debug-runtime
|
|
Compile and install the debug version of the runtimes, useful
|
|
for debugging C stubs and other low-level code.
|
|
|
|
-verbose
|
|
Verbose output of the configuration tests. Use it if the outcome
|
|
of configure is not what you were expecting.
|
|
|
|
-no-camlp4
|
|
Do not compile Camlp4.
|
|
|
|
-no-debugger
|
|
Do not build ocamldebug.
|
|
|
|
-no-ocamldoc
|
|
Do not build ocamldoc.
|
|
|
|
-no-ocamlbuild
|
|
Do not build ocamlbuild.
|
|
|
|
-no-graph
|
|
Do not compile the Graphics library.
|
|
|
|
-partialld <linker and options> (default: determined automatically)
|
|
The linker and options to use for producing an object file
|
|
(rather than an executable) from several other object files.
|
|
|
|
Examples:
|
|
|
|
Standard installation in /usr/{bin,lib,man} instead of /usr/local:
|
|
./configure -prefix /usr
|
|
|
|
Installation in /usr, man pages in section "l":
|
|
./configure -bindir /usr/bin -libdir /usr/lib/ocaml -mandir /usr/man/manl
|
|
or:
|
|
./configure -prefix /usr -mandir '$(PREFIX)/man/manl'
|
|
|
|
On a Linux x86/64 bits host, to build a 32-bit version of OCaml:
|
|
./configure -cc "gcc -m32" -as "as --32" -aspp "gcc -m32 -c" \
|
|
-host i386-linux -partialld "ld -r -melf_i386"
|
|
|
|
On a Linux x86/64 bits host, to build the run-time system in PIC mode
|
|
(enables putting the runtime in a shared library,
|
|
at a small performance cost):
|
|
./configure -cc "gcc -fPIC" -aspp "gcc -c -fPIC"
|
|
|
|
On a MacOSX 10.5/Intel Core 2 or MacOSX 10.5/PowerPC host,
|
|
to build a 64-bit version of OCaml:
|
|
./configure -cc "gcc -m64"
|
|
|
|
On a MacOSX 10.6/Intel Core 2, to build a 32-bit version of OCaml:
|
|
./configure -cc "gcc -m32" -as "as -arch i386" -aspp "gcc -m32 -c"
|
|
|
|
For Sun Solaris with the "acc" compiler:
|
|
./configure -cc "acc -fast" -libs "-lucb"
|
|
|
|
For Sun Solaris on Sparc 64bit, to compile natively (32bit only)
|
|
./configure -cc "gcc -m32" -as "as -32" -aspp "gcc -m32 -c"
|
|
|
|
For AIX 4.3 with the IBM compiler xlc:
|
|
./configure -cc "xlc_r -D_AIX43 -Wl,-bexpall,-brtl -qmaxmem=8192"
|
|
|
|
|
|
If something goes wrong during the automatic configuration, or if the
|
|
generated files cause errors later on, then look at the template files
|
|
|
|
config/Makefile-templ
|
|
config/m-templ.h
|
|
config/s-templ.h
|
|
|
|
for guidance on how to edit the generated files by hand.
|
|
|
|
2- From the top directory, do:
|
|
|
|
make world
|
|
|
|
This builds the OCaml bytecode compiler for the first time. This
|
|
phase is fairly verbose; consider redirecting the output to a file:
|
|
|
|
make world > log.world 2>&1 # in sh
|
|
make world >& log.world # in csh
|
|
|
|
3- (Optional) To be sure everything works well, you can try to
|
|
bootstrap the system --- that is, to recompile all OCaml sources with
|
|
the newly created compiler. From the top directory, do:
|
|
|
|
make bootstrap
|
|
|
|
or, better:
|
|
|
|
make bootstrap > log.bootstrap 2>&1 # in sh
|
|
make bootstrap >& log.bootstrap # in csh
|
|
|
|
The "make bootstrap" checks that the bytecode programs compiled with
|
|
the new compiler are identical to the bytecode programs compiled with
|
|
the old compiler. If this is the case, you can be pretty sure the
|
|
system has been correctly compiled. Otherwise, this does not
|
|
necessarily mean something went wrong. The best thing to do is to try
|
|
a second bootstrapping phase: just do "make bootstrap" again. It will
|
|
either crash almost immediately, or re-re-compile everything correctly
|
|
and reach the fixpoint.
|
|
|
|
4- If your platform is supported by the native-code compiler (as
|
|
reported during the autoconfiguration), you can now build the
|
|
native-code compiler. From the top directory, do:
|
|
|
|
make opt
|
|
or:
|
|
make opt > log.opt 2>&1 # in sh
|
|
make opt >& log.opt # in csh
|
|
|
|
5- Compile fast versions of the OCaml compilers, by compiling them
|
|
with the native-code compiler (you have only compiled them to bytecode
|
|
so far). Just do:
|
|
|
|
make opt.opt
|
|
|
|
Later, you can compile your programs to bytecode using ocamlc.opt
|
|
instead of ocamlc, and to native-code using ocamlopt.opt instead of
|
|
ocamlopt. The ".opt" compilers should run faster than the normal
|
|
compilers, especially on large input files, but they may take longer
|
|
to start due to increased code size. If compilation times are an issue on
|
|
your programs, try the ".opt" compilers to see if they make a
|
|
significant difference.
|
|
|
|
An alternative, and faster approach to steps 2 to 5 is
|
|
|
|
make world.opt # to build using native-code compilers
|
|
|
|
The result is equivalent to "make world opt opt.opt", but this may
|
|
fail if anything goes wrong in native-code generation.
|
|
|
|
6- You can now install the OCaml system. This will create the
|
|
following commands (in the binary directory selected during
|
|
autoconfiguration):
|
|
|
|
ocamlc the batch bytecode compiler
|
|
ocamlopt the batch native-code compiler (if supported)
|
|
ocamlrun the runtime system for the bytecode compiler
|
|
ocamlyacc the parser generator
|
|
ocamllex the lexer generator
|
|
ocaml the interactive, toplevel-based system
|
|
ocamlmktop a tool to make toplevel systems that integrate
|
|
user-defined C primitives and OCaml code
|
|
ocamldebug the source-level replay debugger
|
|
ocamldep generator of "make" dependencies for OCaml sources
|
|
ocamldoc documentation generator
|
|
ocamlprof execution count profiler
|
|
ocamlcp the bytecode compiler in profiling mode
|
|
|
|
and also, if you built them during step 5,
|
|
|
|
ocamlc.opt the batch bytecode compiler compiled with ocamlopt
|
|
ocamlopt.opt the batch native-code compiler compiled with ocamlopt
|
|
ocamllex.opt the lexer generator compiled with ocamlopt
|
|
|
|
From the top directory, become superuser and do:
|
|
|
|
umask 022 # make sure to give read & execute permission to all
|
|
make install
|
|
|
|
7- Installation is complete. Time to clean up. From the toplevel
|
|
directory, do "make clean".
|
|
|
|
8- (Optional) The emacs/ subdirectory contains Emacs-Lisp files for an
|
|
OCaml editing mode and an interface for the debugger. To install
|
|
these files, change to the emacs/ subdirectory and do
|
|
|
|
make EMACSDIR=<directory where to install the files> install
|
|
or
|
|
make install
|
|
|
|
In the latter case, the destination directory defaults to the
|
|
"site-lisp" directory of your Emacs installation.
|
|
|
|
9- After installation, do *not* strip the ocamldebug and ocamlbrowser
|
|
executables. (These are mixed-mode executables, containing both
|
|
compiled C code and OCaml bytecode; stripping erases the bytecode!)
|
|
Other executables such as ocamlrun can safely be stripped.
|
|
|
|
IF SOMETHING GOES WRONG:
|
|
|
|
Read the "common problems" and "machine-specific hints" section at the
|
|
end of this file.
|
|
|
|
Check the files m.h and s.h in config/. Wrong endianness or alignment
|
|
constraints in m.h will immediately crash the bytecode interpreter.
|
|
|
|
If you get a "segmentation violation" signal, check the limits on the
|
|
stack size and data segment size (type "limit" under csh or
|
|
"ulimit -a" under bash). Make sure the limit on the stack size is
|
|
at least 4M.
|
|
|
|
Try recompiling the runtime system with optimizations turned off
|
|
(change CFLAGS in byterun/Makefile and asmrun/Makefile).
|
|
The runtime system contains some complex, atypical pieces of C code
|
|
that can uncover bugs in optimizing compilers. Alternatively, try
|
|
another C compiler (e.g. gcc instead of the vendor-supplied cc).
|
|
|
|
You can also build a debug version of the runtime system. Go to the
|
|
byterun/ directory and do "make ocamlrund". Then, copy ocamlrund to
|
|
../boot/ocamlrun, and try again. This version of the runtime system
|
|
contains lots of assertions and sanity checks that could help you
|
|
pinpoint the problem.
|
|
|
|
|
|
COMMON PROBLEMS:
|
|
|
|
* The Makefiles do not support parallel make (e.g. make -j2).
|
|
Fix: do not pass the -j option to make, and be patient.
|
|
|
|
* The Makefiles use the "include" directive, which is not supported by
|
|
all versions of make. Use GNU make if this is a problem.
|
|
|
|
* The Makefiles assume that make executes commands by calling /bin/sh. They
|
|
won't work if /bin/csh is called instead. You may have to unset the SHELL
|
|
environment variable, or set it to /bin/sh.
|
|
|
|
* On some systems, localization causes build problems. You should
|
|
try to set the C locale (export LC_ALL=C) before compiling if you have
|
|
strange errors while compiling OCaml.
|
|
|
|
* gcc 2.7.2.1 generates incorrect code for the runtime system in -O mode
|
|
on some Intel x86 platforms (e.g. Linux RedHat 4.1 and 4.2).
|
|
If this causes a problem, the solution is to upgrade to 2.7.2.3 or above.
|
|
|
|
* Some versions of gcc 2.96 for the Intel x86 (as found in RedHat 7.2,
|
|
Mandrake 8.0 and Mandrake 8.1) generates incorrect code for the runtime
|
|
system. The "configure" script tries to work around this problem.
|
|
|
|
* On HP 9000/700 machines under HP/UX 9. Some versions of cc are
|
|
unable to compile correctly the runtime system (wrong code is
|
|
generated for (x - y) where x is a pointer and y an integer).
|
|
Fix: use gcc.
|