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_