-
Notifications
You must be signed in to change notification settings - Fork 410
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Formalise the management of versions #2224
Conversation
Let's include this in 2.0.0 rather than 1.x. Additionally, I'm removing the old ad-hoc rules we had for |
Well, that simplified the code quite a bit :) |
Alright, I rebased this PR and formalised the versioning of the generated module so that the This is now ready for review and inclusion in 1.11. |
I'm having some second thoughts on splitting off build-info into its own repository. All the same issues apply:
I understand that we'll need to support this library for 4.02+, but perhaps we should still consider a mono repo like this:
In this structure, there's complete independence between the individual projects. |
For the testing, it shouldn't be too much of an issue. In particular the test in this PR do not require the external library. They just test the generation feature directly by defining a library with However, it's true that it becomes more confusing where to report errors. Including build-info in the dune repo works with a few caveats:
For the last point, we could either make a new release of build-info with every new dune release, however it means that we will have a lot of identical releases of build-info which is odd. Alternatively, we could skip versions but this means that the versions of build-info will be patchy, i.e we might jump directly from 1.11 to 2.5 for instance. |
BTW, in practice this won't change the implementation. We do need the versioning of the generated module. In particular this decoupling is valuable for mono-repositories. Indeed, in a mono-repo one would embed a copy of build-info and its version wouldn't necessarily match the version of the dune binary currently being used. |
Hmm, I suppose this is the most convincing point. We can't really have 2 versioning schemes inside a single git repo. I do think that it would be better to version build info independently of dune. |
I'm wondering if it makes sense to make version an abstract type? It seems like it would be quite nice useful to include some basic operations on versions here that aren't as convenient to do as strings. For example
I don't have such a strong opinion on this, but from experience this is the kind of thing people do get wrong because they are simply lazy about it. Of course, this will make it more future proof as well. |
Indeed, using abstract types will make the API more future proof. I'm doing that |
I made the version abstract and moved build-info to its own package as we discussed on slack |
Signed-off-by: Jeremie Dimino <[email protected]>
I think you might have forgotten to push this change. I've resolved conflicts and merged this PR. I'll make a ticket so that we don't forget this change before releasing 1.0. EDIT: Nvm. I see that the public API is in `build_info.mli. |
Thanks for rebasing and merging :) |
CHANGES: - Don't select all local implementations in `dune utop`. Instead, let the default implementation selection do its job. (ocaml/dune#2327, fixes ocaml/dune#2323, @TheLortex, review by @rgrinberg) - Check that selected implementations (either by variants or default implementations) are indeed implementations. (ocaml/dune#2328, @TheLortex, review by @rgrinberg) - Don't reserve the `Ppx` toplevel module name for ppx rewriters (ocaml/dune#2242, @diml) - Redesign of the library variant feature according to the ocaml/dune#2134 proposal. The set of variants is now computed when the virtual library is installed. Introducing a new `external_variant` stanza. (ocaml/dune#2169, fixes ocaml/dune#2134, @TheLortex, review by @diml) - Add proper line directives when copying `.cc` and `.cxx` sources (ocaml/dune#2275, @rgrinberg) - Fix error message for missing C++ sources. The `.cc` extension was always ignored before. (ocaml/dune#2275, @rgrinberg) - Add `$ dune init project` subcommand to create project boilerplate according to a common template. (ocaml/dune#2185, fixes ocaml/dune#159, @shonfeder) - Allow to run inline tests in javascript with nodejs (ocaml/dune#2266, @hhugo) - Build `ppx.exe` as compiling host binary. (ocaml/dune#2286, fixes ocaml/dune#2252, @toots, review by @rgrinberg and @diml) - Add a `cinaps` extension and stanza for better integration with the [cinaps tool](https://github.com/janestreet/cinaps) tool (ocaml/dune#2269, @diml) - Allow to embed build info in executables such as version and list and version of statically linked libraries (ocaml/dune#2224, @diml) - Set version in `META` and `dune-package` files to the one read from the vcs when no other version is available (ocaml/dune#2224, @diml) - Add a variable `%{target}` to be used in situations where the context requires at most one word, so `%{targets}` can be confusing; stdout redirections and "-o" arguments of various tools are the main use case; also, introduce a separate field `target` that must be used instead of `targets` in those situations. (ocaml/dune#2341, @aalekseyev) - Fix dependency graph of wrapped_compat modules. Previously, the dependency on the user written entry module was omitted. (ocaml/dune#2305, @rgrinberg) - Allow to promote executables built with an `executable` stanza (ocaml/dune#2379, @diml) - When instantiating an implementation with a variant, make sure it matches virtual library's list of known implementations. (ocaml/dune#2361, fixes ocaml/dune#2322, @TheLortex, review by @rgrinberg) - Add a variable `%{ignoring_promoted_rules}` that is `true` when `--ingore-promoted-rules` is passed on the command line and false otherwise (ocaml/dune#2382, @diml) - Fix a bug in `future_syntax` where the characters `@` and `&` were not distinguished in the names of binding operators (`let@` was the same as `let&`) (ocaml/dune#2376, @aalekseyev, @diml) - Workspaces with non unique project names are now supported. (ocaml/dune#2377, fix ocaml/dune#2325, @rgrinberg) - Improve opam generation to include the `dune` dependncies with the minimum constraint set based on the dune language version specified in the `dune-project` file. (2383, @avsm) - The order of fields in the generated opam file now follows order preferred in opam-lib. (@avsm, ocaml/dune#2380) - Fix coloring of error messages from the compiler (@diml, ocaml/dune#2384) - Add warning `66` to default set of warnings starting for dune projects with language verison >= `1.11` (@rgrinberg, @diml, fixes ocaml/dune#2299) - Add (dialect ...) stanza (@nojb, ocaml/dune#2404) - Add a `--context` argument to `dune install/uninstall` (@diml, ocaml/dune#2412) - Do not warn about merlin files pre 1.9. This warning can only be disabled in 1.9 (ocaml/dune#2421, fixes ocaml/dune#2399, @emillon)
CHANGES: - Don't select all local implementations in `dune utop`. Instead, let the default implementation selection do its job. (ocaml/dune#2327, fixes ocaml/dune#2323, @TheLortex, review by @rgrinberg) - Check that selected implementations (either by variants or default implementations) are indeed implementations. (ocaml/dune#2328, @TheLortex, review by @rgrinberg) - Don't reserve the `Ppx` toplevel module name for ppx rewriters (ocaml/dune#2242, @diml) - Redesign of the library variant feature according to the ocaml/dune#2134 proposal. The set of variants is now computed when the virtual library is installed. Introducing a new `external_variant` stanza. (ocaml/dune#2169, fixes ocaml/dune#2134, @TheLortex, review by @diml) - Add proper line directives when copying `.cc` and `.cxx` sources (ocaml/dune#2275, @rgrinberg) - Fix error message for missing C++ sources. The `.cc` extension was always ignored before. (ocaml/dune#2275, @rgrinberg) - Add `$ dune init project` subcommand to create project boilerplate according to a common template. (ocaml/dune#2185, fixes ocaml/dune#159, @shonfeder) - Allow to run inline tests in javascript with nodejs (ocaml/dune#2266, @hhugo) - Build `ppx.exe` as compiling host binary. (ocaml/dune#2286, fixes ocaml/dune#2252, @toots, review by @rgrinberg and @diml) - Add a `cinaps` extension and stanza for better integration with the [cinaps tool](https://github.com/janestreet/cinaps) tool (ocaml/dune#2269, @diml) - Allow to embed build info in executables such as version and list and version of statically linked libraries (ocaml/dune#2224, @diml) - Set version in `META` and `dune-package` files to the one read from the vcs when no other version is available (ocaml/dune#2224, @diml) - Add a variable `%{target}` to be used in situations where the context requires at most one word, so `%{targets}` can be confusing; stdout redirections and "-o" arguments of various tools are the main use case; also, introduce a separate field `target` that must be used instead of `targets` in those situations. (ocaml/dune#2341, @aalekseyev) - Fix dependency graph of wrapped_compat modules. Previously, the dependency on the user written entry module was omitted. (ocaml/dune#2305, @rgrinberg) - Allow to promote executables built with an `executable` stanza (ocaml/dune#2379, @diml) - When instantiating an implementation with a variant, make sure it matches virtual library's list of known implementations. (ocaml/dune#2361, fixes ocaml/dune#2322, @TheLortex, review by @rgrinberg) - Add a variable `%{ignoring_promoted_rules}` that is `true` when `--ingore-promoted-rules` is passed on the command line and false otherwise (ocaml/dune#2382, @diml) - Fix a bug in `future_syntax` where the characters `@` and `&` were not distinguished in the names of binding operators (`let@` was the same as `let&`) (ocaml/dune#2376, @aalekseyev, @diml) - Workspaces with non unique project names are now supported. (ocaml/dune#2377, fix ocaml/dune#2325, @rgrinberg) - Improve opam generation to include the `dune` dependncies with the minimum constraint set based on the dune language version specified in the `dune-project` file. (2383, @avsm) - The order of fields in the generated opam file now follows order preferred in opam-lib. (@avsm, ocaml/dune#2380) - Fix coloring of error messages from the compiler (@diml, ocaml/dune#2384) - Add warning `66` to default set of warnings starting for dune projects with language verison >= `1.11` (@rgrinberg, @diml, fixes ocaml/dune#2299) - Add (dialect ...) stanza (@nojb, ocaml/dune#2404) - Add a `--context` argument to `dune install/uninstall` (@diml, ocaml/dune#2412) - Do not warn about merlin files pre 1.9. This warning can only be disabled in 1.9 (ocaml/dune#2421, fixes ocaml/dune#2399, @emillon) - Add a new `inline_tests` field in the env stanza to control inline_tests framework with a variable (ocaml/dune#2313, @mlasson, original idea by @diml, review by @rgrinberg). - New binary kind `js` for executables in order to explicitly enable Javascript targets, and a switch `(explicit_js_mode)` to require this mode in order to declare JS targets corresponding to executables. (ocaml/dune#1941, @nojb)
This PR formalises the management of versions in Dune. It explains how versions of libraries and executables are calculated and how they are written in library metadata files and embedded into executables.
Overview
The Goal of this PR is to provide a simple and clean way to expose the version of libraries and executables via ocamlfind and the
--version
command line options of executables.Additionally, when the version is obtained from the version control system we make sure to preserve good incrementality in order to preserve a good development experience.
Calculation of versions
The version of a library or executable is calculated as follow:
The version of a package is the version written in the
p.opam
ordune-project
file. When no such version exist it is obtained from the version control system the package is part of.When obtaining a version from a version control system, the root of the version control system does not need to be inside the workspace and can be in an ancestor directory of the root of the workspace.
Version obtained from version control systems
When the version is obtained from a git repository, the output of the following command is used:
When it is ontained from a mercurial repository, it uses an emulation to produce a result similar to git.
Accessing versions from OCaml code
One can use the special
dune.build-info
library to access the version of the executable as well as the list of statically linked libraries with their version. This library provides aDune_build_info
module with the following API:Some parts of this library are generated at link time.
Version stored in package metadata files
Dune store the version of a package in
META
anddune-package
files.Version control system and incrementality
When the version is obtained from a version control system, it is not immediately stored in binaries and package metadata files as this would hurt the development experience by reducing incrementality.
Dune rewrites
META
anddune-package
at installation time using the appropriate parser and printer. It makes sure to preserve comments inMETA
files given that part of these might be written by the user.dune-package
are always fully generated by Dune and contain no comments.For executables that depend on
dune.build-info
, we leave placeholders that are rewritten at installation time or when promoting files to the source tree. Dune systematically scans and rewrites all files during promotion and installation. This allows the rewriting to be performed even if the.exe
was copied via a rule.It is expected to work with javasript files as well as long as the version numbers don't contain special characters that are not allowed in javascript string literals.
Usage in Dune itself
dune
makes uses ofdune.build-info
fordune --version
and has a new--build-info
option printing the version ofdune
and the list of statically linked libraries: