summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml')
-rw-r--r--ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml119
1 files changed, 119 insertions, 0 deletions
diff --git a/ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml b/ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml
new file mode 100644
index 0000000000..9cc944eec1
--- /dev/null
+++ b/ocaml-binary-annot/ocamlbuild/manual/myocamlbuild.ml
@@ -0,0 +1,119 @@
+(*p
+ \usepackage{xspace}
+ \newcommand{\ocb}{\texttt{ocamlbuild}\xspace}
+ \newcommand{\tags}{\texttt{\_tags}\xspace}
+*)
+let main = let module M = struct
+
+open Ocamlbuild_plugin;;
+open Command;;
+
+let pdflatex = ref (A"pdflatex");;
+let ocamlweb = ref (A"ocamlweb");;
+
+(*c dispatch is the main call of an \ocb plugin *)
+dispatch begin function
+
+ (*c Here one can change the default value of options, they can still be updated by a command line option. *)
+ | Before_options ->
+
+ (*c This will put all warnings to \texttt{ocaml\{c,opt\}} by default. *)
+ Options.ocaml_cflags := ["-w";"A"]
+
+ (*c Here one can change the final value of options. *)
+ | After_options ->
+
+ (*c This avoids the creation of symbolic links to the build directory. *)
+ Options.make_links := false
+
+ (*c This hook is called before the hygiene phase.
+ This phase also serve as collecting all the information about the
+ source tree. *)
+ | Before_hygiene ->
+
+ (*c Here you can dynamically tag some files or directories. *)
+ (*c This is done here by checking the [SOME_COND] variable which is
+ impossible in the \tags file. *)
+ if getenv "SOME_COND" ~default:"false" = "true" then
+
+ (*c By setting foo\_dir as not\_hygienic one say that the foo directory
+ can contains non hygienic files (such as \texttt{.cmi}, \texttt{.cmo}\ldots). *)
+ tag_file "foo_dir" ["not_hygienic"]
+
+ (*c One can also do things after the hygiene step. *)
+ | After_hygiene -> ()
+
+ (*c One can setup rules before the standard ones but that's not recommended. *)
+ | Before_rules -> ()
+
+ (*c Here one can add or override new rules *)
+ | After_rules ->
+
+ (*c Rules can be declared by a call of the form
+ [rule name ~prod ~dep action].
+ The first argument is the name of the rule.
+ [~prod:string] specifies the product of the rule.
+ Note that [~prods:string list] also exists.
+ [~dep] and [~deps] are for dependencies *)
+ rule "LaTeX to PDF conversion rule"
+ ~prod:"%.pdf"
+ ~dep:"%.tex"
+ begin fun env _build ->
+
+ (*c The action is a function that receive two arguments:
+ [env] is a conversion function that substitutes `\%' occurrences
+ according to the targets to which the rule applies.
+ [_build] can be called to build new things (dynamic dependencies). *)
+ let tex = env "%.tex" and _pdf = env "%.pdf" in
+
+ (*c Here we say: ``We compile the file tex form \LaTeX\xspace to PDF''.
+ Note that in fact that is a set of tags, thus the order does not
+ matter. But you got the idea. *)
+ let tags = tags_of_pathname tex++"compile"++"LaTeX"++"pdf" in
+
+ (*c Here we produce the command to run.
+ [S] is for giving a sequence of command pieces.
+ [A] is for atoms.
+ [P] is for pathnames.
+ [Px] is a special pathname that should be the main product of the
+ rule (for display purposes).
+ [T] is for tags.
+
+ The other constructors are given in the documentation of the
+ [Command] module in [Signatures.COMMAND]. *)
+ let cmd = Cmd(S[!pdflatex; T tags; P tex; Sh"< /dev/null"]) in
+ (*c Hoping that \LaTeX will converge in two iterations *)
+ Seq[cmd; cmd]
+ end;
+
+ (*c Here we make an extension of any rule that produces a command
+ containing these tags. *)
+ flag ["compile"; "LaTeX"; "pdf"; "safe"] (A"-halt-on-error");
+
+ (*c Here we give an exception: the file ``manual.tex'' is tagged ``safe''.\ocweol
+ With this tag we add the -halt-on-error flag during the \LaTeX
+ compilation. *)
+ tag_file "manual.tex" ["safe"];
+
+ (*c The generic \LaTeX rule could look at the file searching for some
+ \verb'\input{}' command, but \LaTeX is so complex that it will
+ be hard to make this solution complete.
+ Here we manually inject some dependencies at one particular point. *)
+
+ (*c The [dep] function takes tags and pathnames. This will build pathnames
+ if a command contains these tags. Note that every file [some_file_name] is
+ tagged [file:some_file_name]. *)
+ dep ["compile"; "LaTeX"; "pdf"; "file:manual.tex"]
+ ["ocamlweb.sty"; "myocamlbuild.tex"];
+
+ rule "OCaml to LaTeX conversion rule (using ocamlweb)"
+ ~prod:"%.tex"
+ ~dep:"%.ml"
+ begin fun env _build ->
+ let tex = env "%.tex" and ml = env "%.ml" in
+ let tags = tags_of_pathname ml++"ocamlweb"++"LaTeX" in
+ Cmd(S[!ocamlweb; T tags; P ml; A"-o"; Px tex])
+ end;
+end;;
+
+end in ();; \ No newline at end of file