summaryrefslogtreecommitdiff
path: root/ocamlbuild/command.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamlbuild/command.ml')
-rw-r--r--ocamlbuild/command.ml32
1 files changed, 25 insertions, 7 deletions
diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml
index 131cd8586c..1ce80c9743 100644
--- a/ocamlbuild/command.ml
+++ b/ocamlbuild/command.ml
@@ -91,9 +91,15 @@ let atomize_paths l = S(List.map (fun x -> P x) l)
let env_path = lazy begin
let path_var = Sys.getenv "PATH" in
+ let parse_path =
+ if Sys.os_type = "Win32" then
+ Lexers.parse_environment_path_w
+ else
+ Lexers.parse_environment_path
+ in
let paths =
try
- Lexers.parse_environment_path (Lexing.from_string path_var)
+ parse_path (Lexing.from_string path_var)
with Lexers.Error msg -> raise (Lexers.Error ("$PATH: " ^ msg))
in
let norm_current_dir_name path =
@@ -119,21 +125,33 @@ let virtual_solver virtual_command =
failwith (Printf.sprintf "the solver for the virtual command %S \
has failed finding a valid command" virtual_command)
+(* On Windows, we need to also check for the ".exe" version of the file. *)
+let file_or_exe_exists file =
+ sys_file_exists file || Sys.os_type = "Win32" && sys_file_exists (file ^ ".exe")
-(* FIXME windows *)
let search_in_path cmd =
+ (* Try to find [cmd] in path [path]. *)
+ let try_path path =
+ (* Don't know why we're trying to be subtle here... *)
+ if path = Filename.current_dir_name then file_or_exe_exists cmd
+ else file_or_exe_exists (filename_concat path cmd)
+ in
if Filename.is_implicit cmd then
- let path = List.find begin fun path ->
- if path = Filename.current_dir_name then sys_file_exists cmd
- else sys_file_exists (filename_concat path cmd)
- end !*env_path in
+ let path = List.find try_path !*env_path in
+ (* We're not trying to append ".exe" here because all windows shells are
+ * capable of understanding the command without the ".exe" suffix. *)
filename_concat path cmd
- else cmd
+ else
+ cmd
(*** string_of_command_spec{,_with_calls *)
let rec string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals spec =
let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals in
let b = Buffer.create 256 in
+ (* The best way to prevent bash from switching to its windows-style
+ * quote-handling is to prepend an empty string before the command name. *)
+ if Sys.os_type = "Win32" then
+ Buffer.add_string b "''";
let first = ref true in
let put_space () =
if !first then