Skip to content

Commit a096108

Browse files
Track whether the package had a dune dependency
We don't register the dependency because we will not build it but we add it to the type to know whether the package depended on Dune. Signed-off-by: Marek Kubica <[email protected]>
1 parent 5e7d9f6 commit a096108

File tree

1 file changed

+34
-29
lines changed

1 file changed

+34
-29
lines changed

src/dune_rules/pkg_rules.ml

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ module Pkg = struct
439439
; build_command : Build_command.t option
440440
; install_command : Dune_lang.Action.t option
441441
; depends : t list
442+
; depends_on_dune : bool
443+
(* whether the package declares a dependency on Dune, even if Dune is stripped from [depends] *)
442444
; depexts : Depexts.t list
443445
; info : Pkg_info.t
444446
; paths : Path.t Paths.t
@@ -1143,33 +1145,15 @@ module Action_expander = struct
11431145

11441146
let sandbox = Sandbox_mode.Set.singleton Sandbox_mode.copy
11451147

1146-
let rec action_contains_run action =
1147-
match (action : Dune_lang.Action.t) with
1148-
| Run _ -> true
1149-
| Progn actions -> actions |> List.find ~f:action_contains_run |> Option.is_some
1150-
| When (_, action) -> action_contains_run action
1151-
| Withenv (_, action) -> action_contains_run action
1152-
| _ -> false
1153-
;;
1154-
11551148
let expand context (pkg : Pkg.t) action =
1156-
let depend_on_dune =
1157-
match action_contains_run action with
1158-
| false -> Action_builder.return ()
1159-
| true ->
1160-
Path.External.of_string Sys.executable_name
1161-
|> Path.external_
1162-
|> Action_builder.path
1163-
in
11641149
let+ action =
11651150
let expander = expander context pkg in
11661151
expand action ~expander >>| Action.chdir pkg.paths.source_dir
11671152
in
11681153
(* TODO copying is needed for build systems that aren't dune and those
11691154
with an explicit install step *)
1170-
let open Action_builder.O in
1171-
depend_on_dune
1172-
>>> (Action.Full.make ~sandbox action |> Action_builder.return)
1155+
Action.Full.make ~sandbox action
1156+
|> Action_builder.return
11731157
|> Action_builder.with_no_targets
11741158
;;
11751159

@@ -1220,6 +1204,7 @@ module DB = struct
12201204
type entry =
12211205
{ pkg : Pkg.t
12221206
; deps : dep list
1207+
; has_dune_dep : bool
12231208
; pkg_digest : Pkg_digest.t
12241209
}
12251210

@@ -1249,24 +1234,30 @@ module DB = struct
12491234
Package.Name.Table.find_or_add cache pkg.info.name ~f:(fun name ->
12501235
let seen_set = Package.Name.Set.add seen_set name in
12511236
let seen_list = pkg :: seen_list in
1252-
let deps =
1237+
let system_deps, deps =
12531238
Dune_pkg.Lock_dir.Conditional_choice.choose_for_platform pkg.depends ~platform
12541239
|> Option.value ~default:[]
1255-
|> List.filter_map
1240+
|> List.partition_map
12561241
~f:(fun { Dune_pkg.Lock_dir.Dependency.name; loc = dep_loc } ->
12571242
if Package.Name.Set.mem system_provided name
1258-
then None
1243+
then Left name
12591244
else (
12601245
let dep_pkg = Package.Name.Map.find_exn pkgs_by_name name in
12611246
let dep_entry = compute_entry dep_pkg ~seen_set ~seen_list in
1262-
Some { dep_pkg; dep_loc; dep_pkg_digest = dep_entry.pkg_digest }))
1247+
Right { dep_pkg; dep_loc; dep_pkg_digest = dep_entry.pkg_digest }))
1248+
in
1249+
let has_dune_dep =
1250+
List.mem
1251+
~equal:Dune_lang.Package_name.equal
1252+
system_deps
1253+
Dune_pkg.Dune_dep.name
12631254
in
12641255
let pkg_digest =
12651256
Pkg_digest.create
12661257
pkg
12671258
(List.map deps ~f:(fun { dep_pkg_digest; _ } -> dep_pkg_digest))
12681259
in
1269-
{ pkg; deps; pkg_digest })
1260+
{ pkg; deps; has_dune_dep; pkg_digest })
12701261
in
12711262
Package.Name.Map.map
12721263
pkgs_by_name
@@ -1289,8 +1280,8 @@ module DB = struct
12891280
dependencies are identical as a sanity check. *)
12901281
let union_check
12911282
pkg_digest
1292-
({ pkg = pkg_a; deps = deps_a; pkg_digest = _ } as entry)
1293-
{ pkg = pkg_b; deps = deps_b; pkg_digest = _ }
1283+
({ pkg = pkg_a; deps = deps_a; has_dune_dep = _; pkg_digest = _ } as entry)
1284+
{ pkg = pkg_b; deps = deps_b; has_dune_dep = _; pkg_digest = _ }
12941285
=
12951286
if not (Pkg.equal (Pkg.remove_locs pkg_a) (Pkg.remove_locs pkg_b))
12961287
then
@@ -1493,6 +1484,7 @@ end = struct
14931484
; enabled_on_platforms = _
14941485
} as pkg
14951486
; deps
1487+
; has_dune_dep
14961488
; pkg_digest = _
14971489
} ->
14981490
assert (Package.Name.equal pkg_digest.name info.name);
@@ -1607,6 +1599,7 @@ end = struct
16071599
; build_command
16081600
; install_command
16091601
; depends
1602+
; depends_on_dune = has_dune_dep
16101603
; depexts
16111604
; paths
16121605
; write_paths
@@ -2252,9 +2245,21 @@ let build_rule context_name ~source_deps (pkg : Pkg.t) =
22522245
|> Action_builder.progn
22532246
in
22542247
let deps = Dep.Set.union source_deps (Pkg.package_deps pkg) in
2248+
let depend_on_dune =
2249+
match pkg.depends_on_dune with
2250+
| false -> Action_builder.return ()
2251+
| true ->
2252+
Sys.executable_name
2253+
|> Path.External.of_string
2254+
|> Path.external_
2255+
|> Action_builder.path
2256+
in
2257+
let open Action_builder.O in
2258+
let action_builder =
2259+
Action_builder.deps deps >>> depend_on_dune |> Action_builder.with_no_targets
2260+
in
22552261
let open Action_builder.With_targets.O in
2256-
Action_builder.deps deps
2257-
|> Action_builder.with_no_targets
2262+
action_builder
22582263
(* TODO should we add env deps on these? *)
22592264
>>> add_env (Pkg.exported_env pkg) build_action
22602265
|> Action_builder.With_targets.add_directories

0 commit comments

Comments
 (0)