@@ -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