README
January 29, 2016 ยท View on GitHub
OCaml Boilerplate Project Skeleton
==================================
This project is a boilerplate OCaml project skeleton with the following features already integrated in it:
- The OASIS (http://oasis.forge.ocamlcore.org/) build-system,
- The OCamlDoc automatic documentation generation,
- The OUnit testing framework,
- The Bisect code coverage framework,
- A default module and submodules hierarchy.
Dependencies
In order to compile this project, you will need:
- ocaml
- findlib
- oasis
- ounit
- bisect
You can either go through opam or install it through the packaging system of your distribution. If you are going through opam:
$> opam init
$> opam install oasis ounit bisect
Setup and Build the Project
The OASIS framework is based on a setup.ml program that handle any
high-level operation on the project source (build, clean, tests, doc,
install, ...).
First, you have to generate this setup.ml file:
$> oasis setup
Then, you need to configure the build-system in order to check that all the dependancies are satisfied and to find what and where are the tools to use:
$> ocaml setup.ml -configure
Or, with the exact same result:
$> ./configure
Note that, if you want to enable the test framework, you need to add the option `--enable-tests', for example:
$> ./configure --enable-tests
Then, you can build the project:
$> make
Similarly the following commands would lead to the exact same result:
$> make build
$> ocaml setup.ml -build
Running Tests, Generating Documentation and more...
Running the test suite is only possible if you have triggered the
--enable-tests flag during the configuration phase (configure).
But, then, running the test suite only require to do:
$> make tests
Or:
$> ocaml setup.ml -tests
In the exact same way, generating the documentation with OCamlDoc is done through:
$> make doc
Or:
$> ocaml setup.ml -doc
Then, cleaning the project is done either through the clean command
or, if you want to get back to the original development distribution,
through the distclean command.
Installation and uninstallation of the software is handled by the
commands install and uninstall.
Here is a summary of all the commands of setup.ml:
-configure [options*] Configure the whole build process -build [options*] Build executables and libraries -doc [options*] Build documents -test [options*] Run tests -all [options*] Run configure, build, doc and test targets -install [options*] Install libraries, data, executables and documents -uninstall [options*] Uninstall libraries, data, executables and documents -reinstall [options*] Uninstall and install libraries, data, executables and documents -clean [options*] Clean files generated by a build -distclean [options*] Clean files generated by a build and configure -version Display version of OASIS used to generate this setup.ml -no-catch-exn Don't catch exception, useful for debugging -quiet Run quietly -info Display information message -debug Output debug message -ignore-plugins Ignore plugin's field -help, --help Display this list of options
Project Hierarchy
The project has four modules which are structured as follow:
A
+-B
|-C
+-D
Where A is the main library module of the project, B is a submodule of A.
The module B contains a factory method pattern that will create a 'b' object with either a 'c' or a 'd' implementation depending on the argument given to the factory method.
Issues and Todo-list
-
The module hierarchy is still not yet totally clear to me, we still can directly access to the B module without needing to write A.B. It would be nice to know how to prevent leakage of the API without going through A.
I guess that I need to dig a bit more in the *.mli file and in the ways to mask API.
-
The Bisect code coverage module is not yet working, it is "work in progress". I do not think it is something difficult, I just have to spend some time on it.
-
More extended OUnit2 test cases would be interesting, at least find how to use the 'bracket' feature that is used for setting/unsetting the tests context (fixtures such as SetUp and TearDown usual functions).
-
Exploring other features of OCaml... Lets see what I need in the future...