Plasma GitLab Archive
Projects Blog Knowledge

.TH "META" "5" "The findlib package manager for OCaml" "User Manual"
.SH "NAME"
.ft R
META - [File that specifies metainformation of OCaml packages]\c
.SH "GRAMMAR"
.ft R
.ft R
.ft B
.nf
\&\ \ \ \ \ \ \ \ \ metafile\ ::=\ entry*\c
\&
.br
\&\ \ \ \ \ \ \ \ \ \ \ \ entry\ ::=\ assignment\ |\ addition\ |\ subpackage\c
\&
.br
\&\ \ \ \ \ \ \ subpackage\ ::=\ "package"\ pkgname\ '('\ metafile\ ')'\c
\&
.br
\&\ \ \ \ \ \ \ assignment\ ::=\ variable_name\ [\ formal_predicates\ ]\ '='\ \ value\c
\&
.br
\&\ \ \ \ \ \ \ \ \ addition\ ::=\ variable_name\ [\ formal_predicates\ ]\ '+='\ value\c
\&
.br
formal_predicates\ ::=\ '('\ formal_predicate\ {\ ','\ formal_predicate\ }\ ')'\c
\&
.br
\&\ \ \ \ variable_name\ ::=\ name\c
\&
.br
\&\ formal_predicate\ ::=\ name\ |\ '-'\ name\c
\&
.br
\&\ \ \ \ \ \ \ \ \ \ \ \ \ name\ ::=\ [\ 'A'-'Z'\ 'a'-'z'\ '0'-'9'\ '_'\ '.'\ ]+\c
\&
.br
\&\ \ \ \ \ \ \ \ \ \ pkgname\ ::=\ '"'\ (character\ but\ not\ '.')*\ '"'\c
\&
.br
\&\ \ \ \ \ \ \ \ \ \ \ \ value\ ::=\ '"'\ character*\ '"'\c
.ft R
.fi
.SH "DESCRIPTION"
.ft R
.ft R
If a package directory contains a file with the fixed name "META" it\c
\&  
is interpreted as described here. The file is a sequence of entries\c
\&  
following the given grammar; every entry defines a variable under a\c
\&  
certain condition given by the list of formal predicates, or it\c
\&  
introduces a subpackage.\c
.PP
.ft R
There is a list of predefined variables and a list of standard\c
\&  
predicates. These variables define: required packages, description, version\c
\&  
information, directories, archive files, and linker options. The\c
\&  
predicates denote circumstances of the application of the variables:\c
\&  
whether the bytecode or the native compiler is used, if there is a\c
\&  
toploop compiled in, details of multi-threading execution, details of\c
\&  
profiling. 
.SH "DETAILS OF THE FILE FORMAT"
.ft R
.ft R
The file consists of a sequence of entries which must be formed as the\c
\&  
grammar prescribes. The lexical tokens are names, values, and\c
\&  
interpunctuation like '(', ',' and so on. Note that linefeeds do not\c
\&  
play a special role, i.e. an entry definition may be given in more than\c
\&  
one line, or several definitions may occur on a single line. There may\c
\&  
be comments which begin with '#' and run until the end of the line.\c
.PP
.ft R
Names are sequences of the characters A-Z, a-z, 0-9, or _. Names\c
\&  
containing capital letters and names beginning with digits are\c
\&  
allowed but not recommended.\c
.PP
.ft R
Values are enclosed between double quotes. Values may contain any\c
\&  
character. The characters " and \e must be preceded by backslashes. 
.PP
.ft R
Package names must not contain the '.' character because it is used\c
\&  
as delimiter of compound names.\c
.SH "MAIN PACKAGES AND SUBPACKAGES"
.ft R
.ft R
The outermost variable assignments and additions belong to the main\c
\&  
package. The name of the main package is not defined within META;\c
\&  
it is either the name of the directory containing META or the suffix\c
\&  
of the META file (if the name of the META file is formed like\c
\&  
META.name).\c
.PP
.ft R
The keyword 
package\c
\& starts the definition\c
\&  
of a subpackage. There must not be two such definitions with the\c
\&  
same name. Within the parentheses, the variable assignments and\c
\&  
additions refer to the subpackage. It is allowed that a subpackage\c
\&  
contains further subpackages.\c
.PP
.ft R
The package name following 
package\c
\&  
is the local name relative to the main package, i.e. the\c
\&  
name of the main package is not mentioned. At all other places,\c
\&  
however, the subpackage must be prefixed by the name of the\c
\&  
containing package, separated by a '.'.\c
.PP
.ft R
Subpackages are independent of the containing package, except\c
\&  
that the subpackage points to the same installation directory as\c
\&  
the containing package (i.e. the location of the installation directory\c
\&  
is inherited from the containing package).\c
.SH "SEMANTICS OF VARIABLE DEFINITIONS"
.ft R
.ft R
In order to determine the value of a variable, first all assignments\c
\&  
are inspected, and the most specific assignment is taken (if there is\c
\&  
none, the empty string will be taken as value). In a second step,\c
\&  
all additions are gone through one after the other in the order\c
\&  
they occur in the file, and the values of all matching additions are\c
\&  
appended to the current value. In the following, it is further\c
\&  
clarified which assignment is the most specific, which additions\c
\&  
actually match, and how the details of the value addition look like.\c
.PP
.ft R
The most specific assignment is selected upon a set of actual\c
\&  
predicates, i.e. the set of predicates that are assumed to be true.\c
\&  
The predicates occurring in the definitions of assignments and\c
\&  
additions are called formal predicates. They may be positive or\c
\&  
negative; the latter are prepended by a '-' sign. In order to\c
\&  
determine the value after the evaluation of the assignments, the\c
\&  
following rules apply: 
.PP
.ft R
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
An assignment can only be used if all positive formal\c
\&  
predicates are included in the set of actual predicates, and if all\c
\&  
negative formal predicates are not included in the set of actual\c
\&  
predicates. Such an assignment is called\c
\&  
.ft B
applicable\c
.ft R
\&. If there is no such assignment, the\c
\&  
variable will have no value. 
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
If there is more than one applicable assignment, the definition with\c
\&  
the biggest number of formal predicates is selected.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
If there is still more than one applicable assignment, both applicable 
\&  
and with a maximum number of formal predicates, the definition that is defined\c
\&  
first is selected.\c
.RE
.ft R
.PP
.ft R
.ft R
An addition is matching when all positive formal predicates are\c
\&  
included in the set of actual predicates, and all negative formal\c
\&  
predicates are not included.\c
.PP
.ft R
The value of an addition is appended to the current value with\c
\&  
implicit white space as separator.\c
.SH "VARIABLES"
.ft R
.ft R
There is a set of variables with predefined meaning:\c
.PP
.ft R
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The\c
\&  
variable "directory" redefines the location of the package\c
\&  
directory. Normally, the META file is the first file read in the\c
\&  
package directory, and before any other file is read, the "directory"\c
\&  
variable is evaluated in order to see if the package directory must be\c
\&  
changed. The value of the "directory" variable is determined with an\c
\&  
empty set of actual predicates. The value must be either: an absolute\c
\&  
path name of the alternate directory, or a path name relative to the\c
\&  
stdlib directory of OCaml (written "+path"), or a normal relative path\c
\&  
name (without special syntax). In the latter case, the interpretation\c
\&  
depends on whether it is contained in a main or sub package, and\c
\&  
whether the standard repository layout or the alternate layout is in\c
\&  
effect (see 
site-lib\c
\& for these terms).\c
\&  
For a main package in standard layout the base directory is the\c
\&  
directory physically containing the META file, and the relative path\c
\&  
is interpreted for this base directory. For a main package in\c
\&  
alternate layout the base directory is the directory physically\c
\&  
containing the META.pkg files. The base directory for subpackages is\c
\&  
the package directory of the containing package. (In the case\c
\&  
that a subpackage definition does not have a "directory" setting,\c
\&  
the subpackage simply inherits the package directory of the containing\c
\&  
package. By writing a "directory" directive one can change this\c
\&  
location again.)\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "requires" specifies the list of required packages. The\c
\&  
names of the packages must be separated by white space and/or commas.\c
\&  
The names must be fully qualified (i.e. when they refer to a subpackage,\c
\&  
the names of all containing packages must be prepended, separated by\c
\&  
\&'.').\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "description" may include a short description of the\c
\&  
package (displayed by 
ocamlfind list\c
).\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "version" specifies the version string.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "archive" specifies the list of archive files. These\c
\&  
files should be given either as (1) plain names without any directory\c
\&  
information; they are only searched in the package directory.\c
\&  
(2) Or they have the form "+path" in which case the files are looked up\c
\&  
relative to the standard library. (3) Or they have the form "@name/file"\c
\&  
in which case the files are looked up in the package directory\c
\&  
of another package. (4) Or they are given as absolute paths.\c
.PP
.ft R
The\c
\&  
names of the files must be separated by white space and/or commas.\c
\&  
In the preprocessor stage, the archive files are passed as extensions\c
\&  
to the preprocessor (camlp4) call. In the linker stage (-linkpkg), the archive\c
\&  
files are linked. In the compiler stage, the archive files are ignored.\c
.PP
.ft R
Note that "archive" should only be used for archive files that are\c
\&  
intended to be included in executables or loaded into toploops. For\c
\&  
modules loaded at runtime there is the separate variable "plugin".\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "plugin" specifies the plugin archives of the package.\c
\&  
These can be dynamically loaded with the 
Fl_dynload\c
\&  
module. The plugin archives can have ".cmo", ".cma", or ".cmxs" suffix.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "linkopts" specifies additional linker options.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "error" can be used to signal error conditions. When\c
\&  
this variable is applicable, the ocaml compilers are stopped, and\c
\&  
an error message is printed. The message is the value of the variable.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "warning" can be used to signal warnings. When\c
\&  
this variable is applicable, the warning is printed, but the\c
\&  
compilation continues. The message is the value of the variable.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "exists_if" can be used to disable subpackages. The\c
\&  
value of "exists_if" is a file; the subpackage is hidden if this\c
\&  
file does not exist. You can also enumerate several files, and the\c
\&  
subpackage is hidden if none of the files exist.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "ppx" is a command that is added to the compiler invocation\c
\&  
via the -ppx option (available since OCaml-4.01). If the command is\c
\&  
relative to the current directory (e.g. ./cmd), the command is expected\c
\&  
in the package directory. The special forms as defined for "archive"\c
\&  
are also available (e.g. @otherpkg/cmd). Additional arguments can be\c
\&  
specified on the ocamlfind command line with the -ppxopt option\c
\&  
or the "ppxopt" variable.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The variable "ppxopt" is a set of options that are added to the ppx\c
\&  
rewriter invocation. The contents of the variable consists of one or\c
\&  
several whitespace-separated parts. Every part consists of several\c
\&  
comma-separated subparts; the first subpart indicates the package\c
\&  
that contains the ppx rewriter invocation, the rest contain the options\c
\&  
to be appended. If the option is a path relative to the current directory\c
\&  
(e.g. ./foo.cma), the path is expanded relative to the package directory.\c
\&  
The special forms as defined for "archive" are also available\c
\&  
(e.g. @otherpkg/foo.cma).\c
.RE
.ft R
.PP
.ft R
.ft R
It is possible to define additional variables but there is currently\c
\&  
no software interpreting them.\c
.SH "PREDICATES"
.ft R
.ft R
There is a list of standard predicates:\c
.PP
.ft R
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "byte" predicate means that the bytecode compiler is used.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "native" predicate means that the native compiler is used.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "toploop" predicate means that the toploop is available in the\c
\&  
linked program. It is only set when the toploop is running, not when\c
\&  
the toploop is generated.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "create_toploop" predicate means that a toploop is created (using\c
\&  
ocamlmktop).\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "mt" predicate means that the program is multi-threaded.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "mt_posix" predicate means that in the case "mt" is set, too, the\c
\&  
POSIX libraries are used to implement threads.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "mt_vm" predicate means that in the case "mt" is set, too, the\c
\&  
VM-based libraries are used to implement threads.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "gprof" predicate means that in the case "native" is set, too, the\c
\&  
program is compiled for profiling\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "autolink" predicate means that ocamlc can/will perform automatic linking.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "preprocessor" predicate means that the META variables are scanned for\c
\&  
preprocessor options.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
The "syntax" predicate means that the -syntax option is present on the\c
\&  
command line.\c
.RE
.ft R
.sp
.RS "7m"
.ft R
\&\h'-3m'\z\(bu\h'3m'\c
.ft R
Legacy: The "plugin" predicate could be used in some versions of findlib\c
\&  
to select cmxs archives instead of cmxa archives. This use is still possible\c
\&  
but discouraged.\c
.RE
.ft R
.PP
.ft R
.ft R
In addition to these predicates, there are package predicates\c
\&  
for every package that is finally selected. Of course, this kind of\c
\&  
predicate must not be used to select "directory" and "requires"\c
\&  
variables, but for the other variables they are perfectly valid.\c
\&  
The package predicates have the form "pkg_" plus the name of the\c
\&  
package (fully qualified).\c

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml