@@ -752,6 +752,48 @@ let install_entries sctx (package : Package.t) =
752752 let + packages = Stanzas_to_entries. stanzas_to_entries sctx in
753753 Package.Name.Map.Multi. find packages (Package. name package)
754754
755+ let packages =
756+ let f sctx =
757+ let packages = Package.Name.Map. values (Super_context. packages sctx) in
758+ let + l =
759+ Memo.Build. parallel_map packages ~f: (fun (pkg : Package.t ) ->
760+ install_entries sctx pkg
761+ >> | List. map ~f: (fun (_loc , (entry : _ Install.Entry.t )) ->
762+ (entry.src, pkg.id)))
763+ in
764+ Path.Build.Map. of_list_fold (List. concat l) ~init: Package.Id.Set. empty
765+ ~f: Package.Id.Set. add
766+ in
767+ let memo =
768+ Memo. create " package-map" ~doc: " Return a map assining package to files"
769+ ~input: (module Super_context. As_memo_key )
770+ ~visibility: Hidden
771+ ~output:
772+ (Allow_cutoff
773+ (module struct
774+ type t = Package.Id.Set .t Path.Build.Map .t
775+
776+ let to_dyn = Path.Build.Map. to_dyn Package.Id.Set. to_dyn
777+
778+ let equal = Path.Build.Map. equal ~equal: Package.Id.Set. equal
779+ end ))
780+ f
781+ in
782+ fun sctx -> Memo. exec memo sctx
783+
784+ let packages_file_is_part_of path =
785+ Memo.Build.Option. bind
786+ (let open Option.O in
787+ let * ctx_name, _ = Path.Build. extract_build_context path in
788+ Context_name. of_string_opt ctx_name)
789+ ~f: Super_context. find
790+ >> = function
791+ | None -> Memo.Build. return Package.Id.Set. empty
792+ | Some sctx ->
793+ let open Memo.Build.O in
794+ let + map = packages sctx in
795+ Option. value (Path.Build.Map. find map path) ~default: Package.Id.Set. empty
796+
755797let install_rules sctx (package : Package.t ) =
756798 let package_name = Package. name package in
757799 let install_paths =
@@ -772,7 +814,9 @@ let install_rules sctx (package : Package.t) =
772814 let packages =
773815 let open Action_builder.O in
774816 let + packages =
775- Action_builder. memo_build (Build_system. package_deps package files)
817+ Action_builder. memo_build
818+ (Build_system. package_deps package files
819+ ~packages_of: packages_file_is_part_of)
776820 in
777821 match strict_package_deps with
778822 | false -> packages
@@ -932,32 +976,3 @@ let gen_rules sctx ~dir =
932976 Rules. produce_dir ~dir (Option. value ~default: Rules.Dir_rules. empty rules)
933977 in
934978 Build_system.Subdir_set. These subdirs
935-
936- let packages =
937- let f sctx =
938- let packages = Package.Name.Map. values (Super_context. packages sctx) in
939- let + l =
940- Memo.Build. parallel_map packages ~f: (fun (pkg : Package.t ) ->
941- install_entries sctx pkg
942- >> | List. map ~f: (fun (_loc , (entry : _ Install.Entry.t )) ->
943- (entry.src, pkg.id)))
944- in
945- Path.Build.Map. of_list_fold (List. concat l) ~init: Package.Id.Set. empty
946- ~f: Package.Id.Set. add
947- in
948- let memo =
949- Memo. create " package-map" ~doc: " Return a map assining package to files"
950- ~input: (module Super_context. As_memo_key )
951- ~visibility: Hidden
952- ~output:
953- (Allow_cutoff
954- (module struct
955- type t = Package.Id.Set .t Path.Build.Map .t
956-
957- let to_dyn = Path.Build.Map. to_dyn Package.Id.Set. to_dyn
958-
959- let equal = Path.Build.Map. equal ~equal: Package.Id.Set. equal
960- end ))
961- f
962- in
963- fun sctx -> Memo. exec memo sctx
0 commit comments