Skip to content

Rocq --config Fix - #14093

Merged
Alizter merged 4 commits into
ocaml:mainfrom
Durbatuluk1701:rocq_config_fix
Apr 10, 2026
Merged

Rocq --config Fix#14093
Alizter merged 4 commits into
ocaml:mainfrom
Durbatuluk1701:rocq_config_fix

Conversation

@Durbatuluk1701

Copy link
Copy Markdown
Contributor

Reflecting on the issue in #13774, I think a solution that is both forwards and backwards compatible is to just always use rocq c --config. This PR implements this change and allows compilation of rocq.theory stanzas for Rocq 9.0+.

Documentation in the Rocq CLI implies this will be recognized by compile/c and the message for this commit seems to imply that --config will need to access the environment regardless.

Maybe there is some reason to utilize just rocq --config (note: missing the c), but it is not immediately obvious to me.

It working with PR dune vs. failing previous version
$ rocq --version
The Rocq Prover, version 9.0.1
compiled with OCaml 5.3.0

$ cat theories/dune
(rocq.theory
 (name test_proj)
 (package test_proj)
 (theories Stdlib))

$ cat dune-project
(lang dune 3.22)
(using rocq 0.12)
(generate_opam_files)
(package
 (name test_proj)
 (depends rocq-core))

$ cat theories/Test.v
From Stdlib Require Import Nat.

Lemma test : forall (x : nat), x = x.
Proof.  reflexivity. Qed.

$ ~/forks/dune/_boot/dune.exe build

$ ~/forks/dune/_boot/dune.exe clean

$ dune build
Warning: Skipping installed theories due to 'rocq --config' failure:
- .../.opam/package_dev/bin/rocq --config failed with exit code 1.
Hint: Try running 'rocq --config' manually to see the error.
Couldn't find Rocq standard library, and theory is not using (stdlib no)
-> required by _build/default/theories/.test_proj.theory.d
-> required by alias theories/all
-> required by alias default
File "theories/dune", line 4, characters 11-17:
4 |  (theories Stdlib))
               ^^^^^^
Theory "Stdlib" has not been found.
-> required by theory test_proj in theories/dune:2
-> required by _build/default/theories/.test_proj.theory.d
-> required by alias theories/all
-> required by alias default

Signed-off-by: Will Thomas <30wthomas@gmail.com>
Signed-off-by: Will Thomas <30wthomas@gmail.com>

@rlepigre-skylabs-ai rlepigre-skylabs-ai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is a reasonable approach, although I would consider it inferior to falling back to rocq c --config if rocq --config fails (not sure how hard that would be to do). The current approach would make it harder for Rocq to remove the --config option from rocq c, which I think would make sense eventually (CLI flags are kind of a mess in Rocq). That being said, I'm fine if we want to simply merge this.

Comment thread Makefile

test-all: $(BIN)
$(BIN) build @runtest @runtest-js @runtest-rocq @runtest-melange
DUNE_ROCQ_TEST=enable $(BIN) build @runtest @runtest-js @runtest-rocq @runtest-melange

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We probably don't want this, right @Alizter?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I think its fine. Otherwise the runtest-rocq alias will not build. We don't use test-all in CI anyway.

@Alizter

Alizter commented Apr 9, 2026

Copy link
Copy Markdown
Collaborator

@Durbatuluk1701 could you ask the Rocq maintainers on Zulip if they intend to change this flag in the future. That would probably give us the clearest path forward.

@Alizter Alizter added the rocq Dune support for the Rocq proof assistant label Apr 9, 2026
@Durbatuluk1701

Copy link
Copy Markdown
Contributor Author

@Durbatuluk1701 could you ask the Rocq maintainers on Zulip if they intend to change this flag in the future. That would probably give us the clearest path forward.

Asked here

@Durbatuluk1701

Copy link
Copy Markdown
Contributor Author

The endorsed fix is:

Always check rocq c --config: it works with 9.0, and if is not planned to get deprecated may be forward and backwards compatible

Which I think should align with what this PR currently contributes

@Alizter

Alizter commented Apr 9, 2026

Copy link
Copy Markdown
Collaborator

Could you add a changelog entry?

Signed-off-by: Will Thomas <30wthomas@gmail.com>
@Alizter

Alizter commented Apr 10, 2026

Copy link
Copy Markdown
Collaborator

Could you also check that we don't mention rocq --config in the documentation? Sometimes there are transient errors with rocq c --config not finding the stdlib, and users may be confused why things are not working (especially if they didn't do any rocq compilation just yet). We should therefore mention somewhere in the manual that the dune rules for rocq are running rocq c --config explicitly to explain.

@Durbatuluk1701

Copy link
Copy Markdown
Contributor Author

Could you also check that we don't mention rocq --config in the documentation? Sometimes there are transient errors with rocq c --config not finding the stdlib, and users may be confused why things are not working (especially if they didn't do any rocq compilation just yet). We should therefore mention somewhere in the manual that the dune rules for rocq are running rocq c --config explicitly to explain.

So there is a rocqc --config that appears. This is part of a more general issue in the docs where lots of stuff from the coq -> rocq transformation got slightly off. I was planning to do a docs PR this weekend to clean up a lot of this stuff anyways (i.e. rocqdep -> rocq dep, etc.).

Given this, what would you prefer:

  1. I do a full docs update in this PR
  2. I do just the --config docs update in this PR and leave the rest for another one
  3. Do the full docs update in a separate PR

@Alizter

Alizter commented Apr 10, 2026

Copy link
Copy Markdown
Collaborator

@Durbatuluk1701 Let's make the current state of the docs accurately reflect the change you've introduced. I do welcome improvement PRs afterwards in general however.

Signed-off-by: Will Thomas <30wthomas@gmail.com>
@Alizter
Alizter merged commit fc0fe1e into ocaml:main Apr 10, 2026
30 checks passed
@Durbatuluk1701
Durbatuluk1701 deleted the rocq_config_fix branch April 10, 2026 15:39
avsm pushed a commit to ocaml/opam-repository that referenced this pull request May 5, 2026
CHANGES:

### Fixed

- Auto-inject `"menhir" {>= "20180523"}` into generated opam files when the
  menhir extension is used. Dune's menhir rules rely on `--infer-write-query`
  and `--infer-read-reply`, which require at least this version; without the
  lower bound, builds fail with older menhir installations.
  (ocaml/dune#10707, @robinbb)

- Fix `--display=quiet` not suppressing "Entering directory" and "Leaving
  directory" messages when using `--root`. These messages are now deferred
  until there is actual output, so silent builds produce no noise.
  (ocaml/dune#12974, fixes ocaml/dune#12854, @Alizter)

- Fix an internal error when a module is shared between a `rocq.theory` and
  `rocq.extraction` stanza. The error now includes a hint pointing to the
  conflicting stanza. (ocaml/dune#13733, @Durbatuluk1701)

- Fix cookies defined on `ppx_rewriter` being lost when that rewriter was used
  as a dependency of another `ppx_rewriter`. (ocaml/dune#13737, fixes ocaml/dune#3426, @Alizter)

- Improve opam file generation for packages that set `(dir ..)`. Such packages
  will now have a test target that is limited to this directory. (ocaml/dune#13778, @rgrinberg)

- Stop duplicating dune diagnostics to subscribers over RPC (ocaml/dune#13816,
  @rgrinberg)

- Fix dependency cycle when using the `package` with a library
  conditionally enabled via `enabled_if`. (ocaml/dune#13833, @toots)

- Fix underspecification of dependencies in the sandbox for modules with
  interfaces. (ocaml/dune#13842, @anmonteiro)

- Honor sandbox settings specified inside `(:include ..)` expressions in the `deps` field
  (ocaml/dune#13898, @rgrinberg)

- Fix `dune pkg lock` failing when a `pin` stanza contains a `file://` URL with
  a relative path outside the workspace (ocaml/dune#13915, fixes ocaml/dune#10254, @shunueda)

- Use all stat attributes to detect patch back source tree changes (ocaml/dune#13986, @rgrinberg)

- Use device and inode number for invalidating cached digests (ocaml/dune#13991, @rgrinberg)

- Stop trying to set SO_REUSEADDR on unix sockets when setting up dune rpc
  (ocaml/dune#14056, @rgrinberg)

- Fix autolocking to correctly detect changes to `(depends)` in watch mode
  (ocaml/dune#14066, fixes ocaml/dune#13234, @Alizter)

- Fix incremental builds for libraries using `(wrapped (transition ...))`.
  The compat shim modules were never recompiled when the inner module's
  interface changed, causing "inconsistent assumptions" errors.
  (ocaml/dune#14090, fixes ocaml/dune#14089, @Alizter)

- Fix Rocq configuration detection to use `rocq c --config` subcommand
  instead of `rocq --config` (ocaml/dune#14093, fixes ocaml/dune#13774, @Durbatuluk1701)

- Bump dune rpc's request pending request limit 10 to 100 (ocaml/dune#14094, @rginberg)

- Invalidate stale cached digests in all build commands (ocaml/dune#14126, @rgrinberg)

- Fix `root_module` generating duplicate module definitions when a
  findlib sub-package shares a directory with its parent (e.g.,
  `logs.lwt` alongside `logs`). (ocaml/dune#14135, fixes ocaml/dune#6148, @robinbb)

- Fix `dune subst` prepending a duplicate `version:` field to opam
  files that already contain one, instead of replacing it in place.
  (ocaml/dune#14136, fixes ocaml/dune#878, @robinbb)

- Fix `@ocaml-index` alias being generated for all contexts, causing build
  errors in multi-context workspaces where some libraries are disabled in
  non-default contexts. The alias is now only generated for the merlin context.
  (ocaml/dune#14137, fixes ocaml/dune#12007, @robinbb)

- Remove the warning about the deprecation of the coq stanza for
  dune lang before 3.21 since it has been introduced in this
  version (ocaml/dune#14187, @bobot)

- `$ dune init` now generates projects with correct .opam files (ocaml/dune#14192, @rgrinberg)

- Send SIGTERM before SIGKILL when cancelling child processes in watch
  mode, giving cleanup handlers a chance to run before escalating.
  (ocaml/dune#14224, ocaml/dune#14170, fixes ocaml/dune#2445, @robinbb)

- Correctly specify dependencies for `generate_runner` in inline tests (ocaml/dune#14276, @rgrinberg)

- Fix duplicate dune version bounds in generated opam files. When users
  declare `(dune (>= X.Y))` matching or exceeding the `(lang dune X.Y)`
  version, the generated opam `depends` no longer contains redundant
  constraints like `{>= "2.7" & >= "2.7"}`. (ocaml/dune#3916, ocaml/dune#11106, @robinbb)

- Fix inline tests not being executed for byte-only libraries. When a library
  has `(modes byte)`, the inline test runner is now linked in byte mode so the
  library's test code is included. (ocaml/dune#9757, @robinbb)

### Added

- Add support for `c_library_flags` in foreign_stubs (ocaml/dune#13484, @madroach)

- Move the management of Jsoo config details out of dune (ocaml/dune#13613, @vouillon)

- Js_of_ocaml: share standalone runtimes (ocaml/dune#13621, @vouillon)

- Allow multiple `(dirs ..)` stanzas in the same Dune file. Starting with
  `(lang dune 3.23)`, Dune takes the union of the specified directories
  (ocaml/dune#13734, fixes ocaml/dune#6249, @anmonteiro)

- Sandboxed rules are now allowed to produce diff promotions when `(corrections
  produce)` is set on the rules. Whenever such an action produces `foo.corrected`, it will
  be automatically registered as a promotion for `foo` (ocaml/dune#13813, @rgrinberg)

- `$ dune clean` now accepts arguments to only remove certain targets from the
  _build directory (ocaml/dune#13875, @rgrinberg)

- `$ dune promote` now promotes all paths that are a prefix of the path provided.
  For example, `$ dune promote foo` will promote `foo`, `foo/bar`, `foo/bar/baz`
  (but not `foobar`). (ocaml/dune#13876, @rgrinberg)

- Allow for the `diff` action to diff entire directories (ocaml/dune#13880, fixes ocaml/dune#3567, @rgrinberg)

- A hint is now emitted when trying to build a target inside a directory that
  was excluded by a `(dirs ...)` stanza (ocaml/dune#13919, @mefyl).

- Add --debug-backtraces to `$ dune {promote,trace,cache}` (ocaml/dune#13933, @rgrinberg)

- Actions are now able to observe their project directory via
  `DUNE_PROJECT_ROOT` (ocaml/dune#13934, @rgrinberg)

- Support hardlink sandboxing on Windows. (ocaml/dune#13987, addresses part of ocaml/dune#4362, @Alizter)

- `rocq.extraction`: Add `extracted_files` field in `(rocq 0.13)`, replacing
  `extracted_modules`, supporting extraction to languages other than OCaml
  (ocaml/dune#13997, @Durbatuluk1701).

- Infer source directories as dependencies when they're as reference
  directories in `diff` actions.

- Add trace events for build start/stop/restarts (ocaml/dune#14163, ocaml/dune#14166, @rgrinberg)

- Generate `compile_commands.json` for C/C++ foreign stubs when building
  `@check` with `(lang dune 3.23)`. This enables `clangd`, `ccls`, and other
  tools that consume compilation databases. (ocaml/dune#14185, fixes ocaml/dune#3531, @Alizter)

- Add trace events for accepting clients and shutting down RPC (ocaml/dune#14232, @rgrinberg)

- Back up the default trace file as `trace.csexp.old` before each build,
  preserving the previous trace for comparison. This does not apply when
  `--trace-file` is used. (ocaml/dune#14269, @Alizter)

### Changed

- Dune digests target files and directories in background threads (ocaml/dune#13341,
  @rgrinbreg)

- `Dyn.pp` now prints valid OCaml literals for more constructors:
  - `Char` is quoted (e.g., `'a'`)
  - `Int32`/`Int64`/`Nativeint` include literal suffixes (`l`/`L`/`n`)
  - `Float` handles `infinity`, `neg_infinity`, and `nan`
  (ocaml/dune#13394, grants ocaml/dune#13378, @Alizter)

- Bump the minimal OCaml version required to build Dune from 4.08 to 4.14.
  (ocaml/dune#13533, @Alizter)

- Starting from 3.23, user rules are sandboxed by default (ocaml/dune#13805, @rgrinberg)

- Dune will no longer stat paths in the _build directory. This was done as protection
  from user rules accidentally touching things in the _build directory. This is forbidden,
  and dune offers rule sandboxing to prevent this (ocaml/dune#13875, @rgrinberg)

- Improve mtime precision by no longer approximating them with floats (ocaml/dune#13962,
  @rgrinberg).

- Remove `--makefile` (or `-m`) in `$ dune rules`. The sexp output is the only
  supported way of reflecting dune rules (ocaml/dune#14069, @rgrinberg)

- Do not automatically promote files. Now, opam files must be manually
  promoted with `$ dune promote`. Their generation is triggered by `@install`,
  `@runtest`, and `@opam`. In release mode, .opam files aren't generated at all
  and whatever is in the source is used (ocaml/dune#14108, @rgrinberg)

- Inline test runner generation is now sandboxed (ocaml/dune#14257, @rgrinberg)
@Alizter Alizter added this to the 3.23.0 milestone Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rocq Dune support for the Rocq proof assistant

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants