Skip to content
Commits on Source (2)
......@@ -7,7 +7,7 @@
#set -x
version="1.7.3"
version="1.8.1"
# Remember the old IFS value:
oldifs="$IFS"
......@@ -184,14 +184,14 @@ echo "Configuring core..."
# Some standard Unix tools must be available:
for tool in sed awk ocaml ocamlc uname rm make cat m4 dirname basename; do
for tool in sed ocaml ocamlc uname rm make cat m4 dirname basename; do
if in_path $tool; then true; else
echo "configure: $tool not in PATH; this is required" 1>&2
exit 1
fi
done
lib_suffix=`ocamlc -config 2>/dev/null|grep '^ext_lib'|sed 's/ext_lib: //'`
lib_suffix=`ocamlc -config 2>/dev/null|tr -d '\015'|sed -n -e 's/^ext_lib: //p'`
# Check for Cygwin:
......@@ -225,7 +225,7 @@ use_cygpath=0
# Whether we have to translate Unix paths to/from Windows paths.
if [ -z "$system" ]; then
system=`ocamlc -config 2>/dev/null|grep '^system'|sed 's/system: //'`
system=`ocamlc -config 2>/dev/null|tr -d '\015'|sed -n -e 's/^system: //p'`
# This may be
# - mingw or mingw64
# - win32
......@@ -328,7 +328,11 @@ if [ -z "${ocamlfind_config}" ]; then
d="$ocaml_core_bin"
case "$d" in
*/bin)
if [ -f `dirname "$d"`/lib/findlib.conf ]; then
ocamlfind_config=`dirname "$d"`/lib/findlib.conf
else
ocamlfind_config=`dirname "$d"`/etc/findlib.conf
fi
;;
*)
ocamlfind_config=/usr/local/etc/findlib.conf
......@@ -350,18 +354,15 @@ ocaml itest-aux/remdir.ml >/dev/null 2>/dev/null || have_remdir=0
echo "Testing threading model..."
if ocamlc -vmthread >/dev/null 2>/dev/null; then
:
ocaml_threads="vm"
else
echo "The -vmthread switch is not supported: Your ocaml version is too old!"
exit 1
ocaml_threads="none"
fi
if ocamlc -config >/dev/null 2>/dev/null; then
# Good. ocamlc tells us the threading model.
if ocamlc -config | grep 'systhread_supported: true'; then
ocaml_threads="posix"
else
ocaml_threads="vm"
fi
else
# Old ocamlc do not have -config.
......@@ -372,8 +373,6 @@ else
if [ -z "$output" ]; then
ocaml_threads="posix"
else
ocaml_threads="vm"
fi
fi
......@@ -514,7 +513,10 @@ fi
# dbm?
if [ -f "${ocaml_core_stdlib}/dbm.cmi" ]; then
if [ -f "${ocaml_sitelib}/dbm/META" ]; then
echo "dbm: package already present"
ldbm=""
elif [ -f "${ocaml_core_stdlib}/dbm.cmi" ]; then
echo "dbm: found"
ldbm="dbm"
else
......@@ -524,8 +526,12 @@ fi
# num?
if [ -f "${ocaml_core_stdlib}/num.cmi" ]; then
echo "num: found"
if [ -f "${ocaml_sitelib}/num/META" ]; then
echo "num: package already present"
lnum=""
numtop=""
elif [ -f "${ocaml_core_stdlib}/num.cmi" ]; then
echo "num: found but not as package"
lnum="num num-top"
numtop="num-top"
else
......@@ -536,7 +542,8 @@ fi
# bytes?
if [ -f "${ocaml_core_stdlib}/bytes.cmi" ]; then
if [ -f "${ocaml_core_stdlib}/bytes.cmi" -o \
-f "${ocaml_core_stdlib}/stdlib__bytes.cmi" ]; then
echo "bytes: found, installing fake library"
lbytes="bytes"
cbytes=0
......@@ -556,10 +563,20 @@ else
lspacetime=""
fi
# graphics?
if [ -f "${ocaml_core_stdlib}/graphics.cmi" ]; then
echo "graphics: found"
lgraphics="graphics"
else
echo "graphics: not found"
lgraphics=""
fi
# Generate the META files now.
l="$ldbm dynlink graphics $lnum str threads unix stdlib bigarray ocamldoc $llabltk $lcamlp4 $lobuild $lcomplibs $lbytes $lspacetime"
l="$ldbm dynlink $lgraphics $lnum str threads unix stdlib bigarray ocamldoc $llabltk $lcamlp4 $lobuild $lcomplibs $lbytes $lspacetime"
for dir in site-lib-src/*; do
# We do not really know if $dir is a directory.
......
......@@ -85,6 +85,22 @@ of questions.
List of Changes
==============================================================================
- 1.8.1: Adapted to upcoming ocaml-4.09.
New API Findlib.list_packages' can specify a package prefix.
- 1.8.0: Fix reinstallation of "num" for OCaml-4.06.
Fix build with OCaml-4.07.
The installation of graphics/META is now optional.
Fix "ocamlfind query -d".
The environment variable OCAMLFIND_IGNORE_DUPS_IN is now interpreted as a
list of directories.
Packages for "ocamlfind query" may now be separated by commas, too.
New "warning" property for packages.
Forgetting to pass -thread/-vmthread only prints a warning now, but doesn't
stop the build.
For dealing with case-sensitive filesystems it is now only tried to match
ASCII characters, but not encoding-dependent characters.
- 1.7.3: Fix regarding num-top: this library is now also optional, as num.
- 1.7.2: Trying to protect against failures when several package installs are
......
......@@ -109,6 +109,27 @@ configuration files, and library routines in detail.</p>
<title>List of Changes</title>
<ul>
<li>
<p><em>1.8.1:</em> Adapted to upcoming ocaml-4.09.</p>
<p>New API Findlib.list_packages' can specify a package prefix.</p>
</li>
<li>
<p><em>1.8.0:</em> Fix reinstallation of "num" for OCaml-4.06.
</p>
<p>Fix build with OCaml-4.07.</p>
<p>The installation of graphics/META is now optional.</p>
<p>Fix "ocamlfind query -d".</p>
<p>The environment variable OCAMLFIND_IGNORE_DUPS_IN is now interpreted
as a list of directories.</p>
<p>Packages for "ocamlfind query" may now be separated by commas, too.</p>
<p>New "warning" property for packages.</p>
<p>Forgetting to pass -thread/-vmthread only prints a warning now,
but doesn't stop the build.</p>
<p>For dealing with case-sensitive filesystems it is now only tried to
match ASCII characters, but not encoding-dependent characters.</p>
</li>
<li>
<p><em>1.7.3:</em> Fix regarding num-top: this library is now also
optional, as num.</p>
......
......@@ -113,6 +113,16 @@ CLASS="LITERAL"
>).
</P
></LI
><LI
><P
>If an error is too much, it might be a good idea to
just inform the user about possible problems. In this case
you can emit a warning instead:
</P
><PRE
CLASS="PROGRAMLISTING"
>warning(pkg_q) = "Using package p and q together is a really bad idea"</PRE
></LI
></UL
><P
>Note that such error conditions should only be added if there is
......
......@@ -11,10 +11,10 @@ TITLE="The findlib Reference Manual"
HREF="index.html"><LINK
REL="UP"
TITLE="Library"
HREF="p1117.html"><LINK
HREF="p1119.html"><LINK
REL="PREVIOUS"
TITLE="Library"
HREF="p1117.html"></HEAD
HREF="p1119.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
......@@ -42,7 +42,7 @@ WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="p1117.html"
HREF="p1119.html"
ACCESSKEY="P"
>Prev</A
></TD
......@@ -65,7 +65,7 @@ WIDTH="100%"></DIV
CLASS="CHAPTER"
><H1
><A
NAME="AEN1119"
NAME="AEN1121"
></A
>Chapter 1. The findlib library</H1
><P
......@@ -92,7 +92,7 @@ WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="p1117.html"
HREF="p1119.html"
ACCESSKEY="P"
>Prev</A
></TD
......@@ -122,7 +122,7 @@ WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="p1117.html"
HREF="p1119.html"
ACCESSKEY="U"
>Up</A
></TD
......
......@@ -74,26 +74,26 @@ HREF="r759.html"
>&nbsp;--&nbsp;[File that specifies metainformation of OCaml packages]</DT
><DT
><A
HREF="r863.html"
HREF="r865.html"
>findlib.conf</A
>&nbsp;--&nbsp;[Configuration of findlib/ocamlfind]</DT
><DT
><A
HREF="r1059.html"
HREF="r1061.html"
>site-lib</A
>&nbsp;--&nbsp;[Location of package directories]</DT
></DL
></DD
><DT
>III. <A
HREF="p1117.html"
HREF="p1119.html"
>Library</A
></DT
><DD
><DL
><DT
>1. <A
HREF="c1119.html"
HREF="c1121.html"
>The findlib library</A
></DT
></DL
......
This diff is collapsed.
......@@ -3,6 +3,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Fl_metascanner.html">
<link rel="next" href="Topfind.html">
......@@ -24,36 +25,34 @@
</div>
<h1>Module <a href="type_Fl_dynload.html">Fl_dynload</a></h1>
<pre><span class="keyword">module</span> Fl_dynload: <code class="code">sig</code> <a href="Fl_dynload.html">..</a> <code class="code">end</code></pre><div class="info module top">
Utilities for loading dynamically packages<br>
<pre><span id="MODULEFl_dynload"><span class="keyword">module</span> Fl_dynload</span>: <code class="code">sig</code> <a href="Fl_dynload.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Utilities for loading dynamically packages</p>
</div>
</div>
<hr width="100%">
<pre><span id="VALload_packages"><span class="keyword">val</span> load_packages</span> : <code class="type">?debug:bool -> string list -> unit</code></pre><div class="info ">
Load the given packages and all their dependencies dynamically. Packages
<div class="info-desc">
<p>Load the given packages and all their dependencies dynamically. Packages
already loaded or already in-core are not loaded again. The predicates
are taken from <a href="Findlib.html#VALrecorded_predicates"><code class="code">Findlib.recorded_predicates</code></a>, which are normally the
predicates from the link-time of the executable.
<p>
predicates from the link-time of the executable.</p>
In order to initialize this module correctly, you need to link the
<p>In order to initialize this module correctly, you need to link the
executable in a special way. This is done by including "findlib.dynload"
in the <code class="code">ocamlfind</code> command, e.g.
<p>
in the <code class="code">ocamlfind</code> command, e.g.</p>
<pre class="codepre"><code class="code"> ocamlfind ocamlopt -o program -package findlib.dynload -linkpkg m.ml </code></pre>
<p>
It is not sufficient to just link <code class="code">findlib_dynload.cm(x)a</code> into the
<p>It is not sufficient to just link <code class="code">findlib_dynload.cm(x)a</code> into the
executable. The above command adds special initialization code that
(a) records the predicates and (b) records the packages already present
in the executable. Also <code class="code">-linkall</code> is implicitly added.
<p>
in the executable. Also <code class="code">-linkall</code> is implicitly added.</p>
The dynamic package loader works both for bytecode and native code.
<p>The dynamic package loader works both for bytecode and native code.
The META files of the packages need to specify the cma or cmxs files
in the following way:
<p>
in the following way:</p>
<ul>
<li>First, the "plugin" variable is checked (instead of "archive"), e.g.
<pre class="codepre"><code class="code">plugin(byte) = "my_plugin.cma"
......@@ -66,6 +65,6 @@ plugin(native) = "my_plugin.cmxs"
<li>Third, for native-code only, the "archive(plugin)" variable
is also accepted. This is for legacy packages.</li>
</ul>
<br>
</div>
</div>
</body></html>
......@@ -3,6 +3,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Fl_package_base.html">
<link rel="next" href="Fl_dynload.html">
......@@ -24,8 +25,10 @@
</div>
<h1>Module <a href="type_Fl_metascanner.html">Fl_metascanner</a></h1>
<pre><span class="keyword">module</span> Fl_metascanner: <code class="code">sig</code> <a href="Fl_metascanner.html">..</a> <code class="code">end</code></pre><div class="info module top">
Parses META files<br>
<pre><span id="MODULEFl_metascanner"><span class="keyword">module</span> Fl_metascanner</span>: <code class="code">sig</code> <a href="Fl_metascanner.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Parses META files</p>
</div>
</div>
<hr width="100%">
......@@ -34,8 +37,10 @@ Parses META files<br>
<pre><span id="TYPEflavour"><span class="keyword">type</span> <code class="type"></code>flavour</span> = <code class="type">[ `Appendix | `BaseDef ]</code> </pre>
<div class="info ">
<code class="code">`BaseDef</code> refers to META definitions using the "=" operator,
and <code class="code">`Appendix</code> refers to definitions using the "+=" operator.<br>
<div class="info-desc">
<p><code class="code">`BaseDef</code> refers to META definitions using the "=" operator,
and <code class="code">`Appendix</code> refers to definitions using the "+=" operator.</p>
</div>
</div>
......@@ -46,7 +51,9 @@ Parses META files<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpkg_definition.def_var">def_var</span>&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The name of the defined variable<br>
<div class="info-desc">
<p>The name of the defined variable</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -56,7 +63,9 @@ The name of the defined variable<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpkg_definition.def_flav">def_flav</span>&nbsp;: <code class="type"><a href="Fl_metascanner.html#TYPEflavour">flavour</a></code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The flavour of the definition<br>
<div class="info-desc">
<p>The flavour of the definition</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -66,7 +75,9 @@ The flavour of the definition<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpkg_definition.def_preds">def_preds</span>&nbsp;: <code class="type"><a href="Fl_metascanner.html#TYPEformal_pred">formal_pred</a> list</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The formal predicates of the def<br>
<div class="info-desc">
<p>The formal predicates of the def</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -76,19 +87,23 @@ The formal predicates of the def<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpkg_definition.def_value">def_value</span>&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The value assigned to the variable<br>
<div class="info-desc">
<p>The value assigned to the variable</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr></table>
}
<div class="info ">
A <code class="code">pkg_definition</code> is expressed by the syntax
<pre class="codepre"><code class="code"> var(p1,p2,...) = "value" </code></pre> (flavour `BaseDef),
or the syntax
<pre class="codepre"><code class="code"> var(p1,p2,...) += "value" </code></pre> (flavour `Appendix)
<div class="info-desc">
<p>A <code class="code">pkg_definition</code> is expressed by the syntax</p>
<pre class="codepre"><code class="code"> var(p1,p2,...) = "value" </code></pre><p>(flavour `BaseDef),
or the syntax</p>
<pre class="codepre"><code class="code"> var(p1,p2,...) += "value" </code></pre><p>(flavour `Appendix)
in the META file. The list of predicates may be omitted. Predicates
may be negated by using "-", e.g. "-x".<br>
may be negated by using "-", e.g. "-x".</p>
</div>
</div>
......@@ -110,68 +125,77 @@ A <code class="code">pkg_definition</code> is expressed by the syntax
}
<div class="info ">
A value of type <code class="code">pkg_expr</code> denotes the contents of a META file.
<div class="info-desc">
<p>A value of type <code class="code">pkg_expr</code> denotes the contents of a META file.
The component <code class="code">pkg_defs</code> are the variable definitions.
The component <code class="code">pkg_children</code> contains
the definitions of the subpackages.<br>
the definitions of the subpackages.</p>
</div>
</div>
<pre><span id="VALparse"><span class="keyword">val</span> parse</span> : <code class="type">Pervasives.in_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre><div class="info ">
<code class="code">parse ch:</code>
<pre><span id="VALparse"><span class="keyword">val</span> parse</span> : <code class="type">Stdlib.in_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">parse ch:</code>
scans and parses the file connected with channel <code class="code">ch</code>. The file must
have a syntax compatible with the META format. The return value
contains the found definitions for the package and all subpackages.
<p>
contains the found definitions for the package and all subpackages.</p>
<code class="code">exception Stream.Error of string:</code> is
raised on syntax errors. The string explains the error.<br>
<p><code class="code">exception Stream.Error of string:</code> is
raised on syntax errors. The string explains the error.</p>
</div>
</div>
<pre><span id="VALparse2"><span class="keyword">val</span> parse2</span> : <code class="type">Pervasives.in_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALparse2_lexing"><span class="keyword">val</span> parse2_lexing</span> : <code class="type">Lexing.lexbuf -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALparse_lexing"><span class="keyword">val</span> parse_lexing</span> : <code class="type">Lexing.lexbuf -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALprint_def"><span class="keyword">val</span> print_def</span> : <code class="type">Pervasives.out_channel -> <a href="Fl_metascanner.html#TYPEpkg_definition">pkg_definition</a> -> unit</code></pre><div class="info ">
<code class="code">print_def ch def</code>:
Outputs the definition to a channel.<br>
<pre><span id="VALparse2"><span class="keyword">val</span> parse2</span> : <code class="type">Stdlib.in_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALparse2_lexing"><span class="keyword">val</span> parse2_lexing</span> : <code class="type">Stdlib.Lexing.lexbuf -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALparse_lexing"><span class="keyword">val</span> parse_lexing</span> : <code class="type">Stdlib.Lexing.lexbuf -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a></code></pre>
<pre><span id="VALprint_def"><span class="keyword">val</span> print_def</span> : <code class="type">Stdlib.out_channel -> <a href="Fl_metascanner.html#TYPEpkg_definition">pkg_definition</a> -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">print_def ch def</code>:
Outputs the definition to a channel.</p>
</div>
</div>
<pre><span id="VALprint"><span class="keyword">val</span> print</span> : <code class="type">Pervasives.out_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a> -> unit</code></pre><div class="info ">
<code class="code">print ch expr</code>:
Outputs the package expression to a channel.<br>
<pre><span id="VALprint"><span class="keyword">val</span> print</span> : <code class="type">Stdlib.out_channel -> <a href="Fl_metascanner.html#TYPEpkg_expr">pkg_expr</a> -> unit</code></pre><div class="info ">
<div class="info-desc">
<p><code class="code">print ch expr</code>:
Outputs the package expression to a channel.</p>
</div>
</div>
<pre><span id="VALlookup"><span class="keyword">val</span> lookup</span> : <code class="type">string -> string list -> <a href="Fl_metascanner.html#TYPEpkg_definition">pkg_definition</a> list -> string</code></pre><div class="info ">
<code class="code">lookup variable_name predicate_list def</code>:
<p>
<div class="info-desc">
<p><code class="code">lookup variable_name predicate_list def</code>:</p>
Returns the value of <code class="code">variable_name</code> in <code class="code">def</code> under the assumption
that the predicates in <code class="code">predicate_list</code> hold, but no other predicates.
<p>
<p>Returns the value of <code class="code">variable_name</code> in <code class="code">def</code> under the assumption
that the predicates in <code class="code">predicate_list</code> hold, but no other predicates.</p>
The rules are as follows: In the step (A), only the <code class="code">`BaseDef</code>
<p>The rules are as follows: In the step (A), only the <code class="code">`BaseDef</code>
definitions are considered. The first base definition is determined where
all predicates are satisfied and that has the longest predicate list.
In the step (B) only the <code class="code">`Appendix</code> definitions are considered.
All definitions are determined where all predicates are satisfied.
The final result is the concatenation of the single result of (A)
and all results of (B) (in the order they are defined). A space
character is inserted between two concatenated strings.
<p>
character is inserted between two concatenated strings.</p>
When step (A) does not find any matching definition, the exception
<code class="code">Not_found</code> is raised.<br>
<p>When step (A) does not find any matching definition, the exception
<code class="code">Not_found</code> is raised.</p>
</div>
</div>
<pre><span id="VALlookup_2"><span class="keyword">val</span> lookup_2</span> : <code class="type">string -><br> string list -><br> <a href="Fl_metascanner.html#TYPEpkg_definition">pkg_definition</a> list -><br> string * <a href="Fl_metascanner.html#TYPEformal_pred">formal_pred</a> list</code></pre><div class="info ">
Like <code class="code">lookup</code>, but also returns the list of predicates that had to
be considered to select the particular variable definition.<br>
<div class="info-desc">
<p>Like <code class="code">lookup</code>, but also returns the list of predicates that had to
be considered to select the particular variable definition.</p>
</div>
</div>
<pre><span id="VALpredicate_exists"><span class="keyword">val</span> predicate_exists</span> : <code class="type">string -> <a href="Fl_metascanner.html#TYPEpkg_definition">pkg_definition</a> list -> bool</code></pre><div class="info ">
<code class="code">predicate_exists variable_name def</code>:
<p>
<div class="info-desc">
<p><code class="code">predicate_exists variable_name def</code>:</p>
Whether <code class="code">variable_name</code> is explicitly mentioned in <code class="code">def</code>.<br>
<p>Whether <code class="code">variable_name</code> is explicitly mentioned in <code class="code">def</code>.</p>
</div>
</div>
</body></html>
......@@ -3,6 +3,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Findlib.html">
<link rel="next" href="Fl_metascanner.html">
......@@ -16,8 +17,6 @@
<link title="Fl_metascanner" rel="Chapter" href="Fl_metascanner.html">
<link title="Fl_dynload" rel="Chapter" href="Fl_dynload.html">
<link title="Topfind" rel="Chapter" href="Topfind.html"><link title="The package graph" rel="Section" href="#1_Thepackagegraph">
<link title="The package graph" rel="Section" href="#1_Thepackagegraph">
<link title="Parsing META files" rel="Section" href="#1_ParsingMETAfiles">
<link title="Parsing META files" rel="Section" href="#1_ParsingMETAfiles">
<title>The Findlib Library : Fl_package_base</title>
</head>
......@@ -28,8 +27,10 @@
</div>
<h1>Module <a href="type_Fl_package_base.html">Fl_package_base</a></h1>
<pre><span class="keyword">module</span> Fl_package_base: <code class="code">sig</code> <a href="Fl_package_base.html">..</a> <code class="code">end</code></pre><div class="info module top">
Direct access to the package graph and package files<br>
<pre><span id="MODULEFl_package_base"><span class="keyword">module</span> Fl_package_base</span>: <code class="code">sig</code> <a href="Fl_package_base.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Direct access to the package graph and package files</p>
</div>
</div>
<hr width="100%">
......@@ -40,9 +41,11 @@ Direct access to the package graph and package files<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpackage.package_name">package_name</span>&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The fully qualified package name, i.e. for subpackages the
<div class="info-desc">
<p>The fully qualified package name, i.e. for subpackages the
names of the containing packages are prepended and the name
components are separated by '.'<br>
components are separated by '.'</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -52,7 +55,9 @@ The fully qualified package name, i.e. for subpackages the
<td align="left" valign="top" >
<code><span id="TYPEELTpackage.package_dir">package_dir</span>&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The directory where to lookup package files<br>
<div class="info-desc">
<p>The directory where to lookup package files</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -62,7 +67,9 @@ The directory where to lookup package files<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpackage.package_meta">package_meta</span>&nbsp;: <code class="type">string</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The path to the META file<br>
<div class="info-desc">
<p>The path to the META file</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -72,7 +79,9 @@ The path to the META file<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpackage.package_defs">package_defs</span>&nbsp;: <code class="type"><a href="Fl_metascanner.html#TYPEpkg_definition">Fl_metascanner.pkg_definition</a> list</code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
The definitions in the META file<br>
<div class="info-desc">
<p>The definitions in the META file</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr>
......@@ -82,181 +91,188 @@ The definitions in the META file<br>
<td align="left" valign="top" >
<code><span id="TYPEELTpackage.package_priv">package_priv</span>&nbsp;: <code class="type"><a href="Fl_package_base.html#TYPEpackage_priv">package_priv</a></code>;</code></td>
<td class="typefieldcomment" align="left" valign="top" ><code>(*</code></td><td class="typefieldcomment" align="left" valign="top" ><div class="info ">
Private part of the definition<br>
<div class="info-desc">
<p>Private part of the definition</p>
</div>
</div>
</td><td class="typefieldcomment" align="left" valign="bottom" ><code>*)</code></td>
</tr></table>
}
<div class="info ">
The definition of a package<br>
<div class="info-desc">
<p>The definition of a package</p>
</div>
</div>
<pre><span id="TYPEpackage_priv"><span class="keyword">type</span> <code class="type"></code>package_priv</span> </pre>
<pre><span id="VALinit"><span class="keyword">val</span> init</span> : <code class="type">string list -> string -> string option -> unit</code></pre><div class="info ">
This function must be called before <code class="code">Fl_package_base</code> can be used.
<pre><span id="VALinit"><span class="keyword">val</span> init</span> : <code class="type">string list -> string -> string list -> unit</code></pre><div class="info ">
<div class="info-desc">
<p>This function must be called before <code class="code">Fl_package_base</code> can be used.
The first string corresponds to the <code class="code">OCAMLPATH</code> setting, the second
string is the location of the standard library.
<p>
This function is called by <a href="Findlib.html#VALinit"><code class="code">Findlib.init</code></a> and <a href="Findlib.html#VALinit_manually"><code class="code">Findlib.init_manually</code></a>,
so it is already sufficient to initialize the <code class="code">Findlib</code> module.<br>
</div>
<br>
<h1 id="1_Thepackagegraph">The package graph</h1><br>
<br>
<h1 id="1_Thepackagegraph">The package graph</h1><br>
<br>
The functions in this section operate on a representation of the
string is the location of the standard library. The second is the
list of directories with ignored duplicate cmi files.</p>
<p>This function is called by <a href="Findlib.html#VALinit"><code class="code">Findlib.init</code></a> and <a href="Findlib.html#VALinit_manually"><code class="code">Findlib.init_manually</code></a>,
so it is already sufficient to initialize the <code class="code">Findlib</code> module.</p>
</div>
</div>
<h2 id="1_Thepackagegraph">The package graph</h2><p>The functions in this section operate on a representation of the
package graph in memory. The graph is usually only partially available,
as only packages are loaded that are queried for.<br>
as only packages are loaded that are queried for.</p>
<pre><span id="EXCEPTIONNo_such_package"><span class="keyword">exception</span> No_such_package</span> <span class="keyword">of</span> <code class="type">string * string</code></pre>
<div class="info ">
First arg is the package name not found, second arg contains additional
info for the user. - This is the same exception as in <code class="code">Findlib</code>.<br>
<div class="info-desc">
<p>First arg is the package name not found, second arg contains additional
info for the user. - This is the same exception as in <code class="code">Findlib</code>.</p>
</div>
</div>
<pre><span id="EXCEPTIONPackage_loop"><span class="keyword">exception</span> Package_loop</span> <span class="keyword">of</span> <code class="type">string</code></pre>
<div class="info ">
A package is required by itself. The arg is the name of the
package. - This is the same exception as in <code class="code">Findlib</code>.<br>
<div class="info-desc">
<p>A package is required by itself. The arg is the name of the
package. - This is the same exception as in <code class="code">Findlib</code>.</p>
</div>
</div>
<pre><span id="VALquery"><span class="keyword">val</span> query</span> : <code class="type">string -> <a href="Fl_package_base.html#TYPEpackage">package</a></code></pre><div class="info ">
Returns the <code class="code">package</code> definition for the fully-qualified package name,
or raises <code class="code">No_such_package</code>. It is allowed to query for subpackages.
<p>
<div class="info-desc">
<p>Returns the <code class="code">package</code> definition for the fully-qualified package name,
or raises <code class="code">No_such_package</code>. It is allowed to query for subpackages.</p>
This function loads package definitions into the graph kept in memory.<br>
<p>This function loads package definitions into the graph kept in memory.</p>
</div>
</div>
<pre><span id="VALrequires"><span class="keyword">val</span> requires</span> : <code class="type">preds:string list -> string -> string list</code></pre><div class="info ">
Analyzes the direct requirements of the package whose name is passed as
<div class="info-desc">
<p>Analyzes the direct requirements of the package whose name is passed as
second argument under the assumption that the predicates <code class="code">preds</code>
hold. The function returns the names of the required packages.
It is checked whether these packages exist.
<p>
It is checked whether these packages exist.</p>
If there is the "mt" predicate, missing dependencies on "threads"
are silently added.
<p>
<p>If there is the "mt" predicate, missing dependencies on "threads"
are silently added.</p>
The function may raise <code class="code">No_such_package</code> or <code class="code">Package_loop</code>.
<p>
<p>The function may raise <code class="code">No_such_package</code> or <code class="code">Package_loop</code>.</p>
This function loads package definitions into the graph kept in memory.<br>
<p>This function loads package definitions into the graph kept in memory.</p>
</div>
</div>
<pre><span id="VALrequires_deeply"><span class="keyword">val</span> requires_deeply</span> : <code class="type">preds:string list -> string list -> string list</code></pre><div class="info ">
Analyzes the direct or indirect requirements of the packages whose names
<div class="info-desc">
<p>Analyzes the direct or indirect requirements of the packages whose names
are passed as second argument under the assumption that the predicates
<code class="code">preds</code> hold. The function returns the names of the required packages.
It is checked whether these packages exist.
<p>
It is checked whether these packages exist.</p>
If there is the "mt" predicate, missing dependencies on "threads"
are silently added.
<p>
<p>If there is the "mt" predicate, missing dependencies on "threads"
are silently added.</p>
The function may raise <code class="code">No_such_package</code> or <code class="code">Package_loop</code>.
<p>
<p>The function may raise <code class="code">No_such_package</code> or <code class="code">Package_loop</code>.</p>
This function loads package definitions into the graph kept in memory.<br>
<p>This function loads package definitions into the graph kept in memory.</p>
</div>
</div>
<pre><span id="VALpackage_conflict_report"><span class="keyword">val</span> package_conflict_report</span> : <code class="type">?identify_dir:(string -> 'a) -> unit -> unit</code></pre><div class="info ">
Checks whether there are several META files for the same main
packages. Complaints are printed to stderr.
<p>
<div class="info-desc">
<p>Checks whether there are several META files for the same main
packages. Complaints are printed to stderr.</p>
Only packages in the loaded part of the package graph are checked (i.e.
packages for which there was a query).
<p>
<p>Only packages in the loaded part of the package graph are checked (i.e.
packages for which there was a query).</p>
It is recommended to pass the ~identify_dir function whose task
<p>It is recommended to pass the ~identify_dir function whose task
it is to return a unique value for every existing directory.
For example,
For example,</p>
<pre class="codepre"><code class="code"> fun d -&gt;
let s = Unix.stat d in
(s.Unix.st_dev, s.Unix.st_ino)
</code></pre>
could be an implementation for this function. The default is
</code></pre><p>could be an implementation for this function. The default is
the identity (and not this nice implementation to avoid dependencies
on the Unix module).<br>
on the Unix module).</p>
</div>
</div>
<pre><span id="VALmodule_conflict_report"><span class="keyword">val</span> module_conflict_report</span> : <code class="type">?identify_dir:(string -> 'a) -> string list -> unit</code></pre><div class="info ">
Checks whether there are cmi files for the same modules. The
<div class="info-desc">
<p>Checks whether there are cmi files for the same modules. The
directories passed as first argument are checked. (Note:
Neither the '+' nor the '@' notation are recognized.)
Complaints about double cmi files are printed to stderr.
<p>
Complaints about double cmi files are printed to stderr.</p>
<br>
</div>
</div>
<div class="param_info"><code class="code">identify_dir</code> : See <code class="code">package_conflict_report</code>.</div>
<pre><span id="VALload_base"><span class="keyword">val</span> load_base</span> : <code class="type">unit -> unit</code></pre><div class="info ">
Ensures that the complete package graph is loaded into memory.
<pre><span id="VALload_base"><span class="keyword">val</span> load_base</span> : <code class="type">?prefix:string -> unit -> unit</code></pre><div class="info ">
<div class="info-desc">
<p>Ensures that the complete package graph is loaded into memory.
This is a time-consuming operation. Warnings may be printed to
stderr.<br>
stderr.</p>
</div>
</div>
<div class="param_info"><code class="code">prefix</code> : Limit to the packages that starts with it. Default: unlimited</div>
<pre><span id="VALlist_packages"><span class="keyword">val</span> list_packages</span> : <code class="type">unit -> string list</code></pre><div class="info ">
Ensures that the complete package graph is loaded into memory
<pre><span id="VALlist_packages"><span class="keyword">val</span> list_packages</span> : <code class="type">?prefix:string -> unit -> string list</code></pre><div class="info ">
<div class="info-desc">
<p>Ensures that the complete package graph is loaded into memory
(like <code class="code">load_base</code>), and returns the (unsorted) list of all
packages.<br>
packages.</p>
</div>
</div>
<div class="param_info"><code class="code">prefix</code> : Limit to the packages that starts with it. Default: unlimited</div>
<pre><span id="VALpackage_users"><span class="keyword">val</span> package_users</span> : <code class="type">preds:string list -> string list -> string list</code></pre><div class="info ">
Ensures that the complete package graph is loaded into memory
<div class="info-desc">
<p>Ensures that the complete package graph is loaded into memory
(like <code class="code">load_base</code>), and determines the packages using one of
the packages passed as second argument. The <code class="code">preds</code> are assumed
for the evaluation of the <code class="code">requires</code> directives.
The returned list is sorted in ascending order.
<p>
The returned list is sorted in ascending order.</p>
If there is the "mt" predicate, missing dependencies on "threads"
are silently added.
<p>
<p>If there is the "mt" predicate, missing dependencies on "threads"
are silently added.</p>
Raises <code class="code">No_such_package</code> if one of the passed packages cannot
be found.<br>
<p>Raises <code class="code">No_such_package</code> if one of the passed packages cannot
be found.</p>
</div>
<br>
<h1 id="1_ParsingMETAfiles">Parsing META files</h1><br>
<br>
<h1 id="1_ParsingMETAfiles">Parsing META files</h1><br>
<br>
The functions in this section access directly files and directories.
The package graph is unknown.<br>
</div>
<h2 id="1_ParsingMETAfiles">Parsing META files</h2><p>The functions in this section access directly files and directories.
The package graph is unknown.</p>
<pre><span id="VALpackages_in_meta_file"><span class="keyword">val</span> packages_in_meta_file</span> : <code class="type">?directory_required:bool -><br> name:string -><br> dir:string -> meta_file:string -> unit -> <a href="Fl_package_base.html#TYPEpackage">package</a> list</code></pre><div class="info ">
Parses the META file whose name is <code class="code">meta_file</code>. In <code class="code">name</code>, the
<div class="info-desc">
<p>Parses the META file whose name is <code class="code">meta_file</code>. In <code class="code">name</code>, the
name of the main package must be passed. <code class="code">dir</code> is the
directory associated with the package by default (i.e. before
it is overriden by the "directory" directive).
<p>
it is overriden by the "directory" directive).</p>
Returns the package records found in this file. The "directory"
directive is already applied.
<p>
<p>Returns the package records found in this file. The "directory"
directive is already applied.</p>
<br>
</div>
</div>
<div class="param_info"><code class="code">directory_required</code> : If true, it is checked whether there is a
"directory" directive in the main package. If this directive is missing,
the function will fail.</div>
<pre><span id="VALpackage_definitions"><span class="keyword">val</span> package_definitions</span> : <code class="type">search_path:string list -> string -> string list</code></pre><div class="info ">
Return all META files defining this package that occur in the
<div class="info-desc">
<p>Return all META files defining this package that occur in the
directories mentioned in <code class="code">search_path</code>. The package name must be
fully-qualified. For simplicity, however, only the name of the main
package is taken into account (so it is a good idea to call this
function only for main packages).<br>
function only for main packages).</p>
</div>
</div>
</body></html>
......@@ -3,6 +3,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link rel="previous" href="Fl_dynload.html">
<link rel="Up" href="index.html">
......@@ -15,7 +16,6 @@
<link title="Fl_metascanner" rel="Chapter" href="Fl_metascanner.html">
<link title="Fl_dynload" rel="Chapter" href="Fl_dynload.html">
<link title="Topfind" rel="Chapter" href="Topfind.html"><link title="Directives" rel="Section" href="#1_Directives">
<link title="Directives" rel="Section" href="#1_Directives">
<link title="Functions and variables" rel="Section" href="#1_Functionsandvariables">
<title>The Findlib Library : Topfind</title>
</head>
......@@ -25,20 +25,18 @@
&nbsp;</div>
<h1>Module <a href="type_Topfind.html">Topfind</a></h1>
<pre><span class="keyword">module</span> Topfind: <code class="code">sig</code> <a href="Topfind.html">..</a> <code class="code">end</code></pre><div class="info module top">
Load packages from toploops and scripts
<p>
<pre><span id="MODULETopfind"><span class="keyword">module</span> Topfind</span>: <code class="code">sig</code> <a href="Topfind.html">..</a> <code class="code">end</code></pre><div class="info module top">
<div class="info-desc">
<p>Load packages from toploops and scripts</p>
The <code class="code">Topfind</code> module is part of the <code class="code">findlib</code> package. The module
<p>The <code class="code">Topfind</code> module is part of the <code class="code">findlib</code> package. The module
depends on the presence of a toploop. When building a toploop, it is
automatically linked in if "findlib" is linked in, e.g.
automatically linked in if "findlib" is linked in, e.g.</p>
<pre class="codepre"><code class="code"> ocamlfind ocamlmktop ...options... -package findlib -linkpkg
</code></pre>
<p>
When the platform supports DLLs, another possibility to get a toploop
<p>When the platform supports DLLs, another possibility to get a toploop
with findlib directives is to load the file "topfind" (normally installed
in the standard library directory):
in the standard library directory):</p>
<pre class="codepre"><code class="code"> $ ocaml
Objective Caml version 3.04
# #use "topfind";;
......@@ -51,36 +49,29 @@ Load packages from toploops and scripts
~ : unit = ()
# _
</code></pre>
<p>
This works even in scripts (but the startup message is suppressed in this
case).
<p>
<p>This works even in scripts (but the startup message is suppressed in this
case).</p>
The module is not thread-safe; if used in a multi-threaded script, all
packgage loading must have happened before the first thread forks.
<p>
<p>The module is not thread-safe; if used in a multi-threaded script, all
packgage loading must have happened before the first thread forks.</p>
The Topfind module contains some functions simplifying package loading
<p>The Topfind module contains some functions simplifying package loading
in scripts. Most important, there is a new directive <code class="code">#require</code> for
the same purpose (see below).
<p>
the same purpose (see below).</p>
The <code class="code">Topfind</code> module needs some initialization, in particular the
<p>The <code class="code">Topfind</code> module needs some initialization, in particular the
<code class="code">predicates</code> variable needs to be
set, and the packages already compiled into the toploop needs to be
declared by the <code class="code">don't_load</code>
function. If the toploop has been built by <code class="code">ocamlfind</code>,
the necessary initialization is
automatically compiled in.<br>
automatically compiled in.</p>
</div>
</div>
<hr width="100%">
<br>
<h1 id="1_Directives">Directives</h1>
<p>
<h2 id="1_Directives">Directives</h2>
<p>This module also defines the following directives for the toploop:</p>
This module also defines the following directives for the toploop:
<p>
<ul>
<li><code class="code">#require "&lt;package&gt;"</code>
loads the package (and if necessary the prerequisites of the package)</li>
......@@ -95,86 +86,86 @@ Load packages from toploops and scripts
<li><code class="code">#predicates "p1,p2,..."</code>
adds these predicates</li>
</ul>
<br>
<br>
<h1 id="1_Directives">Directives</h1>
<p>
This module also defines the following directives for the toploop:
<p>
<ul>
<li><code class="code">#require "&lt;package&gt;"</code>
loads the package (and if necessary the prerequisites of the package)</li>
<li><code class="code">#camlp4o</code>
loads camlp4 and selects standard syntax</li>
<li><code class="code">#camlp4r</code>
loads camlp4 and selects revised syntax</li>
<li><code class="code">#list</code>
lists the available packages (calls external command "ocamlfind")</li>
<li><code class="code">#thread</code>
enables multi-threading if possible</li>
<li><code class="code">#predicates "p1,p2,..."</code>
adds these predicates</li>
</ul>
<br>
<br>
<h1 id="1_Functionsandvariables">Functions and variables</h1><br>
<pre><span id="VALpredicates"><span class="keyword">val</span> predicates</span> : <code class="type">string list Pervasives.ref</code></pre><div class="info ">
The list of predicates used for package loading<br>
<h2 id="1_Functionsandvariables">Functions and variables</h2>
<pre><span id="VALpredicates"><span class="keyword">val</span> predicates</span> : <code class="type">string list Stdlib.ref</code></pre><div class="info ">
<div class="info-desc">
<p>The list of predicates used for package loading</p>
</div>
</div>
<pre><span id="VALadd_predicates"><span class="keyword">val</span> add_predicates</span> : <code class="type">string list -> unit</code></pre><div class="info ">
Adds predicates to the list of predicates<br>
<div class="info-desc">
<p>Adds predicates to the list of predicates</p>
</div>
</div>
<pre><span id="VALsyntax"><span class="keyword">val</span> syntax</span> : <code class="type">string -> unit</code></pre><div class="info ">
Emulates the <code class="code">-syntax</code> option<br>
<div class="info-desc">
<p>Emulates the <code class="code">-syntax</code> option</p>
</div>
</div>
<pre><span id="VALstandard_syntax"><span class="keyword">val</span> standard_syntax</span> : <code class="type">unit -> unit</code></pre><div class="info ">
Adds predicates that select the standard syntax. Same as
<code class="code">syntax "camlp4o"</code><br>
<div class="info-desc">
<p>Adds predicates that select the standard syntax. Same as
<code class="code">syntax "camlp4o"</code></p>
</div>
</div>
<pre><span id="VALrevised_syntax"><span class="keyword">val</span> revised_syntax</span> : <code class="type">unit -> unit</code></pre><div class="info ">
Adds predicates that select the revised syntax. Same as
<code class="code">syntax "camlp4r"</code><br>
<div class="info-desc">
<p>Adds predicates that select the revised syntax. Same as
<code class="code">syntax "camlp4r"</code></p>
</div>
</div>
<pre><span id="VALdon't_load"><span class="keyword">val</span> don't_load</span> : <code class="type">string list -> unit</code></pre><div class="info ">
The packages named in pkglist are added to the list of packages which
are already loaded.<br>
<div class="info-desc">
<p>The packages named in pkglist are added to the list of packages which
are already loaded.</p>
</div>
</div>
<pre><span id="VALdon't_load_deeply"><span class="keyword">val</span> don't_load_deeply</span> : <code class="type">string list -> unit</code></pre><div class="info ">
The packages named in pkglist and all direct and indirect ancestors
are added to the list of packages which are already loaded.<br>
<div class="info-desc">
<p>The packages named in pkglist and all direct and indirect ancestors
are added to the list of packages which are already loaded.</p>
</div>
</div>
<pre><span id="VALload"><span class="keyword">val</span> load</span> : <code class="type">string list -> unit</code></pre><div class="info ">
The packages from the passed package list are loaded, from left to
right, but packages that have already been loaded are left out.<br>
<div class="info-desc">
<p>The packages from the passed package list are loaded, from left to
right, but packages that have already been loaded are left out.</p>
</div>
</div>
<pre><span id="VALload_deeply"><span class="keyword">val</span> load_deeply</span> : <code class="type">string list -> unit</code></pre><div class="info ">
The packages from the passed package list and all direct or indirect
<div class="info-desc">
<p>The packages from the passed package list and all direct or indirect
ancestors are loaded in topological order. Packages that have already
been loaded are left out.<br>
been loaded are left out.</p>
</div>
</div>
<pre><span id="VALreset"><span class="keyword">val</span> reset</span> : <code class="type">unit -> unit</code></pre><div class="info ">
All entries in the list of loaded packages that have been added by
<div class="info-desc">
<p>All entries in the list of loaded packages that have been added by
<code class="code">load</code> or <code class="code">load_deeply</code> functions are removed from this list. This
means that if you execute the same <code class="code">load</code> or <code class="code">load_deeply</code> functions
again, the packages will be reloaded.<br>
again, the packages will be reloaded.</p>
</div>
</div>
<pre><span id="VALannounce"><span class="keyword">val</span> announce</span> : <code class="type">unit -> unit</code></pre><div class="info ">
Output the startup message<br>
<div class="info-desc">
<p>Output the startup message</p>
</div>
</div>
<pre><span id="VALlog"><span class="keyword">val</span> log</span> : <code class="type">(string -> unit) Pervasives.ref</code></pre><div class="info ">
Function used to log messages from this module.<br>
<pre><span id="VALlog"><span class="keyword">val</span> log</span> : <code class="type">(string -> unit) Stdlib.ref</code></pre><div class="info ">
<div class="info-desc">
<p>Function used to log messages from this module.</p>
</div>
</div>
</body></html>
......@@ -3,6 +3,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......@@ -16,32 +17,39 @@
</head>
<body>
<h1>The Findlib Library</h1>
<div class = "index-list">
<ul class="indexlist">
<li><a href="index_types.html">Index of types</a></li>
<li><a href="index_exceptions.html">Index of exceptions</a></li>
<li><a href="index_values.html">Index of values</a></li>
<li><a href="index_modules.html">Index of modules</a></li>
</ul>
<br/><br>
<table class="indextable">
</div>
<table class="indextable module-list">
<tr><td class="module"><a href="Findlib.html">Findlib</a></td><td><div class="info">
The primary findlib interface
<p>The primary findlib interface</p>
</div>
</td></tr>
<tr><td class="module"><a href="Fl_package_base.html">Fl_package_base</a></td><td><div class="info">
Direct access to the package graph and package files
<p>Direct access to the package graph and package files</p>
</div>
</td></tr>
<tr><td class="module"><a href="Fl_metascanner.html">Fl_metascanner</a></td><td><div class="info">
Parses META files
<p>Parses META files</p>
</div>
</td></tr>
<tr><td class="module"><a href="Fl_dynload.html">Fl_dynload</a></td><td><div class="info">
Utilities for loading dynamically packages
<p>Utilities for loading dynamically packages</p>
</div>
</td></tr>
<tr><td class="module"><a href="Topfind.html">Topfind</a></td><td><div class="info">
Load packages from toploops and scripts
<p>Load packages from toploops and scripts</p>
</div>
</td></tr>
</table>
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......@@ -18,28 +19,32 @@
&nbsp;</div>
<h1>Index of exceptions</h1>
<table>
<tr><td align="left"><br>N</td></tr>
<tr><td align="left"><div>N</div></td></tr>
<tr><td><a href="Fl_package_base.html#EXCEPTIONNo_such_package">No_such_package</a> [<a href="Fl_package_base.html">Fl_package_base</a>]</td>
<td><div class="info">
First arg is the package name not found, second arg contains additional
info for the user.
<p>First arg is the package name not found, second arg contains additional
info for the user.</p>
</div>
</td></tr>
<tr><td><a href="Findlib.html#EXCEPTIONNo_such_package">No_such_package</a> [<a href="Findlib.html">Findlib</a>]</td>
<td><div class="info">
First arg is the package name not found, second arg contains additional
info for the user
<p>First arg is the package name not found, second arg contains additional
info for the user</p>
</div>
</td></tr>
<tr><td align="left"><br>P</td></tr>
<tr><td align="left"><div>P</div></td></tr>
<tr><td><a href="Fl_package_base.html#EXCEPTIONPackage_loop">Package_loop</a> [<a href="Fl_package_base.html">Fl_package_base</a>]</td>
<td><div class="info">
A package is required by itself.
<p>A package is required by itself.</p>
</div>
</td></tr>
<tr><td><a href="Findlib.html#EXCEPTIONPackage_loop">Package_loop</a> [<a href="Findlib.html">Findlib</a>]</td>
<td><div class="info">
A package is required by itself.
<p>A package is required by itself.</p>
</div>
</td></tr>
</table>
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......
......@@ -2,6 +2,7 @@
<head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
......@@ -18,31 +19,36 @@
&nbsp;</div>
<h1>Index of modules</h1>
<table>
<tr><td align="left"><br>F</td></tr>
<tr><td align="left"><div>F</div></td></tr>
<tr><td><a href="Findlib.html">Findlib</a> </td>
<td><div class="info">
The primary findlib interface
<p>The primary findlib interface</p>
</div>
</td></tr>
<tr><td><a href="Fl_dynload.html">Fl_dynload</a> </td>
<td><div class="info">
Utilities for loading dynamically packages
<p>Utilities for loading dynamically packages</p>
</div>
</td></tr>
<tr><td><a href="Fl_metascanner.html">Fl_metascanner</a> </td>
<td><div class="info">
Parses META files
<p>Parses META files</p>
</div>
</td></tr>
<tr><td><a href="Fl_package_base.html">Fl_package_base</a> </td>
<td><div class="info">
Direct access to the package graph and package files
<p>Direct access to the package graph and package files</p>
</div>
</td></tr>
<tr><td align="left"><br>T</td></tr>
<tr><td align="left"><div>T</div></td></tr>
<tr><td><a href="Topfind.html">Topfind</a> </td>
<td><div class="info">
Load packages from toploops and scripts
<p>Load packages from toploops and scripts</p>
</div>
</td></tr>
</table>
......