···11+opam-version: "2.0"
22+maintainer: "opensource@janestreet.com"
33+authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]
44+homepage: "https://github.com/ocaml/dune"
55+bug-reports: "https://github.com/ocaml/dune/issues"
66+dev-repo: "git+https://github.com/ocaml/dune.git"
77+license: "MIT"
88+depends: [
99+ "ocaml" {>= "4.02"}
1010+ "base-unix"
1111+ "base-threads"
1212+]
1313+build: [
1414+ # opam 2 sets OPAM_SWITCH_PREFIX, so we don't need a hardcoded path
1515+ ["ocaml" "configure.ml" "--libdir" lib] {opam-version < "2"}
1616+ ["ocaml" "bootstrap.ml"]
1717+ ["./boot.exe" "--release" "--subst"] {pinned}
1818+ ["./boot.exe" "--release" "-j" jobs]
1919+]
2020+conflicts: [
2121+ "jbuilder" {!= "transition"}
2222+ "odoc" {< "1.3.0"}
2323+]
2424+2525+synopsis: "Fast, portable and opinionated build system"
2626+description: """
2727+dune is a build system that was designed to simplify the release of
2828+Jane Street packages. It reads metadata from "dune" files following a
2929+very simple s-expression syntax.
3030+3131+dune is fast, it has very low-overhead and support parallel builds on
3232+all platforms. It has no system dependencies, all you need to build
3333+dune and packages using dune is OCaml. You don't need or make or bash
3434+as long as the packages themselves don't use bash explicitly.
3535+3636+dune supports multi-package development by simply dropping multiple
3737+repositories into the same directory.
3838+3939+It also supports multi-context builds, such as building against
4040+several opam roots/switches simultaneously. This helps maintaining
4141+packages across several versions of OCaml and gives cross-compilation
4242+for free.
4343+"""
4444+url {
4545+ src: "https://github.com/ocaml/dune/releases/download/1.7.3/dune-1.7.3.tbz"
4646+ checksum: "md5=644f0c1419d70b9daccac4b4e5664523"
4747+}
+15
esy.lock/opam/jbuilder.transition/opam
···11+opam-version: "2.0"
22+maintainer: "opensource@janestreet.com"
33+authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]
44+homepage: "https://github.com/ocaml/dune"
55+bug-reports: "https://github.com/ocaml/dune/issues"
66+dev-repo: "git+https://github.com/ocaml/dune.git"
77+license: "MIT"
88+depends: ["ocaml" "dune"]
99+post-messages: [
1010+ "Jbuilder has been renamed and the jbuilder package is now a transition \
1111+ package. Use the dune package instead."
1212+]
1313+synopsis:
1414+ "This is a transition package, jbuilder is now named dune. Use the dune"
1515+description: "package instead."
···11+commit 40142bc941e6e308686e86be6fc2da92f346a22f
22+Author: Kate <kit.ty.kate@disroot.org>
33+Date: Tue Mar 19 16:29:06 2019 +0000
44+55+ Remove awk from the set of checked unix tools as it's not used anywhere
66+77+diff --git a/configure b/configure
88+index d9b587c..20e8dca 100755
99+--- a/configure
1010++++ b/configure
1111+@@ -184,7 +184,7 @@ echo "Configuring core..."
1212+1313+ # Some standard Unix tools must be available:
1414+1515+-for tool in sed awk ocaml ocamlc uname rm make cat m4 dirname basename; do
1616++for tool in sed ocaml ocamlc uname rm make cat m4 dirname basename; do
1717+ if in_path $tool; then true; else
1818+ echo "configure: $tool not in PATH; this is required" 1>&2
1919+ exit 1
···11+opam-version: "2.0"
22+maintainer: "opensource@janestreet.com"
33+authors: ["Jane Street Group, LLC <opensource@janestreet.com>"]
44+homepage: "https://github.com/janestreet/result"
55+dev-repo: "git+https://github.com/janestreet/result.git"
66+bug-reports: "https://github.com/janestreet/result/issues"
77+license: "BSD3"
88+build: [["jbuilder" "build" "-p" name "-j" jobs]]
99+depends: [
1010+ "ocaml"
1111+ "jbuilder" {build & >= "1.0+beta11"}
1212+]
1313+synopsis: "Compatibility Result module"
1414+description: """
1515+Projects that want to use the new result type defined in OCaml >= 4.03
1616+while staying compatible with older version of OCaml should use the
1717+Result module defined in this library."""
1818+url {
1919+ src:
2020+ "https://github.com/janestreet/result/releases/download/1.3/result-1.3.tbz"
2121+ checksum: "md5=4beebefd41f7f899b6eeba7414e7ae01"
2222+}
···11+--- ./Makefile
22++++ ./Makefile
33+@@ -213,7 +213,7 @@
44+ rm -f man/ocamlbuild.1
55+66+ man/options_man.byte: src/ocamlbuild_pack.cmo
77+- $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte
88++ $(OCAMLC) -I +unix unix.cma $^ -I src man/options_man.ml -o man/options_man.byte
99+1010+ clean::
1111+ rm -f man/options_man.cm*
1212+--- ./src/command.ml
1313++++ ./src/command.ml
1414+@@ -148,9 +148,10 @@
1515+ let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals in
1616+ let b = Buffer.create 256 in
1717+ (* The best way to prevent bash from switching to its windows-style
1818+- * quote-handling is to prepend an empty string before the command name. *)
1919++ * quote-handling is to prepend an empty string before the command name.
2020++ * space seems to work, too - and the ouput is nicer *)
2121+ if Sys.os_type = "Win32" then
2222+- Buffer.add_string b "''";
2323++ Buffer.add_char b ' ';
2424+ let first = ref true in
2525+ let put_space () =
2626+ if !first then
2727+@@ -260,7 +261,7 @@
2828+2929+ let execute_many ?(quiet=false) ?(pretend=false) cmds =
3030+ add_parallel_stat (List.length cmds);
3131+- let degraded = !*My_unix.is_degraded || Sys.os_type = "Win32" in
3232++ let degraded = !*My_unix.is_degraded in
3333+ let jobs = !jobs in
3434+ if jobs < 0 then invalid_arg "jobs < 0";
3535+ let max_jobs = if jobs = 0 then None else Some jobs in
3636+--- ./src/findlib.ml
3737++++ ./src/findlib.ml
3838+@@ -66,9 +66,6 @@
3939+ (fun command -> lexer & Lexing.from_string & run_and_read command)
4040+ command
4141+4242+-let run_and_read command =
4343+- Printf.ksprintf run_and_read command
4444+-
4545+ let rec query name =
4646+ try
4747+ Hashtbl.find packages name
4848+@@ -135,7 +132,8 @@
4949+ with Not_found -> s
5050+5151+ let list () =
5252+- List.map before_space (split_nl & run_and_read "%s list" ocamlfind)
5353++ let cmd = Shell.quote_filename_if_needed ocamlfind ^ " list" in
5454++ List.map before_space (split_nl & run_and_read cmd)
5555+5656+ (* The closure algorithm is easy because the dependencies are already closed
5757+ and sorted for each package. We only have to make the union. We could also
5858+--- ./src/main.ml
5959++++ ./src/main.ml
6060+@@ -162,6 +162,9 @@
6161+ Tags.mem "traverse" tags
6262+ || List.exists (Pathname.is_prefix path_name) !Options.include_dirs
6363+ || List.exists (Pathname.is_prefix path_name) target_dirs)
6464++ && ((* beware: !Options.build_dir is an absolute directory *)
6565++ Pathname.normalize !Options.build_dir
6666++ <> Pathname.normalize (Pathname.pwd/path_name))
6767+ end
6868+ end
6969+ end
7070+--- ./src/my_std.ml
7171++++ ./src/my_std.ml
7272+@@ -271,13 +271,107 @@
7373+ try Array.iter (fun x -> if x = basename then raise Exit) a; false
7474+ with Exit -> true
7575+7676++let command_plain = function
7777++| [| |] -> 0
7878++| margv ->
7979++ let rec waitpid a b =
8080++ match Unix.waitpid a b with
8181++ | exception (Unix.Unix_error(Unix.EINTR,_,_)) -> waitpid a b
8282++ | x -> x
8383++ in
8484++ let pid = Unix.(create_process margv.(0) margv stdin stdout stderr) in
8585++ let pid', process_status = waitpid [] pid in
8686++ assert (pid = pid');
8787++ match process_status with
8888++ | Unix.WEXITED n -> n
8989++ | Unix.WSIGNALED _ -> 2 (* like OCaml's uncaught exceptions *)
9090++ | Unix.WSTOPPED _ -> 127
9191++
9292++(* can't use Lexers because of circular dependency *)
9393++let split_path_win str =
9494++ let rec aux pos =
9595++ try
9696++ let i = String.index_from str pos ';' in
9797++ let len = i - pos in
9898++ if len = 0 then
9999++ aux (succ i)
100100++ else
101101++ String.sub str pos (i - pos) :: aux (succ i)
102102++ with Not_found | Invalid_argument _ ->
103103++ let len = String.length str - pos in
104104++ if len = 0 then [] else [String.sub str pos len]
105105++ in
106106++ aux 0
107107++
108108++let windows_shell = lazy begin
109109++ let rec iter = function
110110++ | [] -> [| "bash.exe" ; "--norc" ; "--noprofile" |]
111111++ | hd::tl ->
112112++ let dash = Filename.concat hd "dash.exe" in
113113++ if Sys.file_exists dash then [|dash|] else
114114++ let bash = Filename.concat hd "bash.exe" in
115115++ if Sys.file_exists bash = false then iter tl else
116116++ (* if sh.exe and bash.exe exist in the same dir, choose sh.exe *)
117117++ let sh = Filename.concat hd "sh.exe" in
118118++ if Sys.file_exists sh then [|sh|] else [|bash ; "--norc" ; "--noprofile"|]
119119++ in
120120++ split_path_win (try Sys.getenv "PATH" with Not_found -> "") |> iter
121121++end
122122++
123123++let prep_windows_cmd cmd =
124124++ (* workaround known ocaml bug, remove later *)
125125++ if String.contains cmd '\t' && String.contains cmd ' ' = false then
126126++ " " ^ cmd
127127++ else
128128++ cmd
129129++
130130++let run_with_shell = function
131131++| "" -> 0
132132++| cmd ->
133133++ let cmd = prep_windows_cmd cmd in
134134++ let shell = Lazy.force windows_shell in
135135++ let qlen = Filename.quote cmd |> String.length in
136136++ (* old versions of dash had problems with bs *)
137137++ try
138138++ if qlen < 7_900 then
139139++ command_plain (Array.append shell [| "-ec" ; cmd |])
140140++ else begin
141141++ (* it can still work, if the called command is a cygwin tool *)
142142++ let ch_closed = ref false in
143143++ let file_deleted = ref false in
144144++ let fln,ch =
145145++ Filename.open_temp_file
146146++ ~mode:[Open_binary]
147147++ "ocamlbuildtmp"
148148++ ".sh"
149149++ in
150150++ try
151151++ let f_slash = String.map ( fun x -> if x = '\\' then '/' else x ) fln in
152152++ output_string ch cmd;
153153++ ch_closed:= true;
154154++ close_out ch;
155155++ let ret = command_plain (Array.append shell [| "-e" ; f_slash |]) in
156156++ file_deleted:= true;
157157++ Sys.remove fln;
158158++ ret
159159++ with
160160++ | x ->
161161++ if !ch_closed = false then
162162++ close_out_noerr ch;
163163++ if !file_deleted = false then
164164++ (try Sys.remove fln with _ -> ());
165165++ raise x
166166++ end
167167++ with
168168++ | (Unix.Unix_error _) as x ->
169169++ (* Sys.command doesn't raise an exception, so run_with_shell also won't
170170++ raise *)
171171++ Printexc.to_string x ^ ":" ^ cmd |> prerr_endline;
172172++ 1
173173++
174174+ let sys_command =
175175+- match Sys.os_type with
176176+- | "Win32" -> fun cmd ->
177177+- if cmd = "" then 0 else
178178+- let cmd = "bash --norc -c " ^ Filename.quote cmd in
179179+- Sys.command cmd
180180+- | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd
181181++ if Sys.win32 then run_with_shell
182182++ else fun cmd -> if cmd = "" then 0 else Sys.command cmd
183183+184184+ (* FIXME warning fix and use Filename.concat *)
185185+ let filename_concat x y =
186186+--- ./src/my_std.mli
187187++++ ./src/my_std.mli
188188+@@ -69,3 +69,6 @@
189189+190190+ val split_ocaml_version : (int * int * int * string) option
191191+ (** (major, minor, patchlevel, rest) *)
192192++
193193++val windows_shell : string array Lazy.t
194194++val prep_windows_cmd : string -> string
195195+--- ./src/ocamlbuild_executor.ml
196196++++ ./src/ocamlbuild_executor.ml
197197+@@ -34,6 +34,8 @@
198198+ job_stdin : out_channel;
199199+ job_stderr : in_channel;
200200+ job_buffer : Buffer.t;
201201++ job_pid : int;
202202++ job_tmp_file: string option;
203203+ mutable job_dying : bool;
204204+ };;
205205+206206+@@ -76,6 +78,61 @@
207207+ in
208208+ loop 0
209209+ ;;
210210++
211211++let open_process_full_win cmd env =
212212++ let (in_read, in_write) = Unix.pipe () in
213213++ let (out_read, out_write) = Unix.pipe () in
214214++ let (err_read, err_write) = Unix.pipe () in
215215++ Unix.set_close_on_exec in_read;
216216++ Unix.set_close_on_exec out_write;
217217++ Unix.set_close_on_exec err_read;
218218++ let inchan = Unix.in_channel_of_descr in_read in
219219++ let outchan = Unix.out_channel_of_descr out_write in
220220++ let errchan = Unix.in_channel_of_descr err_read in
221221++ let shell = Lazy.force Ocamlbuild_pack.My_std.windows_shell in
222222++ let test_cmd =
223223++ String.concat " " (List.map Filename.quote (Array.to_list shell)) ^
224224++ "-ec " ^
225225++ Filename.quote (Ocamlbuild_pack.My_std.prep_windows_cmd cmd) in
226226++ let argv,tmp_file =
227227++ if String.length test_cmd < 7_900 then
228228++ Array.append
229229++ shell
230230++ [| "-ec" ; Ocamlbuild_pack.My_std.prep_windows_cmd cmd |],None
231231++ else
232232++ let fln,ch = Filename.open_temp_file ~mode:[Open_binary] "ocamlbuild" ".sh" in
233233++ output_string ch (Ocamlbuild_pack.My_std.prep_windows_cmd cmd);
234234++ close_out ch;
235235++ let fln' = String.map (function '\\' -> '/' | c -> c) fln in
236236++ Array.append
237237++ shell
238238++ [| "-c" ; fln' |], Some fln in
239239++ let pid =
240240++ Unix.create_process_env argv.(0) argv env out_read in_write err_write in
241241++ Unix.close out_read;
242242++ Unix.close in_write;
243243++ Unix.close err_write;
244244++ (pid, inchan, outchan, errchan,tmp_file)
245245++
246246++let close_process_full_win (pid,inchan, outchan, errchan, tmp_file) =
247247++ let delete tmp_file =
248248++ match tmp_file with
249249++ | None -> ()
250250++ | Some x -> try Sys.remove x with Sys_error _ -> () in
251251++ let tmp_file_deleted = ref false in
252252++ try
253253++ close_in inchan;
254254++ close_out outchan;
255255++ close_in errchan;
256256++ let res = snd(Unix.waitpid [] pid) in
257257++ tmp_file_deleted := true;
258258++ delete tmp_file;
259259++ res
260260++ with
261261++ | x when tmp_file <> None && !tmp_file_deleted = false ->
262262++ delete tmp_file;
263263++ raise x
264264++
265265+ (* ***)
266266+ (*** execute *)
267267+ (* XXX: Add test for non reentrancy *)
268268+@@ -130,10 +187,16 @@
269269+ (*** add_job *)
270270+ let add_job cmd rest result id =
271271+ (*display begin fun oc -> fp oc "Job %a is %s\n%!" print_job_id id cmd; end;*)
272272+- let (stdout', stdin', stderr') = open_process_full cmd env in
273273++ let (pid,stdout', stdin', stderr', tmp_file) =
274274++ if Sys.win32 then open_process_full_win cmd env else
275275++ let a,b,c = open_process_full cmd env in
276276++ -1,a,b,c,None
277277++ in
278278+ incr jobs_active;
279279+- set_nonblock (doi stdout');
280280+- set_nonblock (doi stderr');
281281++ if not Sys.win32 then (
282282++ set_nonblock (doi stdout');
283283++ set_nonblock (doi stderr');
284284++ );
285285+ let job =
286286+ { job_id = id;
287287+ job_command = cmd;
288288+@@ -143,7 +206,9 @@
289289+ job_stdin = stdin';
290290+ job_stderr = stderr';
291291+ job_buffer = Buffer.create 1024;
292292+- job_dying = false }
293293++ job_dying = false;
294294++ job_tmp_file = tmp_file;
295295++ job_pid = pid }
296296+ in
297297+ outputs := FDM.add (doi stdout') job (FDM.add (doi stderr') job !outputs);
298298+ jobs := JS.add job !jobs;
299299+@@ -199,6 +264,7 @@
300300+ try
301301+ read fd u 0 (Bytes.length u)
302302+ with
303303++ | Unix.Unix_error(Unix.EPIPE,_,_) when Sys.win32 -> 0
304304+ | Unix.Unix_error(e,_,_) ->
305305+ let msg = error_message e in
306306+ display (fun oc -> fp oc
307307+@@ -241,14 +307,19 @@
308308+ decr jobs_active;
309309+310310+ (* PR#5371: we would get EAGAIN below otherwise *)
311311+- clear_nonblock (doi job.job_stdout);
312312+- clear_nonblock (doi job.job_stderr);
313313+-
314314++ if not Sys.win32 then (
315315++ clear_nonblock (doi job.job_stdout);
316316++ clear_nonblock (doi job.job_stderr);
317317++ );
318318+ do_read ~loop:true (doi job.job_stdout) job;
319319+ do_read ~loop:true (doi job.job_stderr) job;
320320+ outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs);
321321+ jobs := JS.remove job !jobs;
322322+- let status = close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in
323323++ let status =
324324++ if Sys.win32 then
325325++ close_process_full_win (job.job_pid, job.job_stdout, job.job_stdin, job.job_stderr, job.job_tmp_file)
326326++ else
327327++ close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in
328328+329329+ let shown = ref false in
330330+331331+--- ./src/ocamlbuild_unix_plugin.ml
332332++++ ./src/ocamlbuild_unix_plugin.ml
333333+@@ -48,12 +48,22 @@
334334+ end
335335+336336+ let run_and_open s kont =
337337++ let s_orig = s in
338338++ let s =
339339++ (* Be consistent! My_unix.run_and_open uses My_std.sys_command and
340340++ sys_command uses bash. *)
341341++ if Sys.win32 = false then s else
342342++ let l = match Lazy.force My_std.windows_shell |> Array.to_list with
343343++ | hd::tl -> (Filename.quote hd)::tl
344344++ | _ -> assert false in
345345++ "\"" ^ (String.concat " " l) ^ " -ec " ^ Filename.quote (" " ^ s) ^ "\""
346346++ in
347347+ let ic = Unix.open_process_in s in
348348+ let close () =
349349+ match Unix.close_process_in ic with
350350+ | Unix.WEXITED 0 -> ()
351351+ | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ ->
352352+- failwith (Printf.sprintf "Error while running: %s" s) in
353353++ failwith (Printf.sprintf "Error while running: %s" s_orig) in
354354+ let res = try
355355+ kont ic
356356+ with e -> (close (); raise e)
357357+--- ./src/options.ml
358358++++ ./src/options.ml
359359+@@ -174,11 +174,24 @@
360360+ build_dir := Filename.concat (Sys.getcwd ()) s
361361+ else
362362+ build_dir := s
363363++
364364++let slashify =
365365++ if Sys.win32 then fun p -> String.map (function '\\' -> '/' | x -> x) p
366366++ else fun p ->p
367367++
368368++let sb () =
369369++ match Sys.os_type with
370370++ | "Win32" ->
371371++ (try set_binary_mode_out stdout true with _ -> ());
372372++ | _ -> ()
373373++
374374++
375375+ let spec = ref (
376376+ let print_version () =
377377++ sb ();
378378+ Printf.printf "ocamlbuild %s\n%!" Ocamlbuild_config.version; raise Exit_OK
379379+ in
380380+- let print_vnum () = print_endline Ocamlbuild_config.version; raise Exit_OK in
381381++ let print_vnum () = sb (); print_endline Ocamlbuild_config.version; raise Exit_OK in
382382+ Arg.align
383383+ [
384384+ "-version", Unit print_version , " Display the version";
385385+@@ -257,8 +270,8 @@
386386+ "-build-dir", String set_build_dir, "<path> Set build directory (implies no-links)";
387387+ "-install-lib-dir", Set_string Ocamlbuild_where.libdir, "<path> Set the install library directory";
388388+ "-install-bin-dir", Set_string Ocamlbuild_where.bindir, "<path> Set the install binary directory";
389389+- "-where", Unit (fun () -> print_endline !Ocamlbuild_where.libdir; raise Exit_OK), " Display the install library directory";
390390+- "-which", String (fun cmd -> print_endline (find_tool cmd); raise Exit_OK), "<command> Display path to the tool command";
391391++ "-where", Unit (fun () -> sb (); print_endline (slashify !Ocamlbuild_where.libdir); raise Exit_OK), " Display the install library directory";
392392++ "-which", String (fun cmd -> sb (); print_endline (slashify (find_tool cmd)); raise Exit_OK), "<command> Display path to the tool command";
393393+ "-ocamlc", set_cmd ocamlc, "<command> Set the OCaml bytecode compiler";
394394+ "-plugin-ocamlc", set_cmd plugin_ocamlc, "<command> Set the OCaml bytecode compiler \
395395+ used when building myocamlbuild.ml (only)";
396396+--- ./src/pathname.ml
397397++++ ./src/pathname.ml
398398+@@ -84,6 +84,26 @@
399399+ | x :: xs -> x :: normalize_list xs
400400+401401+ let normalize x =
402402++ let x =
403403++ if Sys.win32 = false then
404404++ x
405405++ else
406406++ let len = String.length x in
407407++ let b = Bytes.create len in
408408++ for i = 0 to pred len do
409409++ match x.[i] with
410410++ | '\\' -> Bytes.set b i '/'
411411++ | c -> Bytes.set b i c
412412++ done;
413413++ if len > 1 then (
414414++ let c1 = Bytes.get b 0 in
415415++ let c2 = Bytes.get b 1 in
416416++ if c2 = ':' && c1 >= 'a' && c1 <= 'z' &&
417417++ ( len = 2 || Bytes.get b 2 = '/') then
418418++ Bytes.set b 0 (Char.uppercase_ascii c1)
419419++ );
420420++ Bytes.unsafe_to_string b
421421++ in
422422+ if Glob.eval not_normal_form_re x then
423423+ let root, paths = split x in
424424+ join root (normalize_list paths)
425425+--- ./src/shell.ml
426426++++ ./src/shell.ml
427427+@@ -24,12 +24,26 @@
428428+ | 'a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '/' | '_' | ':' | '@' | '+' | ',' -> loop (pos + 1)
429429+ | _ -> false in
430430+ loop 0
431431++
432432++let generic_quote quotequote s =
433433++ let l = String.length s in
434434++ let b = Buffer.create (l + 20) in
435435++ Buffer.add_char b '\'';
436436++ for i = 0 to l - 1 do
437437++ if s.[i] = '\''
438438++ then Buffer.add_string b quotequote
439439++ else Buffer.add_char b s.[i]
440440++ done;
441441++ Buffer.add_char b '\'';
442442++ Buffer.contents b
443443++let unix_quote = generic_quote "'\\''"
444444++
445445+ let quote_filename_if_needed s =
446446+ if is_simple_filename s then s
447447+ (* We should probably be using [Filename.unix_quote] except that function
448448+ * isn't exported. Users on Windows will have to live with not being able to
449449+ * install OCaml into c:\o'caml. Too bad. *)
450450+- else if Sys.os_type = "Win32" then Printf.sprintf "'%s'" s
451451++ else if Sys.os_type = "Win32" then unix_quote s
452452+ else Filename.quote s
453453+ let chdir dir =
454454+ reset_filesys_cache ();
455455+@@ -37,7 +51,7 @@
456456+ let run args target =
457457+ reset_readdir_cache ();
458458+ let cmd = String.concat " " (List.map quote_filename_if_needed args) in
459459+- if !*My_unix.is_degraded || Sys.os_type = "Win32" then
460460++ if !*My_unix.is_degraded then
461461+ begin
462462+ Log.event cmd target Tags.empty;
463463+ let st = sys_command cmd in