Skip to content

Commit 01f2b01

Browse files
Create directory target to write lock file into
Signed-off-by: Marek Kubica <[email protected]>
1 parent 299e75f commit 01f2b01

File tree

7 files changed

+100
-2
lines changed

7 files changed

+100
-2
lines changed

src/dune_rules/alias0.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ let doc_new = standard "doc-new"
2424
let check = standard "check"
2525
let install = standard "install"
2626
let pkg_install = Alias.Name.of_string "pkg-install"
27+
let pkg_lock = Alias.Name.of_string "pkg-lock"
2728
let ocaml_index = standard "ocaml-index"
2829
let runtest = standard "runtest"
2930
let all = standard "all"

src/dune_rules/alias0.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ val check : Name.t
1414
val ocaml_index : Name.t
1515
val install : Name.t
1616
val pkg_install : Name.t
17+
val pkg_lock : Name.t
1718
val runtest : Name.t
1819
val all : Name.t
1920
val default : Name.t

src/dune_rules/gen_rules.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,7 @@ let gen_rules ctx ~dir components =
716716
else
717717
let* () = raise_on_lock_dir_out_of_sync ctx in
718718
let gen_pkg_alias_rule = Pkg_rules.setup_pkg_install_alias ~dir ctx in
719+
let gen_lock_rule = Pkg_rules.setup_tmp_lock_alias ~dir ctx in
719720
let+ sctx_rules = gen_rules ctx (Super_context.find_exn ctx) ~dir components in
720-
Gen_rules.combine sctx_rules gen_pkg_alias_rule
721+
Gen_rules.combine (Gen_rules.combine sctx_rules gen_pkg_alias_rule) gen_lock_rule
721722
;;

src/dune_rules/lock_rules.ml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
open Import
2+
3+
module Spec = struct
4+
type ('path, 'target) t =
5+
{ target : 'target
6+
; lock_dir : string
7+
}
8+
9+
let name = "lock"
10+
let version = 1
11+
let bimap t _ g = { t with target = g t.target }
12+
let is_useful_to ~memoize = memoize
13+
14+
let encode { target; lock_dir } _encode_path encode_target : Sexp.t =
15+
Sexp.List [ encode_target target; Sexp.Atom lock_dir ]
16+
;;
17+
18+
let action { target; lock_dir } ~ectx:_ ~eenv:_ =
19+
let open Fiber.O in
20+
let+ () = Fiber.return () in
21+
Printf.eprintf
22+
"Our ACTION target is %s, our lock_dir is %S\n"
23+
(Path.Build.to_string target)
24+
lock_dir;
25+
let path = Path.build target in
26+
Path.mkdir_p path;
27+
Io.write_file ~binary:true (Path.relative path "lock.dune") "Hello I exist";
28+
()
29+
;;
30+
end
31+
32+
module A = Action_ext.Make (Spec)
33+
34+
let action ~target ~lock_dir = A.action { Spec.target; lock_dir }
35+
36+
let lock ~target ~lock_dir =
37+
action ~target ~lock_dir
38+
|> Action.Full.make ~can_go_in_shared_cache:true
39+
|> Action_builder.With_targets.return
40+
|> Action_builder.With_targets.add_directories ~directory_targets:[ target ]
41+
;;

src/dune_rules/lock_rules.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
open Import
2+
3+
val lock : target:Path.Build.t -> lock_dir:string -> Action.Full.t With_targets.t

src/dune_rules/pkg_rules.ml

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1892,6 +1892,48 @@ let setup_pkg_install_alias =
18921892
|> Gen_rules.rules_here
18931893
;;
18941894

1895+
let setup_tmp_lock_alias =
1896+
fun ~dir ctx_name ->
1897+
let alias = Alias.make ~dir Alias0.pkg_lock in
1898+
let rule =
1899+
Rules.collect_unit (fun () ->
1900+
(* careful, need to point to a file that will be created by the rule *)
1901+
let path =
1902+
let ( / ) = Path.Build.relative in
1903+
(* TODO get lock dir name instead of hardcoding `dune.lock` *)
1904+
Private_context.t.build_dir
1905+
/ Context_name.to_string ctx_name
1906+
/ ".lock"
1907+
/ "dune.lock"
1908+
/ "content"
1909+
in
1910+
let deps = Action_builder.path (Path.build path) in
1911+
Rules.Produce.Alias.add_deps alias deps)
1912+
in
1913+
Gen_rules.rules_for ~dir ~allowed_subdirs:Filename.Set.empty rule
1914+
|> Gen_rules.rules_here
1915+
;;
1916+
1917+
let lock_rule ~target lock_dir = Lock_rules.lock ~target ~lock_dir |> Memo.return
1918+
1919+
let setup_lock_rules ctx_name ~lock_dir : Gen_rules.result =
1920+
let target =
1921+
let ( / ) = Path.Build.relative in
1922+
Private_context.t.build_dir
1923+
/ Context_name.to_string ctx_name
1924+
/ ".lock"
1925+
/ lock_dir
1926+
/ "content"
1927+
in
1928+
let gen_rules lock_dir =
1929+
let* lock_rule = lock_rule ~target lock_dir in
1930+
rule ~loc:Loc.none lock_rule
1931+
in
1932+
let rules = Rules.collect_unit (fun () -> gen_rules lock_dir) in
1933+
let directory_targets = Path.Build.Map.singleton target Loc.none in
1934+
Gen_rules.make ~directory_targets rules
1935+
;;
1936+
18951937
let setup_package_rules ~package_universe ~dir ~pkg_name : Gen_rules.result Memo.t =
18961938
let name = User_error.ok_exn (Package.Name.of_string_user_error (Loc.none, pkg_name)) in
18971939
let* db = DB.get package_universe in
@@ -1961,8 +2003,15 @@ let setup_rules ~components ~dir ctx =
19612003
Memo.return @@ Gen_rules.redirect_to_parent Gen_rules.Rules.empty
19622004
| true, ".dev-tool" :: _ :: _ :: _ ->
19632005
Memo.return @@ Gen_rules.redirect_to_parent Gen_rules.Rules.empty
2006+
| _, [ ".lock" ] ->
2007+
Gen_rules.make
2008+
~build_dir_only_sub_dirs:
2009+
(Gen_rules.Build_only_sub_dirs.singleton ~dir Subdir_set.all)
2010+
(Memo.return Rules.empty)
2011+
|> Memo.return
2012+
| _, [ ".lock"; lock_dir ] -> Memo.return @@ setup_lock_rules ctx ~lock_dir
19642013
| is_default, [] ->
1965-
let sub_dirs = ".pkg" :: (if is_default then [ ".dev-tool" ] else []) in
2014+
let sub_dirs = ".pkg" :: ".lock" :: (if is_default then [ ".dev-tool" ] else []) in
19662015
let build_dir_only_sub_dirs =
19672016
Gen_rules.Build_only_sub_dirs.singleton ~dir @@ Subdir_set.of_list sub_dirs
19682017
in

src/dune_rules/pkg_rules.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ val setup_pkg_install_alias
3232
: dir:Path.Build.t
3333
-> Context_name.t
3434
-> Build_config.Gen_rules.t
35+
36+
val setup_tmp_lock_alias : dir:Path.Build.t -> Context_name.t -> Build_config.Gen_rules.t

0 commit comments

Comments
 (0)