src/Doc/System/Sessions.thy
changeset 48985 5386df44a037
parent 48937 e7418f8d49fe
child 49131 aa1e2ba3c697
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Doc/System/Sessions.thy	Tue Aug 28 18:57:32 2012 +0200
@@ -0,0 +1,324 @@
+theory Sessions
+imports Base
+begin
+
+chapter {* Isabelle sessions and build management \label{ch:session} *}
+
+text {* An Isabelle \emph{session} consists of a collection of related
+  theories that may be associated with formal documents (see also
+  \chref{ch:present}).  There is also a notion of \emph{persistent
+  heap} image to capture the state of a session, similar to
+  object-code in compiled programming languages.  Thus the concept of
+  session resembles that of a ``project'' in common IDE environments,
+  but the specific name emphasizes the connection to interactive
+  theorem proving: the session wraps-up the results of
+  user-interaction with the prover in a persistent form.
+
+  Application sessions are built on a given parent session, which may
+  be built recursively on other parents.  Following this path in the
+  hierarchy eventually leads to some major object-logic session like
+  @{text "HOL"}, which itself is based on @{text "Pure"} as the common
+  root of all sessions.
+
+  Processing sessions may take considerable time.  Isabelle build
+  management helps to organize this efficiently.  This includes
+  support for parallel build jobs, in addition to the multithreaded
+  theory and proof checking that is already provided by the prover
+  process itself.  *}
+
+
+section {* Session ROOT specifications \label{sec:session-root} *}
+
+text {* Session specifications reside in files called @{verbatim ROOT}
+  within certain directories, such as the home locations of registered
+  Isabelle components or additional project directories given by the
+  user.
+
+  The ROOT file format follows the lexical conventions of the
+  \emph{outer syntax} of Isabelle/Isar, see also
+  \cite{isabelle-isar-ref}.  This defines common forms like
+  identifiers, names, quoted strings, verbatim text, nested comments
+  etc.  The grammar for a single @{syntax session_entry} is given as
+  syntax diagram below; each ROOT file may contain multiple session
+  specifications like this.
+
+  Isabelle/jEdit (\secref{sec:tool-jedit}) includes a simple editing
+  mode @{verbatim "isabelle-root"} for session ROOT files.
+
+  @{rail "
+    @{syntax_def session_entry}: @'session' spec '=' (@{syntax name} '+')? body
+    ;
+    body: description? options? ( theories + ) files?
+    ;
+    spec: @{syntax name} groups? dir?
+    ;
+    groups: '(' (@{syntax name} +) ')'
+    ;
+    dir: @'in' @{syntax name}
+    ;
+    description: @'description' @{syntax text}
+    ;
+    options: @'options' opts
+    ;
+    opts: '[' ( (@{syntax name} '=' value | @{syntax name}) + ',' ) ']'
+    ;
+    value: @{syntax name} | @{syntax real}
+    ;
+    theories: @'theories' opts? ( @{syntax name} * )
+    ;
+    files: @'files' ( @{syntax name} + )
+    "}
+
+  \begin{description}
+
+  \item \isakeyword{session}~@{text "A = B + body"} defines a new
+  session @{text "A"} based on parent session @{text "B"}, with its
+  content given in @{text body} (theories and auxiliary source files).
+  Note that a parent (like @{text "HOL"}) is mandatory in practical
+  applications: only Isabelle/Pure can bootstrap itself from nothing.
+
+  All such session specifications together describe a hierarchy (tree)
+  of sessions, with globally unique names.  The new session name
+  @{text "A"} should be sufficiently long to stand on its own in a
+  potentially large library.
+
+  \item \isakeyword{session}~@{text "A (groups)"} indicates a
+  collection of groups where the new session is a member.  Group names
+  are uninterpreted and merely follow certain conventions.  For
+  example, the Isabelle distribution tags some important sessions by
+  the group name called ``@{text "main"}''.  Other projects may invent
+  their own conventions, but this requires some care to avoid clashes
+  within this unchecked name space.
+
+  \item \isakeyword{session}~@{text "A"}~\isakeyword{in}~@{text "dir"}
+  specifies an explicit directory for this session; by default this is
+  the current directory of the @{verbatim ROOT} file.
+
+  All theories and auxiliary source files are located relatively to
+  the session directory.  The prover process is run within the same as
+  its current working directory.
+
+  \item \isakeyword{description}~@{text "text"} is a free-form
+  annotation for this session.
+
+  \item \isakeyword{options}~@{text "[x = a, y = b, z]"} defines
+  separate options (\secref{sec:system-options}) that are used when
+  processing this session, but \emph{without} propagation to child
+  sessions.  Note that @{text "z"} abbreviates @{text "z = true"} for
+  Boolean options.
+
+  \item \isakeyword{theories}~@{text "options names"} specifies a
+  block of theories that are processed within an environment that is
+  augmented by the given options, in addition to the global session
+  options given before.  Any number of blocks of \isakeyword{theories}
+  may be given.  Options are only active for each
+  \isakeyword{theories} block separately.
+
+  \item \isakeyword{files}~@{text "files"} lists additional source
+  files that are involved in the processing of this session.  This
+  should cover anything outside the formal content of the theory
+  sources, say some auxiliary {\TeX} files that are required for
+  document processing.  In contrast, files that are specified in
+  formal theory headers as @{keyword "uses"} need not be declared
+  again.
+
+  \end{description}
+*}
+
+subsubsection {* Examples *}
+
+text {* See @{file "~~/src/HOL/ROOT"} for a diversity of practically
+  relevant situations, but it uses relatively complex quasi-hierarchic
+  naming conventions like @{text "HOL\<dash>SPARK"}, @{text
+  "HOL\<dash>SPARK\<dash>Examples"}.  An alternative is to use
+  unqualified names that are relatively long and descriptive, as in
+  the Archive of Formal Proofs (\url{http://afp.sf.net}), for
+  example. *}
+
+
+section {* System build options \label{sec:system-options} *}
+
+text {* See @{file "~~/etc/options"} for the main defaults provided by
+  the Isabelle distribution.  Isabelle/jEdit (\secref{sec:tool-jedit})
+  includes a simple editing mode @{verbatim "isabelle-options"} for
+  this file-format.
+
+  The @{tool_def options} tool prints Isabelle system options.  Its
+  command-line usage is:
+\begin{ttbox}
+Usage: isabelle options [OPTIONS] [MORE_OPTIONS ...]
+
+  Options are:
+    -b           include $ISABELLE_BUILD_OPTIONS
+    -x FILE      export to FILE in YXML format
+
+  Print Isabelle system options, augmented by MORE_OPTIONS given as
+  arguments NAME=VAL or NAME.
+\end{ttbox}
+
+  The command line arguments provide additional system options of the
+  form @{text "name"}@{verbatim "="}@{text "value"} or @{text name}
+  for Boolean options.
+
+  Option @{verbatim "-b"} augments the implicit environment of system
+  options by the ones of @{setting ISABELLE_BUILD_OPTIONS}, cf.\
+  \secref{sec:tool-build}.
+
+  Option @{verbatim "-x"} specifies a file to export the result in
+  YXML format, instead of printing it in human-readable form.
+*}
+
+
+section {* Invoking the build process \label{sec:tool-build} *}
+
+text {* The @{tool_def build} tool invokes the build process for
+  Isabelle sessions.  It manages dependencies between sessions,
+  related sources of theories and auxiliary files, and target heap
+  images.  Accordingly, it runs instances of the prover process with
+  optional document preparation.  Its command-line usage
+  is:\footnote{Isabelle/Scala provides the same functionality via
+  \texttt{isabelle.Build.build}.}
+\begin{ttbox}
+Usage: isabelle build [OPTIONS] [SESSIONS ...]
+
+  Options are:
+    -D DIR       include session directory and select its sessions
+    -a           select all sessions
+    -b           build heap images
+    -c           clean build
+    -d DIR       include session directory
+    -g NAME      select session group NAME
+    -j INT       maximum number of parallel jobs (default 1)
+    -l           list session source files
+    -n           no build -- test dependencies only
+    -o OPTION    override session configuration OPTION
+                 (via NAME=VAL or NAME)
+    -s           system build mode: produce output in ISABELLE_HOME
+    -v           verbose
+
+  Build and manage Isabelle sessions, depending on implicit
+  ISABELLE_BUILD_OPTIONS="..."
+
+  ML_PLATFORM="..."
+  ML_HOME="..."
+  ML_SYSTEM="..."
+  ML_OPTIONS="..."
+\end{ttbox}
+
+  \medskip Isabelle sessions are defined via session ROOT files as
+  described in (\secref{sec:session-root}).  The totality of sessions
+  is determined by collecting such specifications from all Isabelle
+  component directories (\secref{sec:components}), augmented by more
+  directories given via options @{verbatim "-d"}~@{text "DIR"} on the
+  command line.  Each such directory may contain a session
+  \texttt{ROOT} file with several session specifications.
+
+  Any session root directory may refer recursively to further
+  directories of the same kind, by listing them in a catalog file
+  @{verbatim "ROOTS"} line-by-line.  This helps to organize large
+  collections of session specifications, or to make @{verbatim "-d"}
+  command line options persistent (say within @{verbatim
+  "$ISABELLE_HOME_USER/ROOTS"}).
+
+  \medskip The subset of sessions to be managed is determined via
+  individual @{text "SESSIONS"} given as command-line arguments, or
+  session groups that are given via one or more options @{verbatim
+  "-g"}~@{text "NAME"}.  Option @{verbatim "-a"} selects all sessions.
+  The build tool takes session dependencies into account: the set of
+  selected sessions is completed by including all ancestors.
+
+  \medskip Option @{verbatim "-D"} is similar to @{verbatim "-d"}, but
+  selects all sessions that are defined in the given directories.
+
+  \medskip The build process depends on additional options
+  (\secref{sec:system-options}) that are passed to the prover
+  eventually.  The settings variable @{setting_ref
+  ISABELLE_BUILD_OPTIONS} allows to provide additional defaults, e.g.\
+  \texttt{ISABELLE_BUILD_OPTIONS="document=pdf threads=4"}. Moreover,
+  the environment of system build options may be augmented on the
+  command line via @{verbatim "-o"}~@{text "name"}@{verbatim
+  "="}@{text "value"} or @{verbatim "-o"}~@{text "name"}, which
+  abbreviates @{verbatim "-o"}~@{text "name"}@{verbatim"=true"} for
+  Boolean options.  Multiple occurrences of @{verbatim "-o"} on the
+  command-line are applied in the given order.
+
+  \medskip Option @{verbatim "-b"} ensures that heap images are
+  produced for all selected sessions.  By default, images are only
+  saved for inner nodes of the hierarchy of sessions, as required for
+  other sessions to continue later on.
+
+  \medskip Option @{verbatim "-c"} cleans all descendants of the
+  selected sessions before performing the specified build operation.
+
+  \medskip Option @{verbatim "-n"} omits the actual build process
+  after the preparatory stage (including optional cleanup).  Note that
+  the return code always indicates the status of the set of selected
+  sessions.
+
+  \medskip Option @{verbatim "-j"} specifies the maximum number of
+  parallel build jobs (prover processes).  Each prover process is
+  subject to a separate limit of parallel worker threads, cf.\ system
+  option @{system_option_ref threads}.
+
+  \medskip Option @{verbatim "-s"} enables \emph{system mode}, which
+  means that resulting heap images and log files are stored in
+  @{verbatim "$ISABELLE_HOME/heaps"} instead of the default location
+  @{setting ISABELLE_OUTPUT} (which is normally in @{setting
+  ISABELLE_HOME_USER}, i.e.\ the user's home directory).
+
+  \medskip Option @{verbatim "-v"} increases the general level of
+  verbosity.  Option @{verbatim "-l"} lists the source files that
+  contribute to a session.
+*}
+
+subsubsection {* Examples *}
+
+text {*
+  Build a specific logic image:
+\begin{ttbox}
+isabelle build -b HOLCF
+\end{ttbox}
+
+  \smallskip Build the main group of logic images:
+\begin{ttbox}
+isabelle build -b -g main
+\end{ttbox}
+
+  \smallskip Provide a general overview of the status of all Isabelle
+  sessions, without building anything:
+\begin{ttbox}
+isabelle build -a -n -v
+\end{ttbox}
+
+  \smallskip Build all sessions with HTML browser info and PDF
+  document preparation:
+\begin{ttbox}
+isabelle build -a -o browser_info -o document=pdf
+\end{ttbox}
+
+  \smallskip Build all sessions with a maximum of 8 parallel prover
+  processes and 4 worker threads each (on a machine with many cores):
+\begin{ttbox}
+isabelle build -a -j8 -o threads=4
+\end{ttbox}
+
+  \smallskip Build some session images with cleanup of their
+  descendants, while retaining their ancestry:
+\begin{ttbox}
+isabelle build -b -c HOL-Boogie HOL-SPARK
+\end{ttbox}
+
+  \smallskip Clean all sessions without building anything:
+\begin{ttbox}
+isabelle build -a -n -c
+\end{ttbox}
+
+  \smallskip Build all sessions from some other directory hierarchy,
+  according to the settings variable @{verbatim "AFP"} that happens to
+  be defined inside the Isabelle environment:
+\begin{ttbox}
+isabelle build -D '$AFP'
+\end{ttbox}
+*}
+
+end