FIX Install target
M README.md +871 -1
@@ 1,1 1,871 @@ 
-[![builds.sr.ht status](https://builds.sr.ht/~mmatalka/pds.svg)](https://builds.sr.ht/~mmatalka/pds?)
+-[![builds.sr.ht status](https://builds.sr.ht/~mmatalka/pds.svg)](https://builds.sr.ht/~mmatalka/pds?)
+
+# Table of Contents
+
+1.  [About](#org4d407a9)
+    1.  [Why Does This Exist?](#orgf2359bb)
+2.  [Parallelism](#org8802aa0)
+3.  [Content Hash Based Builds](#org1910cf1)
+4.  [Terminology](#org6d61324)
+5.  [Projects](#orgac41c0a)
+    1.  [Ocaml](#org764fbf3)
+    2.  [Third-party](#orgeb67f29)
+6.  [Dependencies](#orgbfc8789)
+7.  [Configuration](#org0d142cb)
+    1.  [Configuration Variables For Projects](#org3e4424f)
+    2.  [Configuration Variables For Tests](#orgc22df3d)
+    3.  [Outputting the configuration](#orgd51a282)
+8.  [Produced Files](#org531c6d6)
+9.  [Documentation](#orga80a0b5)
+10. [Selectors](#org1380185)
+11. [Changelog](#org4d29c9b)
+    1.  [1.0.0](#org9e91524)
+    2.  [1.1.0](#orgb820221)
+    3.  [2.0.0](#orgc62cbaa)
+    4.  [3.0.0](#org84e93aa)
+    5.  [3.0.1](#org094f8fc)
+    6.  [3.0.2](#org32f6532)
+    7.  [3.0.3](#org1840326)
+    8.  [3.0.4](#org92f6fe6)
+    9.  [3.1.0](#org59d8cf0)
+    10. [3.1.1](#orgf69fc75)
+    11. [4.11](#org93a61f8)
+    12. [4.12](#org88484a8)
+    13. [4.13](#org5e6c3d1)
+    14. [5.14](#org015dacc)
+    15. [5.15](#orgdd7d38b)
+    16. [5.16](#orgf4d3fe6)
+    17. [5.17 (bug release)](#orgba9ee52)
+    18. [5.18](#org47f8132)
+    19. [5.19](#org55822ce)
+    20. [6.20](#org00d0582)
+    21. [5.21](#org992589e)
+    22. [5.22](#org2a7a6fd)
+    23. [5.23](#org862685f)
+    24. [5.24](#orgb4ddbc1)
+    25. [5.25](#orgaf4b17a)
+    26. [5.26 (bug release)](#org2faefce)
+    27. [5.27](#org7cf7066)
+    28. [5.28](#orgb8e749f)
+    29. [5.29](#org6b3e578)
+    30. [6.43](#org682ad5f)
+    31. [6.44](#orgfdbaa88)
+
+
+<a id="org4d407a9"></a>
+
+# About
+
+pds is a build system for Ocaml that is meant to make it easy to build a project
+that follows a particular layout by generating a makefile for the project.  The
+input to pds is a config file, `pds.conf`, and a directory structure, which is
+always the current working directory, and the output is the build description.
+
+The directory layout looks like:
+
+    .
+     /src
+         /proj1
+         /proj2
+         /proj3
+     /tests
+        /test1/test.ml
+        /test2/test.ml
+
+The `pds.conf` for this project might look like:
+
+    [src.proj1]
+    type = "exec"
+    deps = [ "core", "proj2", "proj3" ]
+    install = true
+    install_cmd = "cp -vf proj1.native $(PREFIX)/bin/proj1"
+    remove_cmd = "rm -v $(PREFIX)/bin/proj1"
+    
+    [src.proj2]
+    deps = [ "proj3" ]
+    install = false
+    
+    [src.proj3]
+    deps = [ "str" ]
+    install = false
+    
+    [tests.test1]
+    deps = [ "proj2" ]
+    
+    [tests.test2]
+    deps = [ "proj1" ]
+
+Finally, by using the standard `Makefile` definition below, `make test` will
+compile all the code and run the tests.  `make install` will install proj1.  And
+`make remove` will remove it.
+
+    all:
+    	pds
+    	$(MAKE) -f pds.mk all
+    
+    %:
+    	pds
+    	$(MAKE) -f pds.mk $*
+
+pds supports multiple types of builds, at this time `release`, `debug`,
+`profile`, and `docs`.  The `release` build must always exist and is what
+running `make` with no target will execute.  The `debug` and `profile` builds
+will inherit all configuration from the release build and options can be
+overridden.  pds also supports tests, and the existing test targets are: `test`,
+`test-debug`, and `test-profile`, which run tests for the respective builds.
+
+pds builds into the `build` directory and each build type is a sub-directory in
+the `build` directory, for example `build/release`, `build/docs`, or
+`build/test-release`.
+
+
+<a id="orgf2359bb"></a>
+
+## Why Does This Exist?
+
+Ocaml has multiple build systems, so it is probably confusing and frustrating to
+learn that another one has been created.  In the author's experience, many of
+the Ocaml build tools are more complicated than the value they add.  pds is
+meant to be simple but play nice with other tools.  If you've felt frustrated by
+the existing tooling, then pds might work well for you.  If you are happy with
+the existing tooling then you should be able to safely ignore pds because it
+meant to be non-intrusive.
+
+
+<a id="org8802aa0"></a>
+
+# Parallelism
+
+pds supports parallel builds.  The amount of parallelism is specified with the
+`-j` option in `make`.  A repository with multiple projects in it will
+parallelize the build across those projects.  That is, if there is `proj1` and
+`proj2` that do not depend on each other, they will be built in parallel.
+Inside of an Ocaml project, if every `.ml` file in the project has an associated
+`.mli` file, the project will be built in parallel.  If there is any `.ml` file
+that does not have a `.mli` file, the project will be built in serial.  The
+reason for this is when compiling a `.ml` file that does not have a `.mli` file,
+both `ocamlc` and `ocamlopt` generate a `.cmi` file even if the `.cmi` file
+already exists.  With a parallel build, the byte code and native code builds
+will be executed in parallel.  If the project is built in parallel, the
+generation of the `.cmi` file can overlap, generating compiler errors.  This is
+the source of the `units Foo and Bar make inconsistent assumptions about Baz`
+error.
+
+
+<a id="org1910cf1"></a>
+
+# Content Hash Based Builds
+
+pds does some trickery to build changes only if the contents have changed and
+not based on timestamp.
+
+To accomplish this, pds stores all input files and a hash in a sqlite database
+and consults this on each run.  If the hash of a file is the same but its
+timestamp has changed, pds sets the timestamp to the value in the database.
+This tricks Make into only building things that have actually changed.
+
+If the hashes do not match, pds sets the timestamp to that of the current time
+and stores that value in the database.
+
+The hash stored for every file is both the hash of the file as well as the hash
+of the build configuration, this ensure that if a pds configuration has changed
+that causes a rebuild.
+
+
+<a id="org6d61324"></a>
+
+# Terminology
+
+-   Project - The name of a directory in the `src` directory.  This corresponds to
+    an entry in the `src` table in the pds configuration file.
+-   Build - A kind of build, for example `release`, `debug`, `profile` or `docs`.
+-   Project type - The type of project it is, either `ocaml` or `third-party`.
+-   Project target type - The type of output the project has, either `exec` or
+    `library`, this applies only to ocaml projects..
+
+
+<a id="orgac41c0a"></a>
+
+# Projects
+
+Projects are divided up between Ocaml projects, which pds knows how to generate
+a `Makefile` for and a third-party project, which pds does not generate a
+`Makefile` for but are expected to have one that corresponds to the pds
+interface, which is `release`, `debug`, `profile`, `install`, `remove`, `docs`,
+and `clean`.
+
+
+<a id="org764fbf3"></a>
+
+## Ocaml
+
+Ocaml projects can be either executables or libraries.  The name of the output
+is derived from the project name with a suffix added depending on the type.  In
+the case of a library, a `META` file compatible with `ocamlfind` will be
+generated.
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">Project Type</th>
+<th scope="col" class="org-left">Suffix</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">Library</td>
+<td class="org-left">cma</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Library</td>
+<td class="org-left">cmxa</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Executable</td>
+<td class="org-left">byte</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Executable</td>
+<td class="org-left">native</td>
+</tr>
+</tbody>
+</table>
+
+
+<a id="orgeb67f29"></a>
+
+## Third-party
+
+Third party projects do not have a `Makefile` generated by pds but are expected
+to have one which corresponds to the pds interface.
+
+
+<a id="orgbfc8789"></a>
+
+# Dependencies
+
+The configuration file input to pds specifies dependencies, if any, for each
+project.  If a dependency has the same name as a project in the `src` directory
+then it is considered an internal dependency and an internal dependency will be
+compiled before its dependent project and the emitted output will be specified
+as a dependency in the dependents `Makefile`.
+
+
+<a id="org0d142cb"></a>
+
+# Configuration
+
+A configuration file is required for all projects.  A configuration file path
+can be given explicitly or pds will search for `pds.conf` in the current working
+directory.  `pds.conf` is a [toml](https://github.com/toml-lang/toml) file.  All directories in the `src` directory
+must be in the configuration file.  pds will error if that is not the case.  The
+only required attribute for each project is `install`, which specifies if it
+will be installed or not.  In the case of an `exec` project, the `install_cmd`
+and `remove_cmd` are required.
+
+Projects and tests can have some configuration values overridden by specific
+build types, the options and precedence is given in the respective sections
+below.
+
+An example of building the example directory structure.
+
+-   `proj3` requires no special dependencies or settings and projects are assumed
+    to be `library`.
+-   The global `release` build specifies a project should be compiled with
+    `-noassert`.
+-   The global `debug` build specifies that a project should be compiled with
+    `-g`.
+-   The project `proj2` overrides the global compiler options for `release` and
+    `debug` and compiles with `-safe-string`.
+-   The debug build options completely override the release build options.
+-   Libraries have a default `ocamlfind` install directory, however, commands need
+    to have their installation command specified.
+
+    [global.release]
+    extra_compiler_opts = "-noassert"
+    
+    [global.debug]
+    extra_compiler_opts = "-g"
+    
+    [src.proj1]
+    deps = ["async", "proj2", "proj3"]
+    type = "exec"
+    install = true
+    install_cmd = "cp proj1.native $(PREFIX)/bin/proj1"
+    remove_cmd = "rm $(PREFIX)/bin/proj1"
+    
+    [src.proj2]
+    install = false
+    deps = ["core", "async"]
+    type = "library"
+    extra_compiler_opts = "-safe-string -noassert"
+    debug = { extra_compiler_opts = "-safe-string -g" }
+    
+    [src.proj3]
+    install = false
+
+
+<a id="org3e4424f"></a>
+
+## Configuration Variables For Projects
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">Name</th>
+<th scope="col" class="org-left">Type</th>
+<th scope="col" class="org-left">Default</th>
+<th scope="col" class="org-left">Description</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">deps</td>
+<td class="org-left">string list</td>
+<td class="org-left">[]</td>
+<td class="org-left">List of dependencies both within the project and external</td>
+</tr>
+
+
+<tr>
+<td class="org-left">type</td>
+<td class="org-left">string</td>
+<td class="org-left">"library"</td>
+<td class="org-left">exec, library - Whether the ocaml project is an executbale or library</td>
+</tr>
+
+
+<tr>
+<td class="org-left">install</td>
+<td class="org-left">bool</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">Whether the built artifacts should be installed</td>
+</tr>
+
+
+<tr>
+<td class="org-left">install<sub>cmd</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">If the type is exec, specify the command to be used to install it</td>
+</tr>
+
+
+<tr>
+<td class="org-left">remove<sub>cmd</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">If the typs is exec, specify the command to be used to remove it</td>
+</tr>
+
+
+<tr>
+<td class="org-left">project<sub>type</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">"ocaml"</td>
+<td class="org-left">third-party or ocaml - defaults to ocaml</td>
+</tr>
+
+
+<tr>
+<td class="org-left">extra<sub>compiler</sub><sub>opts</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">""</td>
+<td class="org-left">Extra options to give to the ocaml compiler</td>
+</tr>
+
+
+<tr>
+<td class="org-left">extra<sub>ocamldep</sub><sub>opts</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">""</td>
+<td class="org-left">Extra options to give ot ocamldep</td>
+</tr>
+
+
+<tr>
+<td class="org-left">extra<sub>makefile</sub><sub>lines</sub></td>
+<td class="org-left">string list</td>
+<td class="org-left">[]</td>
+<td class="org-left">Extra lines to add to the generated Makefile</td>
+</tr>
+
+
+<tr>
+<td class="org-left">compile<sub>deps</sub></td>
+<td class="org-left">string list</td>
+<td class="org-left">[]</td>
+<td class="org-left">List of builds that need to be built prior to this build but are not automatically linked against</td>
+</tr>
+
+
+<tr>
+<td class="org-left">meta<sub>linkopts</sub></td>
+<td class="org-left">string</td>
+<td class="org-left">""</td>
+<td class="org-left">Link options to go into the META file.</td>
+</tr>
+
+
+<tr>
+<td class="org-left">build</td>
+<td class="org-left">bool</td>
+<td class="org-left">true</td>
+<td class="org-left">Whether or not to build the project or test</td>
+</tr>
+</tbody>
+</table>
+
+The following values can be overridden:
+
+-   `extra_compiler_opts`
+-   `extra_ocamldep_opts`
+-   `deps` - Note that this has no entry in `global`.
+-   `compile_deps` - Note that this one has no entry in `global`.
+
+The precedence ordering is given below.  Selectors are discussed later in the
+document.
+
+For `release` builds:
+
+1.  `src.<project>.selector.<selector>.<option>`
+2.  `src.<project>.<option>`
+3.  `global.release.<option>`
+
+For all other builds:
+
+1.  `src.<project>.selector.<selector>.<build_type>.<option>`
+2.  `src.<project>.selector.<selector>.<option>`
+3.  `src.<project>.<build_type>.<option>`
+4.  `global.<build_type>.<option>`
+5.  `src.<project>.<option>`
+
+The same precedence applies to test builds.
+
+
+<a id="orgc22df3d"></a>
+
+## Configuration Variables For Tests
+
+Tests only support specifying the `deps` and `extra_compiler_opts`
+configuration.  The `deps` option cannot be specified in the `global` section.
+
+The precedence ordering is given below.  Note that `release` builds are unique
+in that they search the third precedence first then the second.
+
+1.  `tests.<project>.<build_type>.<option>`
+2.  `global.test-<build_type>.<option>`
+3.  `tests.<project>.<option>`
+
+
+<a id="orgd51a282"></a>
+
+## Outputting the configuration
+
+This feature is not experimental and will likely change.
+
+`pds` can output the configuration in a tab delimited format, like a CSV.  The
+output looks like the following:
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+
+<colgroup>
+<col  class="org-left" />
+
+<col  class="org-left" />
+</colgroup>
+<thead>
+<tr>
+<th scope="col" class="org-left">Column</th>
+<th scope="col" class="org-left">Description</th>
+</tr>
+</thead>
+
+<tbody>
+<tr>
+<td class="org-left">Source Type</td>
+<td class="org-left">"src" or "test", the type of build it is</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Name</td>
+<td class="org-left">The name of the build, "src.&lt;name&gt;" or "test.&lt;name&gt;"</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Build Type</td>
+<td class="org-left">"exec" or "library", empty for test</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Project Type</td>
+<td class="org-left">"ocaml" or "third-party", empty for a test</td>
+</tr>
+
+
+<tr>
+<td class="org-left">Deps</td>
+<td class="org-left">Comma separated list of dependencies</td>
+</tr>
+</tbody>
+</table>
+
+
+<a id="org531c6d6"></a>
+
+# Produced Files
+
+pds will produce files when it is executed as well as when the build is
+performed.  This is a list of files that will be produced and can be safely
+ignored in the form of a `.gitignore`.
+
+    build/
+    pds.mk
+    Ocamlrules.mk.in
+
+
+<a id="orga80a0b5"></a>
+
+# Documentation
+
+pds can generate HTML documentation using `ocamldoc`.  The `docs` make target is
+automatically generated and third-party libraries are expected to implement a
+`docs` target.  The docs are put into the `builds/docs/<project>` of the root
+directory of the repository.  By default, only `mli` files are included in
+documentation, however this can be modified by setting the `DOCS_FILES` variable
+using the `extra_makefile_lines` configuration setting.  Different options can
+also be set for `ocamldoc` by modifying the `OCAMLDOC_OPTS` variable through
+`extra_makefile_lines`.
+
+
+<a id="org1380185"></a>
+
+# Selectors
+
+Some builds need to be parameterized over the environment it's being compiled
+in.  This is accomplished through selectors.  A selector is a program which
+outputs a single line that matches the regex `[a-zA-Z0-9_-]+`, any trailing
+white space will be removed.  The value of the line will then be used to look up
+values in `src.<project>.selector.<line>.<variable>`.  For any selection not in
+`src.<project>.selector.<line>` the value at the top-level of a project
+definition is used.  The empty string is a special selector which utilizes the
+default project values.
+
+The only override supported by selectors is setting the variable.  It is not
+possible to unset a variable in a selector.
+
+Take the case where a project should use different dependencies if it is
+executed in environment `A` vs environment `B`.  The selector program,
+`is_a_or_b` will return the line `A` or `B` depending on the system.
+
+    [global]
+    selector = ["is_a_or_b"]
+    
+    [src.foo]
+    deps = ["dep1", "dep2"]
+    
+    [src.foo.selector.A]
+    deps = ["dep1", "dep2", "dep3"]
+    
+    [src.foo.selector.B]
+    deps = ["dep1, "dep2", "dep4"]
+    
+    [src.bar]
+    deps = ["depX", "depY" ]
+    
+    [src.bar.selector.A]
+    deps = ["dep1", "dep2", "dep3"]
+
+Any variable that applies to a project can be set in a selector.
+
+The order of precedence is that the selector for the build type is first
+checked, then the selector for a release.
+
+
+<a id="org4d29c9b"></a>
+
+# Changelog
+
+
+<a id="org9e91524"></a>
+
+## 1.0.0
+
+-   Build makefiles of Ocaml projects.
+-   Add support for third-party projects.
+-   Support running tests.
+
+
+<a id="orgb820221"></a>
+
+## 1.1.0
+
+-   Add support for compile deps.  These are internal dependencies that are not an
+    ocamlfind dependency but need to be build before building the project.  This
+    is useful if a tool needs to be built that will be used to compile a project.
+
+
+<a id="orgc62cbaa"></a>
+
+## 2.0.0
+
+-   Remove globals section.  This can become confusing when for some configuration
+    variables as it's unclear where their values come from.
+-   Fill out the documentation more.
+
+
+<a id="org84e93aa"></a>
+
+## 3.0.0
+
+-   Add remove support.  This was previously outside of pds but now pds itself
+    understands both installing and uninstalling projects.
+
+
+<a id="org094f8fc"></a>
+
+## 3.0.1
+
+-   Remove pds from the package dependencies, this was previously done by hand
+    after using hll to make the package.
+
+
+<a id="org32f6532"></a>
+
+## 3.0.2
+
+-   Expand the hll config to pass opam-linter.
+
+
+<a id="org1840326"></a>
+
+## 3.0.3
+
+-   Add crunch dependency to hll.
+-   Specify which version of ocaml pds works with.
+
+
+<a id="org92f6fe6"></a>
+
+## 3.0.4
+
+-   Add more documentation.
+-   Remove examples.
+
+
+<a id="org59d8cf0"></a>
+
+## 3.1.0
+
+-   Add initial ocamldocs support.
+-   Install `.cmi` files.
+
+
+<a id="orgf69fc75"></a>
+
+## 3.1.1
+
+-   Fix a bug in generating docs when the project has no dependencies.
+
+
+<a id="org93a61f8"></a>
+
+## 4.11
+
+-   Switch to monotonic versioning.
+-   Add support for formatted output, a simple tab separated representation of a
+    `pds.conf`.
+-   Rename the `docs` target to `doc` because this conflicts with the directory
+    name of the output.
+
+
+<a id="org88484a8"></a>
+
+## 4.12
+
+-   Include tests directories in formatted output.
+
+
+<a id="org5e6c3d1"></a>
+
+## 4.13
+
+-   Make a better error message for the install key, which is required.
+
+
+<a id="org015dacc"></a>
+
+## 5.14
+
+-   Rework builds to use the build output directory rather than building in the
+    same directory as the source files.  This allows multiple build types to
+    coexist, such as release and debug.
+-   Remove PACK support.  Building PACKs is no longer supported.
+
+
+<a id="orgdd7d38b"></a>
+
+## 5.15
+
+-   Fix formatted output for third-party projects.
+-   Add a changelog and back fill it.
+
+
+<a id="orgf4d3fe6"></a>
+
+## 5.16
+
+-   Fix bug in cleanup logic which concatenated multiple deps
+
+
+<a id="orgba9ee52"></a>
+
+## 5.17 (bug release)
+
+-   Fix a build race condition during parallel builds.  When a .cmi is generated
+    from a .ml, in a parallel build it is possible that the build of the .cmo and
+    .cmx will execute in parallel and both will generate a .cmi which will step on
+    each other.  Now, for files that will generate a .cmi, the .cmi is generated
+    first then the .cmo and .cmx are generated.
+
+
+<a id="org47f8132"></a>
+
+## 5.18
+
+-   5.17 was a bug release, its solution made builds that could not be installed.
+-   This solves the problem 5.17 intended to solve by making ocaml builds that
+    have any `.ml` files without a complimentary `.mli` file now build in serial.
+    This is because building the byte-code for `.ml` files with no `.mli` file can
+    overlap with each other generating the `.cmi` file which creates a race
+    condition where the `.cmi` is in an invalid state when a later step is using
+    it.  This solves it by serializing the build for those cases.
+
+
+<a id="org55822ce"></a>
+
+## 5.19
+
+-   Fix bug where it was only installing `.cmi` files for `.mli` files.  Not it
+    installs `.cmi` files for all `.ml` files.
+
+
+<a id="org00d0582"></a>
+
+## 6.20
+
+-   Removed the `-custom` option from default byte code builds.
+
+
+<a id="org992589e"></a>
+
+## 5.21
+
+-   Undo the change in `6.20`.  Instead, split out the linker options and allow
+    them to be overridden.
+
+
+<a id="org2a7a6fd"></a>
+
+## 5.22
+
+-   Support `extra_makefile_lines` in tests.
+-   Tests compile with `OCAML*_LINK_OPTS` just like regular builds.
+
+
+<a id="org862685f"></a>
+
+## 5.23
+
+-   Fix typo in PARALLEL
+
+
+<a id="orgb4ddbc1"></a>
+
+## 5.24
+
+-   Build cmti files and install them for every library.
+
+
+<a id="orgaf4b17a"></a>
+
+## 5.25
+
+-   Support adding linkopts to the META file.
+
+
+<a id="org2faefce"></a>
+
+## 5.26 (bug release)
+
+-   Support selectors.
+-   Add some tests.
+
+
+<a id="org7cf7066"></a>
+
+## 5.27
+
+-   Fix bug in section name for the selector.
+
+
+<a id="orgb8e749f"></a>
+
+## 5.28
+
+-   Fix lookup order.  This is a long-standing bug where selectors and globals
+    were not properly looked up.
+
+
+<a id="org6b3e578"></a>
+
+## 5.29
+
+-   Support rebuilding when pds.conf changes.
+-   Remove support for specifying pds.conf (backwards breaking but it never
+    worked).
+
+
+<a id="org682ad5f"></a>
+
+## 6.43
+
+-   Move to content based hashing.
+
+
+<a id="orgfdbaa88"></a>
+
+## 6.44
+
+-   Fix install directive
+

          
M README.org +4 -0
@@ 418,3 418,7 @@ checked, then the selector for a release
 - Support rebuilding when pds.conf changes.
 - Remove support for specifying pds.conf (backwards breaking but it never
   worked).
+** 6.43
+- Move to content based hashing.
+** 6.44
+- Fix install directive

          
M build/debug/pds/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/debug/pds_template/Makefile +0 -2
@@ 37,6 37,4 @@ include $(SRC_DIR)/pds_template.mk
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/debug/snabela/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/profile/pds/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/profile/pds_template/Makefile +0 -2
@@ 37,6 37,4 @@ include $(SRC_DIR)/pds_template.mk
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/profile/snabela/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/release/pds/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/release/pds_template/Makefile +0 -2
@@ 37,6 37,4 @@ include $(SRC_DIR)/pds_template.mk
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M build/release/snabela/Makefile +0 -2
@@ 35,6 35,4 @@ profile: all
 
 include ../../../Ocamlrules.mk.in
 
-$(native_cmx) $(byte_cmo) $(neutral_cmi): ../../../pds.conf
-
 -include .d

          
M files/pds.mk.tmpl +2 -0
@@ 43,6 43,8 @@type@_
 @/tests-@
 @/builds-@
 
+install: $(projects_install)
+
 docs: $(projects_docs)
 
 remove: $(projects_remove)

          
M hll.conf +1 -1
@@ 1,4 1,4 @@ 
-pds = { major_version = 5 }
+pds = { major_version = 6 }
 
 desc = "A tool to build Makefiles for Ocaml projects."
 maintainer = "orbitz@gmail.com"

          
M hll.pins +1 -1
@@ 1,5 1,5 @@ 
 ocaml >= "4.12.0"
 toml >= "6"
 cmdliner >= "1.3.0"
-containers >= "3.12.0"
+containers >= "3.12"
 process >= "0.2.1"

          
M pds.mk +2 -0
@@ 71,6 71,8 @@ profile_snabela:
 test-profile: $(tests_profile)
 
 
+install: $(projects_install)
+
 docs: $(projects_docs)
 
 remove: $(projects_remove)