2017-06-02 12:47:07 +00:00
|
|
|
|
Jbuilder - A composable build system
|
|
|
|
|
====================================
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-04-20 15:52:05 +00:00
|
|
|
|
Jbuilder is a build system designed for OCaml/Reason projects only. It
|
2017-02-28 17:20:41 +00:00
|
|
|
|
focuses on providing the user with a consistent experience and takes
|
|
|
|
|
care of most of the low-level details of OCaml compilation. All you
|
|
|
|
|
have to do is provide a description of your project and Jbuilder will
|
|
|
|
|
do the rest.
|
|
|
|
|
|
|
|
|
|
The scheme it implements is inspired from the one used inside Jane
|
|
|
|
|
Street and adapted to the open source world. It has matured over a
|
2017-08-06 09:39:42 +00:00
|
|
|
|
long time and is used daily by hundreds of developers, which means
|
2017-02-28 17:20:41 +00:00
|
|
|
|
that it is highly tested and productive.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Jbuilder comes with a [manual][manual]. If you want to get started
|
2017-11-26 19:12:23 +00:00
|
|
|
|
without reading too much, you can look at the [quick start
|
|
|
|
|
guide][quick-start] or watch [this introduction video][video].
|
2017-02-21 15:09:26 +00:00
|
|
|
|
|
2017-06-13 16:07:36 +00:00
|
|
|
|
The [example][example] directory contains examples of projects using
|
2017-06-02 12:47:07 +00:00
|
|
|
|
jbuilder.
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
[![Travis status][travis-img]][travis] [![AppVeyor status][appveyor-img]][appveyor]
|
2017-03-01 09:04:01 +00:00
|
|
|
|
|
2017-07-14 11:19:55 +00:00
|
|
|
|
[manual]: https://jbuilder.readthedocs.io/en/latest/
|
|
|
|
|
[quick-start]: https://jbuilder.readthedocs.io/en/latest/quick-start.html
|
2017-06-13 16:07:36 +00:00
|
|
|
|
[example]: https://github.com/janestreet/jbuilder/tree/master/example
|
2017-06-02 12:47:07 +00:00
|
|
|
|
[travis]: https://travis-ci.org/janestreet/jbuilder
|
2017-10-06 06:59:58 +00:00
|
|
|
|
[travis-img]: https://travis-ci.org/janestreet/jbuilder.svg?branch=master
|
2017-06-02 12:47:07 +00:00
|
|
|
|
[appveyor]: https://ci.appveyor.com/project/diml/jbuilder/branch/master
|
|
|
|
|
[appveyor-img]: https://ci.appveyor.com/api/projects/status/bn3kcxx648jt6dyt?svg=true
|
|
|
|
|
[merlin]: https://github.com/ocaml/merlin
|
|
|
|
|
[opam]: https://opam.ocaml.org
|
|
|
|
|
[jenga]: https://github.com/janestreet/jenga
|
|
|
|
|
[issues]: https://github.com/janestreet/jbuilder/issues
|
|
|
|
|
[topkg-jbuilder]: https://github.com/diml/topkg-jbuilder
|
2017-11-26 19:12:23 +00:00
|
|
|
|
[video]: https://youtu.be/BNZhmMAJarw
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Overview
|
|
|
|
|
--------
|
|
|
|
|
|
|
|
|
|
Jbuilder reads project metadata from `jbuild` files, which are either
|
2017-02-28 17:20:41 +00:00
|
|
|
|
static files in a simple S-expression syntax or OCaml scripts. It uses
|
|
|
|
|
this information to setup build rules, generate configuration files
|
2017-06-02 12:47:07 +00:00
|
|
|
|
for development tools such as [merlin][merlin], handle installation,
|
|
|
|
|
etc...
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-03-28 00:05:59 +00:00
|
|
|
|
Jbuilder itself is fast, has very low overhead and supports parallel
|
2017-02-28 17:20:41 +00:00
|
|
|
|
builds on all platforms. It has no system dependencies: all you need
|
|
|
|
|
to build jbuilder and packages using jbuilder is OCaml. You don't need
|
2017-06-02 12:47:07 +00:00
|
|
|
|
`make` or `bash` as long as the packages themselves don't use `bash`
|
2017-03-28 00:05:59 +00:00
|
|
|
|
explicitly.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-04-24 11:58:11 +00:00
|
|
|
|
Especially, one can install OCaml on Windows with a binary installer
|
|
|
|
|
and then use only the Windows Console to build Jbuilder and packages
|
|
|
|
|
using Jbuilder.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Strengths
|
|
|
|
|
---------
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Composable
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-02-28 17:20:41 +00:00
|
|
|
|
Take n repositories that use Jbuilder, arrange them in any way on the
|
|
|
|
|
file system and the result is still a single repository that Jbuilder
|
|
|
|
|
knows how to build at once.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-02-28 17:20:41 +00:00
|
|
|
|
This make simultaneous development on multiple packages trivial.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Gracefully handles multi-package repositories
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-02-28 17:20:41 +00:00
|
|
|
|
Jbuilder knows how to handle repositories containing several
|
2017-06-02 12:47:07 +00:00
|
|
|
|
packages. When building via [opam][opam], it is able to correctly use
|
2017-02-28 17:20:41 +00:00
|
|
|
|
libraries that were previously installed even if they are already
|
|
|
|
|
present in the source tree.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-03-02 18:21:19 +00:00
|
|
|
|
The magic invocation is:
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```sh
|
2017-03-02 18:21:19 +00:00
|
|
|
|
$ jbuilder build --only-packages <package-name> @install
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Building against several configurations at once
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-02-28 17:20:41 +00:00
|
|
|
|
Jbuilder is able to build a given source code repository against
|
|
|
|
|
several configurations simultaneously. This helps maintaining packages
|
|
|
|
|
across several versions of OCaml as you can tests them all at once
|
|
|
|
|
without hassle.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-02-28 17:20:41 +00:00
|
|
|
|
This feature should make cross-compilation easy, see details in the
|
2017-06-02 12:55:11 +00:00
|
|
|
|
[roadmap](ROADMAP.md).
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
This feature requires [opam][opam].
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Jenga bridge
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
[Jenga][jenga] is another build system for OCaml that has more
|
|
|
|
|
advanced features such as polling or much better editor
|
|
|
|
|
integration. Jenga is more powerful and more complex and as a result
|
2017-06-30 21:33:37 +00:00
|
|
|
|
has many more dependencies. It is planned to implement a small bridge
|
2017-06-02 12:47:07 +00:00
|
|
|
|
between the two so that a Jbuilder project can build with Jenga using
|
|
|
|
|
this bridge.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Requirements
|
|
|
|
|
------------
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
|
|
|
|
Jbuilder requires OCaml version 4.02.3 or greater.
|
|
|
|
|
|
2017-06-05 15:32:58 +00:00
|
|
|
|
installation
|
|
|
|
|
------------
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
The recommended way to install jbuilder is via the
|
|
|
|
|
[opam package manager][opam]:
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```sh
|
2017-04-21 16:34:34 +00:00
|
|
|
|
$ opam install jbuilder
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
|
|
|
|
You can also build it manually with:
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```sh
|
2017-07-18 09:17:53 +00:00
|
|
|
|
$ make release
|
2017-04-21 16:34:34 +00:00
|
|
|
|
$ make install
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-07-18 09:17:53 +00:00
|
|
|
|
Note however that `make install` requires the `opam-installer`
|
|
|
|
|
tool. Running simply `make` will build jbuilder using the development
|
|
|
|
|
settings.
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
If you do not have `make`, you can do the following:
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```sh
|
2017-04-21 16:34:34 +00:00
|
|
|
|
$ ocaml bootstrap.ml
|
|
|
|
|
$ ./boot.exe
|
|
|
|
|
$ ./_build/default/bin/main.exe install
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Support
|
|
|
|
|
-------
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
|
|
|
|
If you have questions about jbuilder, you can send an email to
|
2017-06-02 12:47:07 +00:00
|
|
|
|
ocaml-core@googlegroups.com or [open a ticket on github][issues].
|
2017-04-21 16:34:34 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Status
|
|
|
|
|
------
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-03-10 12:43:38 +00:00
|
|
|
|
Jbuilder is now in beta testing stage. Once a bit more testing has
|
|
|
|
|
been done, it will be released in 1.0.
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Roadmap
|
|
|
|
|
-------
|
2016-12-02 13:54:32 +00:00
|
|
|
|
|
2017-06-02 12:55:11 +00:00
|
|
|
|
See [the roadmap](ROADMAP.md) for the current plan. Help on any of
|
2017-06-02 12:47:07 +00:00
|
|
|
|
these points is welcome!
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
FAQ
|
|
|
|
|
---
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Why do many Jbuilder projects contain a Makefile?
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Many Jbuilder project contain a toplevel `Makefile`. It is often only
|
2017-06-30 21:33:37 +00:00
|
|
|
|
there for convenience, for the following reasons:
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
|
|
|
|
1. there are many different build systems out there, all with a
|
|
|
|
|
different CLI. If you have been hacking for a long time, the one
|
2017-06-02 12:47:07 +00:00
|
|
|
|
true invocation you know is `make && make install`, possibly
|
|
|
|
|
preceded by `./configure`
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
|
|
|
|
2. you often have a few common operations that are not part of the
|
2017-06-02 12:47:07 +00:00
|
|
|
|
build and `make <blah>` is a good way to provide them
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
3. `make` is shorter to type than `jbuilder build @install`
|
2017-03-21 14:37:35 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### How to add a configure step to a jbuilder project?
|
2017-03-21 15:56:31 +00:00
|
|
|
|
|
2017-06-09 00:50:58 +00:00
|
|
|
|
[example/sample-projects/with-configure-step](example/sample-projects/with-configure-step) shows
|
|
|
|
|
one way to do it which preserves composability; i.e. it doesn't require manually
|
|
|
|
|
running `./configure` script when working on multiple projects at the same time.
|
2017-03-21 15:56:31 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Can I use topkg with jbuilder?
|
2017-05-08 16:11:04 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Yes, have a look at the [topkg-jbuilder][topkg-jbuilder] project for
|
|
|
|
|
more details.
|
2017-05-08 16:11:04 +00:00
|
|
|
|
|
2018-01-12 15:54:59 +00:00
|
|
|
|
### Where can I find some examples of projects using Jbuilder?
|
|
|
|
|
|
|
|
|
|
The [jbuilder-universe](https://github.com/janestreet/jbuilder-universe)
|
|
|
|
|
repository contains a snapshot of the latest versions of all opam packages
|
|
|
|
|
depending on jbuilder. It is therefore a useful reference to search through
|
|
|
|
|
to find different approaches to constructing build rules.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Known issues
|
|
|
|
|
------------
|
2017-04-05 11:50:56 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Optional libraries inside a multilib directory
|
2017-04-05 11:50:56 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
https://github.com/janestreet/jbuilder/issues/51
|
2017-04-05 11:50:56 +00:00
|
|
|
|
|
|
|
|
|
If a directory contains several libraries and some are marked as
|
2017-06-02 12:47:07 +00:00
|
|
|
|
optional (by adding `(optional)` in the `(library ...)` stanza), then
|
2017-04-05 11:50:56 +00:00
|
|
|
|
the dependencies will still be required to perform the build.
|
|
|
|
|
|
|
|
|
|
This could be sorted out with some refactoring, but there is a simple
|
|
|
|
|
workaround, so it is low-priority.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
#### Workaround
|
2017-04-05 11:50:56 +00:00
|
|
|
|
|
|
|
|
|
Put each optional library in a separate directory.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### mli only modules
|
2017-06-02 12:17:28 +00:00
|
|
|
|
|
|
|
|
|
https://github.com/janestreet/jbuilder/issues/9
|
|
|
|
|
|
|
|
|
|
Due to the low-level details of OCaml compilation, it is currently
|
2017-06-02 12:47:07 +00:00
|
|
|
|
possible to write a module that has only a `.mli` and no `.ml`
|
2017-06-02 12:17:28 +00:00
|
|
|
|
file. This works as long as the mli contains only type declarations.
|
|
|
|
|
|
|
|
|
|
This is not a properly supported feature of the compiler, and in
|
|
|
|
|
particular it is not possible to alias such modules or use them as the
|
|
|
|
|
argument of a functor. Moreover, if you do write a value declaration,
|
2017-06-02 12:47:07 +00:00
|
|
|
|
or even just define an exception in the `.mli`, then you won't get an
|
2017-06-02 12:17:28 +00:00
|
|
|
|
error until the point where you link an executable using this module.
|
|
|
|
|
|
|
|
|
|
For these reason, mli only modules are not recommended by Jbuilder
|
|
|
|
|
until the compiler support them properly.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
#### Workaround
|
2017-06-02 12:17:28 +00:00
|
|
|
|
|
|
|
|
|
As long as a module type contains no value declaration, it is possible
|
|
|
|
|
to turn in to an implementation by using a recursive module:
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```ocaml
|
2017-06-02 12:17:28 +00:00
|
|
|
|
module rec M : sig
|
|
|
|
|
type t = A | B
|
|
|
|
|
end = M
|
|
|
|
|
include M
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-06-02 12:17:28 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
So if you have a module without a `.ml` file, simply generate a `.ml`
|
|
|
|
|
from the `.mli` using this trick. For instance you can add the
|
2017-06-02 12:17:28 +00:00
|
|
|
|
following rule into your jbuild file:
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```scheme
|
2017-06-02 12:17:28 +00:00
|
|
|
|
(rule (with-output-to foo.ml
|
|
|
|
|
(progn
|
|
|
|
|
(echo "module rec HACK : sig\n")
|
|
|
|
|
(cat foo.mli)
|
|
|
|
|
(echo "\nend = HACK\ninclue HACK\n"))))
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-06-02 12:17:28 +00:00
|
|
|
|
|
|
|
|
|
In fact, jbuilder will automatically add this rule if you have a
|
|
|
|
|
module without imlpementation. However it will print a warning.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Implementation details
|
|
|
|
|
----------------------
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
|
|
|
|
This section is for people who want to work on Jbuilder itself.
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Bootstrap
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
In order to build itself, Jbuilder uses an OCaml script
|
2017-06-09 00:50:58 +00:00
|
|
|
|
([bootstrap.ml](bootstrap.ml)) that dumps most of the sources of Jbuilder into a
|
|
|
|
|
single `boot.ml` file. This file is built using `ocamlopt` or `ocamlc`
|
2017-06-02 12:47:07 +00:00
|
|
|
|
and used to build everything else.
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-08-30 00:05:50 +00:00
|
|
|
|
Note that we don't include all of the sources in boot.ml. We skip a
|
|
|
|
|
few parts to speed up the build. In particular:
|
|
|
|
|
- vendored libraries are replaced by simpler implementations taken
|
|
|
|
|
from `vendor/boot`
|
|
|
|
|
- a few files in `src` have an alternative version. These alternatives
|
|
|
|
|
versions are named `XXX.boot.EXT`. For instance: `glob_lexer.boot.ml`
|
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### OCaml compatibility test
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
Install opam switches for all the entries in the
|
2017-06-09 00:50:58 +00:00
|
|
|
|
[jbuild-workspace.dev](jbuild-workspace.dev) file and run:
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```sh
|
2017-02-28 17:20:41 +00:00
|
|
|
|
$ make all-supported-ocaml-versions
|
2017-06-02 12:47:07 +00:00
|
|
|
|
```
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Repository organization
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-09 00:50:58 +00:00
|
|
|
|
- `vendor/` contains dependencies of Jbuilder, that have been vendored
|
|
|
|
|
- `plugin/` contains the API given to `jbuild` files that are OCaml
|
2017-02-28 17:20:41 +00:00
|
|
|
|
scripts
|
2017-06-09 00:50:58 +00:00
|
|
|
|
- `src/` contains the core of `Jbuilder`, as a library so that it can
|
2017-02-28 17:20:41 +00:00
|
|
|
|
be used to implement the Jenga bridge later
|
2017-06-09 00:50:58 +00:00
|
|
|
|
- `bin/` contains the command line interface
|
|
|
|
|
- `doc/` contains the manual and rules to generate the manual pages
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
### Design
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
|
|
|
|
Jbuilder was initially designed to sort out the public release of Jane
|
|
|
|
|
Street packages which became incredibly complicated over time. It is
|
|
|
|
|
still successfully used for this purpose.
|
|
|
|
|
|
|
|
|
|
One necessary feature to achieve this is the ability to precisely
|
2017-03-28 00:05:59 +00:00
|
|
|
|
report the external dependencies necessary to build a given set of
|
2017-02-28 17:20:41 +00:00
|
|
|
|
targets without running any command, just by looking at the source
|
2017-06-09 00:50:58 +00:00
|
|
|
|
tree. This is used to automatically generate the `<package>.opam`
|
2017-02-28 17:20:41 +00:00
|
|
|
|
files for all Jane Street packages.
|
|
|
|
|
|
|
|
|
|
To implement this, the build rules are described using a build arrow,
|
2017-06-09 00:50:58 +00:00
|
|
|
|
which is defined in [src/build.mli](src/build.mli). In the end it makes the
|
2017-06-02 12:47:07 +00:00
|
|
|
|
development of the internal rules of Jbuilder very composable and
|
|
|
|
|
quite pleasant.
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-03-28 00:05:59 +00:00
|
|
|
|
To deal with process multiplexing, Jbuilder uses a simplified
|
2017-06-09 00:50:58 +00:00
|
|
|
|
Lwt/Async-like monad, implemented in [src/future.mli](src/future.mli).
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-02 12:47:07 +00:00
|
|
|
|
#### Code flow
|
2017-02-28 17:20:41 +00:00
|
|
|
|
|
2017-06-09 00:50:58 +00:00
|
|
|
|
- [src/jbuild.mli](src/jbuild.mli) contains the internal representation
|
|
|
|
|
of `jbuild` files and the parsing code
|
|
|
|
|
- [src/jbuild_load.mli](src/jbuild_load.mli) contains the code to scan
|
|
|
|
|
a source tree and build the internal database by reading
|
|
|
|
|
the `jbuild` files
|
|
|
|
|
- [src/gen_rules.mli](src/gen_rules.mli) contains all the build rules
|
|
|
|
|
of Jbuilder
|
|
|
|
|
- [src/build_system.mli](src/build_system.mli) contains a trivial
|
|
|
|
|
implementation of a Build system. This is what Jenga will provide
|
|
|
|
|
when implementing the bridge
|