Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/changes/fixed/14524.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Fix `dune build` failing with "No rule found" when `lock_dir` paths in
`dune-workspace` contain a subdirectory (e.g. `(path sub/dune.lock)`).
(#14524, fixes #14523, @Alizter)
1 change: 1 addition & 0 deletions src/dune_rules/lock_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,7 @@ let setup_rules ~components ~dir =
let lock_dir = Path.Source.to_local lock_dir_path in
let+ lock_rule = setup_lock_rules_with_source workspace ~dir ~lock_dir in
Gen_rules.combine rules lock_rule)
| ".lock" :: _ :: _ -> Memo.return (Gen_rules.redirect_to_parent Gen_rules.Rules.empty)
Comment thread
Leonidas-from-XIV marked this conversation as resolved.
| [ ".dev-tool-locks" ] ->
Memo.List.fold_left Dev_tool.all ~init:empty ~f:(fun rules dev_tool ->
let+ dev_tool_rules = setup_dev_tool_lock_rules ~dir dev_tool in
Expand Down
3 changes: 2 additions & 1 deletion src/source/workspace.ml
Original file line number Diff line number Diff line change
Expand Up @@ -815,7 +815,8 @@ let source_path_of_lock_dir_path path =
| In_source_tree s -> s
| In_build_dir b ->
(match Path.Build.explode b with
| [ _; _; ".lock"; lock_dir ] -> Path.Source.of_string lock_dir
| _ :: _ :: ".lock" :: (_ :: _ as lock_dir_segs) ->
Path.Source.L.relative Path.Source.root lock_dir_segs
| [ ".dev-tools.locks"; dev_tool ] ->
Path.Source.L.relative Path.Source.root [ "_build"; ".dev-tools.locks"; dev_tool ]
| components ->
Expand Down
17 changes: 12 additions & 5 deletions test/blackbox-tests/test-cases/pkg/lock-dir-subdirectory-path.t
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,17 @@ Lock directories in subdirectories should work.
> EOF
$ source_lock_dir=sub/dune.lock make_lockdir

BUG: no rule is generated for the lock directory at the subdirectory path.
$ dune build

Also with deeper nesting:

$ cat > dune-workspace <<EOF
> (lang dune 3.24)
> (lock_dir (path a/b/c.lock))
> (context
> (default
> (lock_dir a/b/c.lock)))
> EOF
$ source_lock_dir=a/b/c.lock make_lockdir

$ dune build
Error: No rule found for default/.lock/sub/dune.lock (context _private)
-> required by read lock directory
_build/_private/default/.lock/sub/dune.lock
[1]
Loading