aboutsummaryrefslogtreecommitdiff
path: root/configure.ml
diff options
context:
space:
mode:
authorGaëtan Gilbert2020-08-18 15:39:57 +0200
committerGaëtan Gilbert2020-08-18 15:43:16 +0200
commitcd7b346ec5485138d93bc6a0308b9b8176d6e71f (patch)
tree65efd6a6927ace65318ae706b1242bf03a9933e1 /configure.ml
parentaa926429727f1f6b5ef07c8912f2618d53f6d155 (diff)
Avoid running configure when plugins/ modified
We use an indirection, producing the sorted list of subdirectories of plugins/, so that dune can recognize it hasn't changed and doesn't rerun configure. Since configure regenerates a timestamp this avoids recompiling the stdlib. Fix #12750.
Diffstat (limited to 'configure.ml')
-rw-r--r--configure.ml23
1 files changed, 15 insertions, 8 deletions
diff --git a/configure.ml b/configure.ml
index c05844198b..6863d412cc 100644
--- a/configure.ml
+++ b/configure.ml
@@ -64,8 +64,7 @@ let rec waitpid_non_intr pid =
(** Below, we'd better read all lines on a channel before closing it,
otherwise a SIGPIPE could be encountered by the sub-process *)
-let read_lines_and_close fd =
- let cin = Unix.in_channel_of_descr fd in
+let read_lines_and_close cin =
let lines = ref [] in
begin
try
@@ -78,6 +77,9 @@ let read_lines_and_close fd =
let lines = List.rev !lines in
try List.hd lines, lines with Failure _ -> "", []
+let read_lines_and_close_fd fd =
+ read_lines_and_close (Unix.in_channel_of_descr fd)
+
(** Run some unix command and read the first line of its output.
We avoid Unix.open_process and its non-fully-portable /bin/sh,
especially when it comes to quoting the filenames.
@@ -109,8 +111,8 @@ let run ?(fatal=true) ?(err=StdErr) prog args =
let pid = Unix.create_process prog argv Unix.stdin out_w fd_err in
let () = Unix.close out_w in
let () = Unix.close nul_w in
- let line, all = read_lines_and_close out_r in
- let _ = read_lines_and_close nul_r in
+ let line, all = read_lines_and_close_fd out_r in
+ let _ = read_lines_and_close_fd nul_r in
let () = check_exit_code (waitpid_non_intr pid) in
line, all
with
@@ -1108,11 +1110,16 @@ let write_configml f =
pr "\nlet core_src_dirs = [\n%s]\n" core_src_dirs;
pr "\nlet plugins_dirs = [\n";
- let plugins =
- try Sys.readdir "plugins"
- with _ -> [||]
+ let plugins = match open_in "config/plugin_list" with
+ | exception Sys_error _ ->
+ let plugins =
+ try Sys.readdir "plugins"
+ with _ -> [||]
+ in
+ Array.sort compare plugins;
+ plugins
+ | ch -> Array.of_list (snd (read_lines_and_close ch))
in
- Array.sort compare plugins;
Array.iter
(fun f ->
let f' = "plugins/"^f in