From 58ef72bfa0947c6b7cb41462ad9f3bdc3cae2b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Bobot?= Date: Fri, 21 May 2021 21:18:56 +0200 Subject: [PATCH] [Sites] delay the computation of content of `generate_sites_module` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #4415 Signed-off-by: François Bobot --- otherlibs/site/test/run.t | 5 --- src/dune_rules/generate_sites_module_rules.ml | 45 ++++++++++--------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/otherlibs/site/test/run.t b/otherlibs/site/test/run.t index 5ec0274697c..ee05d42a748 100644 --- a/otherlibs/site/test/run.t +++ b/otherlibs/site/test/run.t @@ -155,11 +155,6 @@ Test with an opam like installation ] $ dune build -p a @install - File "d/dune", line 5, characters 45-46: - 5 | (generate_sites_module (module sites) (sites d)) - ^ - Error: dune_site used outside a package - [1] diff --git a/src/dune_rules/generate_sites_module_rules.ml b/src/dune_rules/generate_sites_module_rules.ml index 9ee96afc833..295edc4bd4c 100644 --- a/src/dune_rules/generate_sites_module_rules.ml +++ b/src/dune_rules/generate_sites_module_rules.ml @@ -57,30 +57,35 @@ let plugins_code sctx buf pkg sites = (String.capitalize site) plugins plugins site) let setup_rules sctx ~dir (def : Dune_file.Generate_sites_module.t) = - let buf = Buffer.create 1024 in - if def.sourceroot then sourceroot_code buf; - if def.relocatable then relocatable_code buf; - let sites = - List.sort_uniq - ~compare:(fun (_, pkga) (_, pkgb) -> Package.Name.compare pkga pkgb) - (def.sites @ List.map ~f:(fun (loc, (pkg, _)) -> (loc, pkg)) def.plugins) + let impl () = + let buf = Buffer.create 1024 in + if def.sourceroot then sourceroot_code buf; + if def.relocatable then relocatable_code buf; + let sites = + List.sort_uniq + ~compare:(fun (_, pkga) (_, pkgb) -> Package.Name.compare pkga pkgb) + (def.sites @ List.map ~f:(fun (loc, (pkg, _)) -> (loc, pkg)) def.plugins) + in + if List.is_non_empty sites then ( + pr buf "module Sites = struct"; + List.iter sites ~f:(sites_code sctx buf); + pr buf "end" + ); + let plugins = + Package.Name.Map.of_list_multi (List.map ~f:snd def.plugins) + in + if not (Package.Name.Map.is_empty plugins) then ( + pr buf "module Plugins = struct"; + Package.Name.Map.iteri plugins ~f:(plugins_code sctx buf); + pr buf "end" + ); + Buffer.contents buf in - if List.is_non_empty sites then ( - pr buf "module Sites = struct"; - List.iter sites ~f:(sites_code sctx buf); - pr buf "end" - ); - let plugins = Package.Name.Map.of_list_multi (List.map ~f:snd def.plugins) in - if not (Package.Name.Map.is_empty plugins) then ( - pr buf "module Plugins = struct"; - Package.Name.Map.iteri plugins ~f:(plugins_code sctx buf); - pr buf "end" - ); - let impl = Buffer.contents buf in let module_ = Module_name.to_string def.module_ ^ ".ml" in let file = Path.Build.relative dir module_ in let open Memo.Build.O in let+ () = - Super_context.add_rule sctx ~dir (Action_builder.write_file file impl) + Super_context.add_rule sctx ~dir + (Action_builder.write_file_dyn file (Action_builder.delayed impl)) in module_