Skip to content

Commit

Permalink
fix: package management working with ocaml.5.3.0 (#11310)
Browse files Browse the repository at this point in the history
* fix: allow ocaml.5.3.0 to be built with package management

Signed-off-by: Etienne Marais <[email protected]>

* fix: apply reviews

Signed-off-by: Etienne Marais <[email protected]>

---------

Signed-off-by: Etienne Marais <[email protected]>
  • Loading branch information
maiste authored Jan 17, 2025
1 parent 15f15dc commit 346f93a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 13 deletions.
21 changes: 15 additions & 6 deletions src/dune_rules/pkg_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1931,14 +1931,23 @@ let ocaml_toolchain context =
| `System_provided -> None
| `Inside_lock_dir pkg ->
let toolchain =
let cookie = (Pkg_installed.of_paths pkg.paths).cookie in
let open Action_builder.O in
let* cookie = cookie in
(* TODO we should use the closure of [pkg] *)
let binaries =
Section.Map.find cookie.files Bin |> Option.value ~default:[] |> Path.Set.of_list
let transitive_deps = pkg :: Pkg.deps_closure pkg in
let* env, binaries =
Action_builder.List.fold_left
~init:(Global.env (), Path.Set.empty)
~f:(fun (env, binaries) pkg ->
let env = Env.extend_env env (Pkg.exported_env pkg) in
let+ cookie = (Pkg_installed.of_paths pkg.paths).cookie in
let binaries =
Section.Map.find cookie.files Bin
|> Option.value ~default:[]
|> Path.Set.of_list
|> Path.Set.union binaries
in
env, binaries)
transitive_deps
in
let env = Env.extend_env (Global.env ()) (Pkg.exported_env pkg) in
let path = Env_path.path (Global.env ()) in
Action_builder.of_memo @@ Ocaml_toolchain.of_binaries ~path context env binaries
in
Expand Down
21 changes: 14 additions & 7 deletions src/dune_rules/pkg_toolchain.ml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ let is_compiler_and_toolchains_enabled name =
(* TODO don't hardcode these names here *)
[ Package_name.of_string "ocaml-base-compiler"
; Package_name.of_string "ocaml-variants"
; Package_name.of_string "ocaml-compiler"
(* The [ocaml-compiler] package is required to include all the
packages that might install a compiler, starting from ocaml.5.3.0.
*)
]
in
List.mem compiler_package_names name ~equal:Package_name.equal
Expand Down Expand Up @@ -161,25 +165,28 @@ let modify_install_action ~prefix ~suffix action =
else modify_install_action action ~installation_prefix:prefix ~suffix
;;

(* Create an empty config.cache file so other packages see that the
compiler package is installed. *)
let touch_config_cache =
let touch file =
Dune_lang.Action.Run
[ Slang.text "touch"
; Slang.concat
[ Slang.pform (Pform.Var (Pform.Var.Pkg Pform.Var.Pkg.Build))
; Slang.text "/config.cache"
]
[ Slang.pform (Pform.Var (Pform.Var.Pkg Pform.Var.Pkg.Build)); Slang.text file ]
]
;;

(* Create an empty config.cache and config.status files so other packages see
that the compiler package is installed.
TODO: extract this from the .install *)
let touch_compiler_install =
Dune_lang.Action.Progn [ touch "/config.cache"; touch "/config.status" ]
;;

let modify_build_action ~prefix action =
let+ installed = Fs_memo.dir_exists prefix in
if installed
then
(* If the toolchain is already installed, just create config.cache file.
TODO(steve): Move this check to action execution time *)
touch_config_cache
touch_compiler_install
else action
;;

Expand Down

0 comments on commit 346f93a

Please sign in to comment.