From dff61dc90d8895e419af49f5448e3fc0009cd032 Mon Sep 17 00:00:00 2001 From: Etienne Marais Date: Fri, 17 Jan 2025 10:09:53 +0000 Subject: [PATCH] fix: package management working with ocaml.5.3.0 (#11310) * fix: allow ocaml.5.3.0 to be built with package management Signed-off-by: Etienne Marais * fix: apply reviews Signed-off-by: Etienne Marais --------- Signed-off-by: Etienne Marais --- src/dune_rules/pkg_rules.ml | 21 +++++++++++++++------ src/dune_rules/pkg_toolchain.ml | 21 ++++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/dune_rules/pkg_rules.ml b/src/dune_rules/pkg_rules.ml index 0eeaff10adf..731c845773b 100644 --- a/src/dune_rules/pkg_rules.ml +++ b/src/dune_rules/pkg_rules.ml @@ -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 diff --git a/src/dune_rules/pkg_toolchain.ml b/src/dune_rules/pkg_toolchain.ml index dd57606ea07..7f729182dc2 100644 --- a/src/dune_rules/pkg_toolchain.ml +++ b/src/dune_rules/pkg_toolchain.ml @@ -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 @@ -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 ;;