-
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
[RFC] Relocation library #1185
Comments
Frama-C get the location during tests of However having a common library with the API given would factorize the work done by each tool, which is great. User configuration directory could also be a good candidate (c.f https://github.com/gildor478/ocaml-xdg-basedir) |
👍 for this; in Coq we have to use a very ugly set of heuristics due to this, moreover because we cannot depend on non-installed targets we must take into account placement into the build dir context. |
As discussed with @rgrinberg: it is possible to implement this using a global library, say The build time default corresponds to the At run time, we will be able to override this using the environment. The corresponding variables will be used by Variants might be helpful here, so that we can install a javascript version that points to local storage or similar instead of returning paths. Another interesting extension would be to add a crunch mode that returns the file contents instead of the path. It would need to read a string embedded into the resulting executable file. |
We've discussed this further with @bobot, and there's a couple of more requirements:
|
|
The opam default. |
When we configure dune, the default for all of these should be the opam default I believe. So when we build dune with |
OK, works for me! I think that we have reached a nice consensus here :) |
I'll try to implement a first version of this. |
Contrary to what I implied with the reference, we can't use for the share directory the technique used for the version, because it should also work for dynamic libraries. |
What is the status of this PR ? Are there any blockers ? |
I don’t think there are any blockers, feel free to work on it.
…On Sep 9, 2019, 1:12 AM +0900, Nicolás Ojeda Bär ***@***.***>, wrote:
What is the status of this PR ? Are there any blockers ?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
TL;DRThe ability to set static paths at compile time is necessary, even if in some cases relocatability is desired: ProblemEven if the proposed solution may be beneficial in many scenarios, it does not cover all that are relevant. The ability to set data or config paths at compile time is still necessary: The solution still relies on the implicit information that there is one central prefix for everything. This is not always true. What about distros/package managers where every package has its own prefix, like Nix, Guix, GoboLinux, DJB's installation scheme, etc.? It may be sometimes desirable to have relocatable executables, but not always. The mentioned package managers/distros (probably all, at least Nix, Guix) install immutable and immobile packages. Hence, relocatability provides no benefit, while the ability to hard-code directories at compile time makes things far easier: Everything is fixed at build time anyway, but runtime discoverability is really hard in these systems. Of course one can wrap executables providing environment variables, but what if two used libs use two data/config files with the same name under two different prefixes? Then, even a By the way, e.g. the Nix community should be really relevant to dune: According to repology.org, it's the second largest linux distribution measured by the number of packages, and it's a community with a great affinity to functional programming. Apart from the subject itself, AFAIK this RFC hasn't resulted in a pull request in two years, and the disability of reliably detecting any config/data paths resulted in multiple issues (at least #1253, #1534). Also, so far dune allows to detect and hardcode some installation paths, only not all consistently: You can e.g. execute SolutionI think, the simplest possible solution would be to make the inconsistent behavior consistent by adding a Alternative SolutionImplement config variables (#1579, #1674) and let |
The MR #3104 merged not a long time ago tried to help in that direction. The feature added is experimental so it is time to ask for modifications.
We use Nix for our CI, so I kept it in mind at first but since I haven't yet tested it in this environment I perhaps made mistakes. So I'm very happy that you reached us with this problem. I haven't understood all the roadblock you described, to help that I will describe the features from #3104 that would help:
Do you think those steps are in the right direction? |
@bobot So
? If yes, then this is basically what I propose, I think. If the sites can only be defined in the env var and not be queried as dune variable, then the config script can query them. This is the important half of my proposal. |
A better documentation and example is available in #3794.
It does in the sense that when you install in the site of another package it will still be installed inside the
Not in this form, because the sites is not the same between during the compilation/tests and after the installation, but the stanza
Great. Can you test it in nix? One step I don't know exactly is if and which |
One question: How can a lib If I know this, I think I can try it out with Nix. |
Yes it is, in the install stanza. For example in the new examples. |
@jeremiedimino Do you think this feature is now fully implemented? |
That's my understanding, yes. And if there are still details to sort out, let's rediscover them rather than keep this old issue. I'm closing this issue then. |
…ne-action-plugin, dune-private-libs and dune-glob (2.8.0) CHANGES: - `dune rules` accepts aliases and other non-path rules (ocaml/dune#4063, @mrmr1993) - Action `(diff reference test_result)` now accept `reference` to be absent and in that case consider that the reference is empty. Then running `dune promote` will create the reference file. (ocaml/dune#3795, @bobot) - Ignore special files (BLK, CHR, FIFO, SOCKET), (ocaml/dune#3570, fixes ocaml/dune#3124, ocaml/dune#3546, @ejgallego) - Experimental: Simplify loading of additional files (data or code) at runtime in programs by introducing specific installation sites. In particular it allow to define plugins to be installed in these sites. (ocaml/dune#3104, ocaml/dune#3794, fixes ocaml/dune#1185, @bobot) - Move all temporary files created by dune to run actions to a single directory and make sure that actions executed by dune also use this directory by setting `TMPDIR` (or `TEMP` on Windows). (ocaml/dune#3691, fixes ocaml/dune#3422, @rgrinberg) - Fix bootstrap script with custom configuration. (ocaml/dune#3757, fixes ocaml/dune#3774, @marsam) - Add the `executable` field to `inline_tests` to customize the compilation flags of the test runner executable (ocaml/dune#3747, fixes ocaml/dune#3679, @lubegasimon) - Add `(enabled_if ...)` to `(copy_files ...)` (ocaml/dune#3756, @nojb) - Make sure Dune cleans up the status line before exiting (ocaml/dune#3767, fixes ocaml/dune#3737, @alan-j-hu) - Add `{gitlab,bitbucket}` as options for defining project sources with `source` stanza `(source (<host> user/repo))` in the `dune-project` file. (ocaml/dune#3813, @rgrinberg) - Fix generation of `META` and `dune-package` files when some targets (byte, native, dynlink) are disabled. Previously, dune would generate all archives for regardless of settings. (ocaml/dune#3829, ocaml/dune#4041, @rgrinberg) - Do not run ocamldep to for single module executables & libraries. The dependency graph for such artifacts is trivial (ocaml/dune#3847, @rgrinberg) - Fix cram tests inside vendored directories not being interpreted correctly. (ocaml/dune#3860, fixes ocaml/dune#3843, @rgrinberg) - Add `package` field to private libraries. This allows such libraries to be installed and to be usable by other public libraries in the same project (ocaml/dune#3655, fixes ocaml/dune#1017, @rgrinberg) - Fix the `%{make}` variable on Windows by only checking for a `gmake` binary on UNIX-like systems as a unrelated `gmake` binary might exist on Windows. (ocaml/dune#3853, @kit-ty-kate) - Fix `$ dune install` modifying the build directory. This made the build directory unusable when `$ sudo dune install` modified permissions. (fix ocaml/dune#3857, @rgrinberg) - Fix handling of aliases given on the command line (using the `@` and `@@` syntax) so as to correctly handle relative paths. (ocaml/dune#3874, fixes ocaml/dune#3850, @nojb) - Allow link time code generation to be used in preprocessing executable. This makes it possible to use the build info module inside the preprocessor. (ocaml/dune#3848, fix ocaml/dune#3848, @rgrinberg) - Correctly call `git ls-tree` so unicode files are not quoted, this fixes problems with `dune subst` in the presence of unicode files. Fixes ocaml/dune#3219 (ocaml/dune#3879, @ejgallego) - `dune subst` now accepts common command-line arguments such as `--debug-backtraces` (ocaml/dune#3878, @ejgallego) - `dune describe` now also includes information about executables in addition to that of libraries. (ocaml/dune#3892, ocaml/dune#3895, @nojb) - instrumentation backends can now receive arguments via `(instrumentation (backend <name> <args>))`. (ocaml/dune#3906, ocaml/dune#3932, @nojb) - Tweak auto-formatting of `dune` files to improve readability. (ocaml/dune#3928, @nojb) - Add a switch argument to opam when context is not default. (ocaml/dune#3951, @tmattio) - Avoid pager when running `$ git diff` (ocaml/dune#3912, @AltGr) - Add `(root_module ..)` field to libraries & executables. This makes it possible to use library dependencies shadowed by local modules (ocaml/dune#3825, @rgrinberg) - Allow `(formatting ...)` field in `(env ...)` stanza to set per-directory formatting specification. (ocaml/dune#3942, @nojb) - [coq] In `coq.theory`, `:standard` for the `flags` field now uses the flags set in `env` profile flags (ocaml/dune#3931 , @ejgallego @rgrinberg) - [coq] Add `-q` flag to `:standard` `coqc` flags , fixes ocaml/dune#3924, (ocaml/dune#3931 , @ejgallego) - Add support for Coq's native compute compilation mode (@ejgallego, ocaml/dune#3210) - Add a `SUFFIX` directive in `.merlin` files for each dialect with no preprocessing, to let merlin know of additional file extensions (ocaml/dune#3977, @vouillon) - Stop promoting `.merlin` files. Write per-stanza Merlin configurations in binary form. Add a new subcommand `dune ocaml-merlin` that Merlin can use to query the configuration files. The `allow_approximate_merlin` option is now useless and deprecated. Dune now conflicts with `merlin < 3.4.0` and `ocaml-lsp-server < 1.3.0` (ocaml/dune#3554, @voodoos) - Configurator: fix a bug introduced in 2.6.0 where the configurator V1 API doesn't work at all when used outside of dune. (ocaml/dune#4046, @aalekseyev) - Fix `libexec` and `libexec-private` variables. In cross-compilation settings, they now point to the file in the host context. (ocaml/dune#4058, fixes ocaml/dune#4057, @TheLortex) - When running `$ dune subst`, use project metadata as a fallback when package metadata is missing. We also generate a warning when `(name ..)` is missing in `dune-project` files to avoid failures in production builds. - Remove support for passing `-nodynlink` for executables. It was bypassed in most cases and not correct in other cases in particular on arm32. (ocaml/dune#4085, fixes ocaml/dune#4069, fixes ocaml/dune#2527, @emillon) - Generate archive rules compatible with 4.12. Dune longer attempt to generate an archive file if it's unnecessary (ocaml/dune#3973, fixes ocaml/dune#3766, @rgrinberg) - Fix generated Merlin configurations when multiple preprocessors are defined for different modules in the same folder. (ocaml/dune#4092, fixes ocaml/dune#2596, ocaml/dune#1212 and ocaml/dune#3409, @voodoos) - Add the option `use_standard_c_and_cxx_flags` to `dune-project` that 1. disables the unconditional use of the `ocamlc_cflags` and `ocamlc_cppflags` from `ocamlc -config` in C compiler calls, these flags will be present in the `:standard` set instead; and 2. enables the detection of the C compiler family and populates the `:standard` set of flags with common default values when building CXX stubs. (ocaml/dune#3875, ocaml/dune#3802, fix ocaml/dune#3718 and ocaml/dune#3528, @voodoos)
It is common for programs to read configuration of data files installed on the system, for instance in
/etc
or/usr/share
. In order for the program to find the files at runtime, it is common practice to capture an absolute path at configure time and store this path in the source code of the program.There are two problems with this approach:
The idea of this proposal is to provide a library so that programs can easily find such files without hassle. When running tests, dune would arrange things so that the paths reported by the library points to the local installation directory, i.e.
_build/install
. This library would also honor the environment variable from various systems (such asOPAM_SWITCH_PREFIX
: ocaml/opam#3411) so that the binary artifacts can be easily relocated.API
Here is a possible API for this library:
The text was updated successfully, but these errors were encountered: