Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.17] backport #11310: fix: package management working with ocaml.5.3.0 #11365

Merged
merged 1 commit into from
Jan 20, 2025
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
21 changes: 15 additions & 6 deletions src/dune_rules/pkg_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -2082,14 +2082,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 @@ -152,25 +156,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
Loading