Skip to content
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

[coq] Composition with (boot) theories hangs with a cycle in Dune > 3.7 when coq lang > 0.6 #7908

Closed
ejgallego opened this issue Jun 6, 2023 · 16 comments · Fixed by #9496 or ocaml/opam-repository#25081
Labels
Milestone

Comments

@ejgallego
Copy link
Collaborator

ejgallego commented Jun 6, 2023

I've discovered some issues when testing composition with Coq itself in Dune 3.8.

First issue is as follows, given:

  • a composed Coq build (see [1] how to setup)
  • a (lang coq 0.7) or 0.8

Then Dune will fail with:

Error: Dependency cycle between:  
   Computing installable artifacts for package coqide-server
-> required by Computing installable artifacts for package coq-core
-> required by _build/default/coq-core.install
-> required by alias default in dune:22

This seems to be related to the Coq_config resolution in boot. Note that the issue doesn't occur for lower versions of the Coq language.

cc @Alizter

[1] To reproduce, you can use Coq's main branch:

$ git clone https://github.com/coq/coq.git
$ cd coq && cp theories/dune.disabled theories/dune
$ # edit dune-project to raise `(lang coq ...)`
$ dune build @default
@ejgallego
Copy link
Collaborator Author

@rgrinberg it seems to the that the problem here is as follows:

  • we have two packages coq-core and coq-stdlib, coqc is in coq-core, coq-stdlib has all the .v files
  • to compute the list of files to install for coq-stdlib, Dune needs to call coqc --config to see if Coq has native compiler enabled
  • the resolution of coqc in this case seems to depend on all the .install files in scope.

And boom! Here we got a cycle. Is there any hope to avoid this?

It would also be fine for us to use a weaker resolution method.

@rgrinberg
Copy link
Member

rgrinberg commented Jun 7, 2023

Can you post the trace of the cycle?

EDIT: I see the cycle is in the first post.

I suppose we can change the computation of the artifacts db to do binaries and libraries separately.

@ejgallego
Copy link
Collaborator Author

I suppose we can change the computation of the artifacts db to do binaries and libraries separately.

Happy to follow your lead on this.

For a short-term fix, do we have a method that will resolve the binary more weakly ?

@Alizter
Copy link
Collaborator

Alizter commented Jun 7, 2023

Well there is Bin.which but that won't be able to find it from a super_context.

@ejgallego
Copy link
Collaborator Author

If that doesn't trigger the cycle we could live with it, no?

The only downside is that the Coq composed build wouldn't detect native or version, but that's not a big deal I think.

@ejgallego
Copy link
Collaborator Author

I am surprised tho the cycle doesn't trigger even in a non-composed scenario wil multiple packages tho.

We may likely have a problem there too, but maybe people haven't bumped the (lang coq ) variable yet so it is not bitting them.

@rgrinberg
Copy link
Member

Could you prepare a small test case (with a fake coq package)? I'll have a look.

@Alizter
Copy link
Collaborator

Alizter commented Jun 7, 2023

I tried to prepare a case but I ended up creating a loop that hangs. Which is independently a strange occurrence.

Testing memo cycle in dune coq rules

  $ cat > dune-project << EOF
  > (lang dune 3.9)
  > (using coq 0.8)
  > (package (name foo))
  > (package (name bar))
  > EOF

  $ cat > dune << EOF
  > (executable
  >  (public_name coqc)
  >  (package foo))
  > 
  > (coq.theory
  >  (name bar)
  >  (package bar))
  > EOF

  $ cat > coqc.ml
  $ cat > bar.v

  $ dune build @install

@ejgallego
Copy link
Collaborator Author

Note that in my original case dune also hanged, but it did print the cycle information before getting stuck.

@rgrinberg
Copy link
Member

Yeah those are separate issues.

One is a bug with dune's cycle detection. The other is a true cycle in our rules that we need to workaround.

Let's try to get a reproduction case of the latter.

@emillon emillon removed this from the 3.8.2 milestone Jun 16, 2023
@Alizter Alizter added this to the 3.9.0 milestone Jun 16, 2023
@ejgallego
Copy link
Collaborator Author

@Alizter case works as a reproduction case for the rule cycles, even with just a single package.

The surprising thing is that if you rename the public name from coqc to some other name, the cycle disappears.

@ejgallego
Copy link
Collaborator Author

I'm afraid I'm stuck on how to make progress on this; it is unfortunate as I cannot migrate a few project to (lang coq 0.8) which I need in order to fix the remaining TODOs towards 1.0.

@Alizter
Copy link
Collaborator

Alizter commented Dec 3, 2023

I started printing dep nodes that are being added in the first second of dune running in my example and got this:

Details
  ("fs_memo_for_watching_via_parent", In_source_tree "dune-workspace")
  ("fs_memo_for_watching_directly", In_source_tree ".")
  ("fs_memo_for_watching_via_parent", In_source_tree ".bin")
  ("fs_memo_for_watching_directly", In_source_tree ".bin")
  ("readdir-of-source-path", In_source_tree ".")
  ("fs_memo_for_watching_via_parent", In_source_tree "dune-project")
  ("fs_memo_for_watching_via_parent", In_source_tree ".");
  ("fs_memo_for_watching_directly", In_source_tree ".")
  ("fs_memo_for_watching_via_parent", In_source_tree "dune-project")
  ("ensure-dune-project-file-exists",
  (false,
  { name = Named "foo"
  ; root = In_source_tree "."
  ; version = None
  ; dune_version = (3, 9)
  ; info =
      { source = None
      ; license = None
      ; homepage = None
      ; documentation = None
      ; bug_reports = None
      ; maintainers = None
      ; authors = None
      }
  ; project_file = In_source_tree "dune-project"
  ; packages =
      [ ("foo",
        { id = { name = "foo"; dir = In_source_tree "." }
        ; synopsis = None
        ; description = None
        ; depends = []
        ; conflicts = []
        ; depopts = []
        ; info =
            { source = None
            ; license = None
            ; homepage = None
            ; documentation = None
            ; bug_reports = None
            ; maintainers = None
            ; authors = None
            }
        ; has_opam_file = Exists false
        ; tags = []
        ; version = None
        ; deprecated_package_names = map {}
        ; sites = map {}
        ; allow_empty = false
        })
      ]
  ; implicit_transitive_deps = true
  ; wrapped_executables = true
  ; map_workspace_root = true
  ; executables_implicit_empty_intf = true
  ; accept_alternative_dune_file_name = false
  ; generate_opam_files = false
  ; warnings = <opaque>
  ; use_standard_c_and_cxx_flags = Some true
  ; file_key = "3c4086b92437"
  ; dialects =
      map
        { "ocaml" :
            { name = "ocaml"
            ; file_kinds =
                { impl =
                    Some
                      { kind = "impl"
                      ; extension = ".ml"
                      ; preprocess = None
                      ; format =
                          Some
                            ([ "chdir"
                             ; template "%{workspace_root}"
                             ; [ "run"
                               ; "ocamlformat"
                               ; "--impl"
                               ; template "%{input_file}"
                               ]
                             ],
                            [ ".ocamlformat"
                            ; ".ocamlformat-ignore"
                            ; ".ocamlformat-enable"
                            ])
                      }
                ; intf =
                    Some
                      { kind = "intf"
                      ; extension = ".mli"
                      ; preprocess = None
                      ; format =
                          Some
                            ([ "chdir"
                             ; template "%{workspace_root}"
                             ; [ "run"
                               ; "ocamlformat"
                               ; "--intf"
                               ; template "%{input_file}"
                               ]
                             ],
                            [ ".ocamlformat"
                            ; ".ocamlformat-ignore"
                            ; ".ocamlformat-enable"
                            ])
                      }
                }
            }
        ; "reason" :
            { name = "reason"
            ; file_kinds =
                { impl =
                    Some
                      { kind = "impl"
                      ; extension = ".re"
                      ; preprocess =
                          Some
                            [ "run"
                            ; "refmt"
                            ; "--print"
                            ; "binary"
                            ; template "%{input_file}"
                            ]
                      ; format =
                          Some
                            ([ "run"; "refmt"; template "%{input_file}" ], [])
                      }
                ; intf =
                    Some
                      { kind = "intf"
                      ; extension = ".rei"
                      ; preprocess =
                          Some
                            [ "run"
                            ; "refmt"
                            ; "--print"
                            ; "binary"
                            ; template "%{input_file}"
                            ]
                      ; format =
                          Some
                            ([ "run"; "refmt"; template "%{input_file}" ], [])
                      }
                }
            }
        }
  ; explicit_js_mode = true
  ; format_config = None
  ; subst_config = None
  ; strict_package_deps = false
  ; cram = true
  ; allow_approximate_merlin = <opaque>
  ; expand_aliases_in_sandbox = false
  ; opam_file_location = Relative_to_project
  }))
  ("fs_memo_for_watching_via_parent", In_source_tree "dune")
  ("find-dir-raw", In_source_tree ".")
  ("Dune_files.interpret", <opaque>)
  ("dune_load", ())
  ("workspaces-internal", ())
  ("workspace", ())
  ("workspace", ())
  ("workspace", ())
  ("fs_memo_for_watching_via_parent", In_source_tree "dune.lock")
  ("instantiate-context", "default")
  ("native-context", ())
  ("build-contexts", ())
  ("dune_load", ())
  ("only_packages", ())
  ("build-contexts", ())
  ("workspace", ())
  ("context-db", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("fs_memo_for_watching_via_parent",
  External
    "/home/ali/dune/_build/default/test/blackbox-tests/test-cases/.bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/home/ali/dune/_build/default/test/blackbox-tests/test-cases/.bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External "/home/ali/dune/_build/install/default/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External "/home/ali/dune/_build/install/default/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/2z3arz5ni43qdkbk95pmkl25kf77ww3i-glib-2.76.4-bin/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/2z3arz5ni43qdkbk95pmkl25kf77ww3i-glib-2.76.4-bin/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/xb0pnbnfgc5ap6xv8q6gdipvryb5zq0v-nodejs-slim-18.18.2/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/xb0pnbnfgc5ap6xv8q6gdipvryb5zq0v-nodejs-slim-18.18.2/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/ifr6srqgpvygd5vp14748d109ri31isv-pkg-config-wrapper-0.29.2/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/ifr6srqgpvygd5vp14748d109ri31isv-pkg-config-wrapper-0.29.2/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/lcpz2qk9i2j6zc8rq9a37abvlxvv4n6f-opam-2.1.5/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/lcpz2qk9i2j6zc8rq9a37abvlxvv4n6f-opam-2.1.5/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/zwbx8f5a4w9m5hk5h4a89jj56rxi1ks4-ocaml4.14.1-ocamlformat-0.26.1/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/zwbx8f5a4w9m5hk5h4a89jj56rxi1ks4-ocaml4.14.1-ocamlformat-0.26.1/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/6v7cw9a64qapalpz1n60wpx4a70ram3l-dune/bin/ocamlc.opt")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/6v7cw9a64qapalpz1n60wpx4a70ram3l-dune/bin/ocamlc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocamlc.opt")
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocamlopt.opt")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocaml")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocamldep.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocamlmklib.opt")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/ocamlobjinfo.opt")
  ("ocaml_and_build_env_kind", ())
  ("ocaml_and_build_env_kind", ())
  ("default_ocamlpath", ())
  ("build-contexts", ())
  ("context-db-get", "default")
  ("build-contexts", ())
  ("<unnamed>", ())
  ("dune_load", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("ocaml_and_build_env_kind", ())
  ("ocaml_and_build_env_kind", ())
  ("build-contexts", ())
  ("findlib", ())
  ("default_ocamlpath", ())
  ("findlib_paths", ())
  ("ocaml_and_build_env_kind", ())
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/lib/ocaml/bigarray.cma")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/lib/ocaml/graphics.cma")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/lib/ocaml/nums.cma")
  ("findlib", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("build-contexts", ())
  ("Artifacts_db.all", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("Artifacts_db.all", ())
  ("make_sctx", ())
  ("Super_context.all", ())
  ("Super_context.all", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("get_installed_binaries", ())
  ("<unnamed>", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("Dune_files.interpret", <opaque>)
  ("only_packages", ())
  ("ocaml_and_build_env_kind", ())
  ("env-nodes-memo", In_build_dir "default")
  ("env-nodes-memo", In_build_dir "default")
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("default_env", ())
  ("<unnamed>", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("workspace", ())
  ("<unnamed>", ())
  ("Build_config.set", ())
  ("find-dir-raw", In_source_tree ".")
  ("workspace", ())
  ("find-dir-raw", In_source_tree ".")
  ("Dune_files.interpret", <opaque>)
  ("only_packages", ())
  ("get-dir-status", In_build_dir "default")
  ("find-dir-raw", In_source_tree ".")
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("fs_memo_for_watching_via_parent",
  External
    "/home/ali/dune/_build/default/test/blackbox-tests/test-cases/.bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/home/ali/dune/_build/install/default/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/2z3arz5ni43qdkbk95pmkl25kf77ww3i-glib-2.76.4-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/xb0pnbnfgc5ap6xv8q6gdipvryb5zq0v-nodejs-slim-18.18.2/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/ifr6srqgpvygd5vp14748d109ri31isv-pkg-config-wrapper-0.29.2/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/lcpz2qk9i2j6zc8rq9a37abvlxvv4n6f-opam-2.1.5/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/zwbx8f5a4w9m5hk5h4a89jj56rxi1ks4-ocaml4.14.1-ocamlformat-0.26.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/6v7cw9a64qapalpz1n60wpx4a70ram3l-dune/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/l1vs77vaaby67lfbnribaimqzpd19bci-ocaml-4.14.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/dd8zjwradbrhiqg920xs8gzzx1hn219l-ocaml4.14.1-findlib-1.9.6/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/znqwpxy9jlxcgi2ms2hga0ch87bbbr9g-patchelf-0.15.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/zlzz2z48s7ry0hkl55xiqp5a73b4mzrg-gcc-wrapper-12.3.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/0b9bsznqs6pdg42dxcwvrlmarjn2p6a1-gcc-12.3.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/nvh3jgs8pqghnsfzbv28004xkigiw8gc-glibc-2.38-23-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/vwkvhj69z4qqgmpa2lwm97kabf12p26r-coreutils-9.3/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/h8d2j0prdf7pnpgyrgkxrrbfwnmxbq6y-binutils-wrapper-2.40/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/p58l5qmzifl20qmjs3xfpl01f0mqlza2-binutils-2.40/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/6ar18384i87dgwyqw2lr434lwnr3y5c0-file-5.45/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/rbsqynlfkqgm4qbxcl78np14lll56n6h-mercurial-6.5.2/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/ffll6glz3gwx342z0ch8wx30p5cnqz1z-python3-3.11.5/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/nsp7ik5nhjwn0sgd4x2s8jl75dszmdma-strace-6.6/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/d2ahd40prw6c57yfbpjlxwlj0zvs406b-ocaml4.14.1-merlin-4.12-414/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/y22170hg44jjxrbvir2i8pvdgfa5gmi0-ocaml4.14.1-ppx_base-0.16/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/aikpwzhbg50nqz9wipy2wcwg8vpn2z6s-ocaml4.14.1-mdx-2.3.1-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/rp7icw4lnyifqzs9v8h1r49djxck16n1-ocaml4.14.1-cinaps-0.15.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/db6qpydlpsf8lgbip0ipgrsvcdlik4mf-ocaml4.14.1-menhir-20230608/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/s528zxigdsqbfcc59fhx6m9wdhwsld9x-ocaml4.14.1-odoc-2.2.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/mr05a9y8s27ja83w7n5r0cxgsjkifhyy-ocaml4.14.1-patdiff-0.16/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/i0mwibcsfc8a8ppjykv1335bvkrlxmv4-ocaml4.14.1-core_unix-0.16/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/ipl5c00mvc8ydldxjl528wq0bvvj6yj5-ocaml4.14.1-ppx_jane-0.16/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/8vlvldwf422fcfxd5kabdn6nh4ivlw4r-pcre-8.45-dev/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/cxpx3hcrf4kp968bc1s0md21r7ibxaar-pcre-8.45-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/kkx7f7v8js1f6csppf5g9576zlcrpwnz-ccls-0.20230717/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/lglgvjg5vn4kmznc17ac0mvs8a1lvyk4-ocaml4.14.1-ocaml-lsp-server-n-a/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/7mhfp8g75h7lk7534pgpsg0aj0vyrp69-ocaml4.14.1-melange-dev/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/1l570gf13x3ii1l8aj2clv72givd0c9q-ocaml4.14.1-rescript-syntax-dev/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/0glncgfnkf522k56kvmbw0524zqc2ai9-ocaml4.14.1-js_of_ocaml-compiler-5.4.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/d9911dza8lpz5rdghaq599hfx530yjwn-ocaml4.14.1-yojson-2.1.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/lw6p4issadazgak0lhv5jmkn24c2q26n-ocaml4.14.1-utop-2.13.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/r6b2zl1zqr100ki5x6bbnpykj4rh6dc1-ocaml4.14.1-lambda-term-3.3.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/nm2b6r5fv634w5iygxrm6xjj0wg3776y-ocaml4.14.1-uutf-1.0.3/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/njnkwi1inzih1m9gq6zh4aqf0h6d3ygq-ocaml4.14.1-uuseg-15.0.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/vwkvhj69z4qqgmpa2lwm97kabf12p26r-coreutils-9.3/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/qyzfglbrqb5ck0dgljplin2bvc4995w7-findutils-4.9.0/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/x6y2i213maj6ibcn0qzgg7graif5qcvi-diffutils-3.10/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/g5p3ky90xa05ggg5szyb0pbbl2vp7n03-gnused-4.9/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/p2r51wfg9m3ga7pp7avslpfhfa7w5y83-gnugrep-3.11/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/cmn958i8qym0qvmvydl23fh3bm3fbhl7-gawk-5.2.2/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/f5qy259g9b4qh0hwz22z5j5bq3m53cpv-gnutar-1.35/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/kmr52zpw7wazxywqvzgpdx0vnn9prd3v-gzip-1.13/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External
    "/nix/store/w1mar48lwkavwy64mvj567lwaqnm2l11-bzip2-1.0.8-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/9dh2csn531by6b1vr9jv85v4k17xwkid-gnumake-4.4.1/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/lf0wpjrj8yx4gsmw2s3xfl58ixmqk8qa-bash-5.2-p15/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/pinwlz7294p37d2sbkdpjildzxii42vv-patch-2.7.6/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/skrzk0g88jf9rg28labqsyxv7gg357q1-xz-5.4.4-bin/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/store/h5pshzq92r2xcv6w1p10cmkar4nyv0xp-file-5.45/bin/coqc")
  ("fs_memo_for_watching_via_parent", External "/run/wrappers/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/home/ali/.nix-profile/bin/coqc")
  ("fs_memo_for_watching_via_parent", External "/nix/profile/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/home/ali/.local/state/nix/profile/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/etc/profiles/per-user/ali/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/nix/var/nix/profiles/default/bin/coqc")
  ("fs_memo_for_watching_via_parent",
  External "/run/current-system/sw/bin/coqc")
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("which", <opaque>)
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("Dune_files.interpret", <opaque>)
  ("only_packages", ())
  ("gen-rules", In_build_dir "default")
  ("Super_context.all", ())
  ("Super_context.all", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("lib-entries-map", <opaque>)
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("lib-entries-map", <opaque>)
  ("only_packages", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("dune_load", ())
  ("only_packages", ())
  ("only_packages", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("lib-entries-map", <opaque>)
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("lib-entries-map", <opaque>)
  ("only_packages", ())
  ("Super_context.all", ())
  ("get-dir-status", In_build_dir "default")
  ("dir-contents-get0", ("default", In_build_dir "default"))
  ("build-contexts", ())
  ("Build_config.set", ())
  ("gen-rules", In_build_dir "default")
  ("gen-rules", In_build_dir "default/.dune")
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("find-dir-raw", In_source_tree ".dune")
  ("find-dir-raw", In_source_tree ".dune")
  ("load-dir", In_build_dir "default/.dune")
  ("find-dir-raw", In_source_tree ".")
  ("workspace", ())
  ("execution-parameters-of-dir", In_build_dir "default/.dune")
  ("context-db-get", "default")
  ("ocaml_and_build_env_kind", ())
  ("Rule.make", ())
  ("execute-rule", { id = 3; info = Internal })
  ("<unnamed>", ())
  ("build-file", In_build_dir "default/.dune/configurator")
  ("load-dir", In_build_dir "default/.dune")
  ("execution-parameters-of-dir", In_build_dir "default/.dune")
  ("context-db-get", "default")
  ("ocaml_and_build_env_kind", ())
  ("Rule.make", ())
  ("execute-rule", { id = 4; info = Internal })
  ("<unnamed>", ())
  ("build-file", In_build_dir "default/.dune/configurator.v2")
  ("force-configuration-files", ())
  ("env-nodes-memo", In_build_dir "default")
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("Dune_files.interpret", <opaque>)
  ("only_packages", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("<unnamed>", ())
  ("ocaml_and_build_env_kind", ())
  ("ocaml_and_build_env_kind", ())
  ("env-nodes-memo", In_build_dir "default")
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("find-dir-raw", In_source_tree ".")
  ("ocaml_and_build_env_kind", ())
  ("ocaml_and_build_env_kind", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("context-db-get", "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("<unnamed>", ())
  ("Artifacts.Bin.add_binaries", ())
  ("Artifacts.Bin.add_binaries", ())
  ("Artifacts.Bin.add_binaries", ())
  ("Build_config.set", ())
  ("workspace", ())
  ("gen-rules", In_build_dir "install")
  ("Super_context.all", ())
  ("dune_load", ())
  ("only_packages", ())
  ("install-rules-and-pkg-entries",
  ("default",
  { id = { name = "foo"; dir = In_source_tree "." }
  ; synopsis = None
  ; description = None
  ; depends = []
  ; conflicts = []
  ; depopts = []
  ; info =
      { source = None
      ; license = None
      ; homepage = None
      ; documentation = None
      ; bug_reports = None
      ; maintainers = None
      ; authors = None
      }
  ; has_opam_file = Exists false
  ; tags = []
  ; version = None
  ; deprecated_package_names = map {}
  ; sites = map {}
  ; allow_empty = false
  }))
  ("install-rule-scheme", "default")
  ("restrict-by-child-non-default-outer", ())
  ("filtered_stanzas", ())
  ("only_packages", ())
  ("dune_load", ())
  ("dune_load", ())
  ("only_packages", ())
  ("find-dir-raw", In_source_tree ".")
  ("env-nodes-memo", In_build_dir "default")
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("env-nodes-memo", In_build_dir "default")
  ("<unnamed>", ())
  ("Artifacts.Bin.add_binaries", ())
  [130]

I haven't looked at it in full detail yet but there seems to be a lot of stuff I don't understand. which appears way more then I think it should and env-nodes also appears too many times.

@Alizter
Copy link
Collaborator

Alizter commented Dec 3, 2023

Why for example, is coqc being depended on in every path in PATH? That seems like a bug.

It seems that PATH=foo:bar:baz adds memo nodes for foo/coqc, bar/coqc and baz/coqc.

@ejgallego
Copy link
Collaborator Author

Tested a bit more with gdb, but didn't make any progress. dune just deadlocks on the example.

@ejgallego ejgallego changed the title [coq] Composition with (boot) theories fails in Dune 3.7 / 3.8 when coq lang > 0.6 [coq] Composition with (boot) theories hangs with a cycle in Dune > 3.7 when coq lang > 0.6 Dec 12, 2023
@rgrinberg rgrinberg added this to the 3.13.0 milestone Jan 11, 2024
@rgrinberg rgrinberg linked a pull request Jan 11, 2024 that will close this issue
@ejgallego
Copy link
Collaborator Author

Unsure why this wasn't closed by #9496 merge, doing it myself. Thanks Rudi !!

emillon added a commit to emillon/opam-repository that referenced this issue Jan 12, 2024
CHANGES:

- Do not ignore `(formatting ..)` settings in context or workspace files
  (ocaml/dune#8447, @rgrinberg)

- Add command `dune cache clear` to completely delete all traces of the Dune
  cache. (ocaml/dune#8975, @nojb)

- Fixed a bug where Dune was incorrectly parsing the output of coqdep when it
  was escaped, as is the case on Windows. (ocaml/dune#9231, fixes ocaml/dune#9218, @Alizter)

- Copying mode for sandboxes will now follow symbolic links (ocaml/dune#9282, @rgrinberg)

- Forbid the empty `(binaries ..)` field in the `env` stanza in the workspace
  file unless language version is at least 3.2.

- [coq] Fix bug in computation of flags when composed with boot theories.
  (ocaml/dune#9347, fixes ocaml/dune#7909, @ejgallego)

- Fixed a bug where the `(select)` field of the `(libraries)` field of the
  `(test)` stanza wasn't working properly. (ocaml/dune#9387, fixes ocaml/dune#9365, @Alizter)

- Allow to disable Coq 0.8 deprecation warning (ocaml/dune#9439, @ejgallego)

- Fix handling of the `PATH` argument to `dune init proj NAME PATH`. An
  intermediate directory called `NAME` is no longer created if `PATH` is
  supplied, so `dune init proj my_project .` will now initialize a project in
  the current working directory. (ocaml/dune#9447, fixes ocaml/dune#9209, @shonfeder)

- Allow `OCAMLFIND_TOOLCHAIN` to be set per context in the workspace file
  through the `env` stanza. (ocaml/dune#9449, @rgrinberg)

- Experimental doc rules: Correctly handle the case when a package depends upon
  its own sublibraries (ocaml/dune#9461, fixes ocaml/dune#9456, @jonludlam)

- Resolve various public binaries to their build location, rather than to where
  they're copied in the `_build/install` directory (ocaml/dune#9496, fixes ocaml/dune#7908,
  @rgrinberg).

- Menhir: generate `.conflicts` file by default. Add new field to the
  `(menhir)` stanza to control the generation of this file: `(explain <blang
  expression>)`. Introduce `(menhir (flags ...) (explain ...))` field in the
  `(env)` stanza, delete `(menhir_flags)` field. All changes are guarded under
  a new version of the Menhir extension, 3.0. (ocaml/dune#9512, @nojb)

- Correctly ignore warning flags in vendored projects (ocaml/dune#9515, @rgrinberg)

- Directory targets can now be caches. (ocaml/dune#9535, @rleshchinskiy)

- Remove warning 30 from default set for projects where dune lang is at least
  3.13 (ocaml/dune#9568, @gasche)

- It is now possible to use special forms such as `(:include)` and variables
  `%{read-lines:}` in `(modules)` and similar fields. Note that the
  dependencies introduced in this way (ie the files being read) must live in a
  different directory than the stanza making use of them. (ocaml/dune#9578, @nojb)

- Use watch exclusions in watch mode on MacOS (ocaml/dune#9643, fixes ocaml/dune#9517,
  @PoorlyDefinedBehaviour)

- Fix merlin configuration for `(include_subdirs qualified)` modules (ocaml/dune#9659,
  fixes ocaml/dune#8297, @rgrinberg)

- Fix handling of `enabled_if` in binary install stanzas. Previously, we'd
  ignore the result of `enabled_if` when evaluating `%{bin:..}` (ocaml/dune#9707,
  @rgrinberg)

- Add `coqdoc_flags` field to `coq` field of `env` stanza allowing the setting
  of workspace-wide defaults for `coqdoc_flags`. (ocaml/dune#9280, fixes ocaml/dune#9139, @Alizter)

- ctypes: fix an error where `(ctypes)` with no `(function_description)` would
  cause an error trying refer to a nonexistent `_stubs.a` dependency (ocaml/dune#9302,
  fix ocaml/dune#9300, @emillon)
emillon added a commit to emillon/opam-repository that referenced this issue Jan 16, 2024
CHANGES:

### Added

- Add command `dune cache clear` to completely delete all traces of the Dune
  cache. (ocaml/dune#8975, @nojb)

- Allow to disable Coq 0.8 deprecation warning (ocaml/dune#9439, @ejgallego)

- Allow `OCAMLFIND_TOOLCHAIN` to be set per context in the workspace file
  through the `env` stanza. (ocaml/dune#9449, @rgrinberg)

- Menhir: generate `.conflicts` file by default. Add new field to the
  `(menhir)` stanza to control the generation of this file: `(explain <blang
  expression>)`. Introduce `(menhir (flags ...) (explain ...))` field in the
  `(env)` stanza, delete `(menhir_flags)` field. All changes are guarded under
  a new version of the Menhir extension, 3.0. (ocaml/dune#9512, @nojb)

- Directory targets can now be cached. (ocaml/dune#9535, @rleshchinskiy)

- It is now possible to use special forms such as `(:include)` and variables
  `%{read-lines:}` in `(modules)` and similar fields. Note that the
  dependencies introduced in this way (ie the files being read) must live in a
  different directory than the stanza making use of them. (ocaml/dune#9578, @nojb)

- Remove warning 30 from default set for projects where dune lang is at least
  3.13 (ocaml/dune#9568, @gasche)

- Add `coqdoc_flags` field to `coq` field of `env` stanza allowing the setting
  of workspace-wide defaults for `coqdoc_flags`. (ocaml/dune#9280, fixes ocaml/dune#9139, @Alizter)

- ctypes: fix an error where `(ctypes)` with no `(function_description)` would
  cause an error trying refer to a nonexistent `_stubs.a` dependency (ocaml/dune#9302,
  fix ocaml/dune#9300, @emillon)

### Changed

- Check that package names in `(depends)` and related fields in `dune-project`
  are well-formed. (ocaml/dune#9472, fixes ocaml/dune#9270, @ElectreAAS)

### Fixed

- Do not ignore `(formatting ..)` settings in context or workspace files
  (ocaml/dune#8447, @rgrinberg)

- Fixed a bug where Dune was incorrectly parsing the output of coqdep when it
  was escaped, as is the case on Windows. (ocaml/dune#9231, fixes ocaml/dune#9218, @Alizter)

- Copying mode for sandboxes will now follow symbolic links (ocaml/dune#9282, @rgrinberg)

- Forbid the empty `(binaries ..)` field in the `env` stanza in the workspace
  file unless language version is at least 3.2.

- [coq] Fix bug in computation of flags when composed with boot theories.
  (ocaml/dune#9347, fixes ocaml/dune#7909, @ejgallego)

- Fixed a bug where the `(select)` field of the `(libraries)` field of the
  `(test)` stanza wasn't working properly. (ocaml/dune#9387, fixes ocaml/dune#9365, @Alizter)

- Fix handling of the `PATH` argument to `dune init proj NAME PATH`. An
  intermediate directory called `NAME` is no longer created if `PATH` is
  supplied, so `dune init proj my_project .` will now initialize a project in
  the current working directory. (ocaml/dune#9447, fixes ocaml/dune#9209, @shonfeder)

- Experimental doc rules: Correctly handle the case when a package depends upon
  its own sublibraries (ocaml/dune#9461, fixes ocaml/dune#9456, @jonludlam)

- Resolve various public binaries to their build location, rather than to where
  they're copied in the `_build/install` directory (ocaml/dune#9496, fixes ocaml/dune#7908,
  @rgrinberg).

- Correctly ignore warning flags in vendored projects (ocaml/dune#9515, @rgrinberg)

- Use watch exclusions in watch mode on MacOS (ocaml/dune#9643, fixes ocaml/dune#9517,
  @PoorlyDefinedBehaviour)

- Fix merlin configuration for `(include_subdirs qualified)` modules (ocaml/dune#9659,
  fixes ocaml/dune#8297, @rgrinberg)

- Fix handling of `enabled_if` in binary install stanzas. Previously, we'd
  ignore the result of `enabled_if` when evaluating `%{bin:..}` (ocaml/dune#9707,
  @rgrinberg)
nberth pushed a commit to nberth/opam-repository that referenced this issue Jun 18, 2024
CHANGES:

### Added

- Add command `dune cache clear` to completely delete all traces of the Dune
  cache. (ocaml/dune#8975, @nojb)

- Allow to disable Coq 0.8 deprecation warning (ocaml/dune#9439, @ejgallego)

- Allow `OCAMLFIND_TOOLCHAIN` to be set per context in the workspace file
  through the `env` stanza. (ocaml/dune#9449, @rgrinberg)

- Menhir: generate `.conflicts` file by default. Add new field to the
  `(menhir)` stanza to control the generation of this file: `(explain <blang
  expression>)`. Introduce `(menhir (flags ...) (explain ...))` field in the
  `(env)` stanza, delete `(menhir_flags)` field. All changes are guarded under
  a new version of the Menhir extension, 3.0. (ocaml/dune#9512, @nojb)

- Directory targets can now be cached. (ocaml/dune#9535, @rleshchinskiy)

- It is now possible to use special forms such as `(:include)` and variables
  `%{read-lines:}` in `(modules)` and similar fields. Note that the
  dependencies introduced in this way (ie the files being read) must live in a
  different directory than the stanza making use of them. (ocaml/dune#9578, @nojb)

- Remove warning 30 from default set for projects where dune lang is at least
  3.13 (ocaml/dune#9568, @gasche)

- Add `coqdoc_flags` field to `coq` field of `env` stanza allowing the setting
  of workspace-wide defaults for `coqdoc_flags`. (ocaml/dune#9280, fixes ocaml/dune#9139, @Alizter)

- ctypes: fix an error where `(ctypes)` with no `(function_description)` would
  cause an error trying refer to a nonexistent `_stubs.a` dependency (ocaml/dune#9302,
  fix ocaml/dune#9300, @emillon)

### Changed

- Check that package names in `(depends)` and related fields in `dune-project`
  are well-formed. (ocaml/dune#9472, fixes ocaml/dune#9270, @ElectreAAS)

### Fixed

- Do not ignore `(formatting ..)` settings in context or workspace files
  (ocaml/dune#8447, @rgrinberg)

- Fixed a bug where Dune was incorrectly parsing the output of coqdep when it
  was escaped, as is the case on Windows. (ocaml/dune#9231, fixes ocaml/dune#9218, @Alizter)

- Copying mode for sandboxes will now follow symbolic links (ocaml/dune#9282, @rgrinberg)

- Forbid the empty `(binaries ..)` field in the `env` stanza in the workspace
  file unless language version is at least 3.2.

- [coq] Fix bug in computation of flags when composed with boot theories.
  (ocaml/dune#9347, fixes ocaml/dune#7909, @ejgallego)

- Fixed a bug where the `(select)` field of the `(libraries)` field of the
  `(test)` stanza wasn't working properly. (ocaml/dune#9387, fixes ocaml/dune#9365, @Alizter)

- Fix handling of the `PATH` argument to `dune init proj NAME PATH`. An
  intermediate directory called `NAME` is no longer created if `PATH` is
  supplied, so `dune init proj my_project .` will now initialize a project in
  the current working directory. (ocaml/dune#9447, fixes ocaml/dune#9209, @shonfeder)

- Experimental doc rules: Correctly handle the case when a package depends upon
  its own sublibraries (ocaml/dune#9461, fixes ocaml/dune#9456, @jonludlam)

- Resolve various public binaries to their build location, rather than to where
  they're copied in the `_build/install` directory (ocaml/dune#9496, fixes ocaml/dune#7908,
  @rgrinberg).

- Correctly ignore warning flags in vendored projects (ocaml/dune#9515, @rgrinberg)

- Use watch exclusions in watch mode on MacOS (ocaml/dune#9643, fixes ocaml/dune#9517,
  @PoorlyDefinedBehaviour)

- Fix merlin configuration for `(include_subdirs qualified)` modules (ocaml/dune#9659,
  fixes ocaml/dune#8297, @rgrinberg)

- Fix handling of `enabled_if` in binary install stanzas. Previously, we'd
  ignore the result of `enabled_if` when evaluating `%{bin:..}` (ocaml/dune#9707,
  @rgrinberg)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment