X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fcmdline.ml;h=927dfdf63328f52f02e2b38280dd8f6164e043a8;hb=5a456c968ee7e7bbe477ae4e756967c4aa2e3fc1;hp=fdf7ce6341fc3e9b7d03176f51a14d8097b656a5;hpb=aadcfa31f19559b2a8a355736e3dfc4795e0a2d9;p=goals.git diff --git a/src/cmdline.ml b/src/cmdline.ml index fdf7ce6..927dfdf 100644 --- a/src/cmdline.ml +++ b/src/cmdline.ml @@ -41,25 +41,28 @@ let print_version () = (* Get stdlib directory. *) let datadir = - try Sys.getenv "GOALS_DATADIR" with Not_found -> Config.datadir + try Sys.getenv "GOALS_DATADIR" + with Not_found -> Config.datadir // "goals" let stdlibdir = datadir // "stdlib" let prelude_gl_file = stdlibdir // "prelude.gl" let prelude_sh_file = stdlibdir // "prelude.sh" -let () = + +let debug_flag = ref false +let directory = ref "." +let input_file = ref "Goalfile" +let includes = ref [stdlibdir] +let add_include dir = includes := dir :: !includes +let nr_jobs = ref (nprocs ()) +let silent = ref false +let use_prelude = ref true + +let parse () = if not (is_directory stdlibdir) || not (Sys.file_exists prelude_gl_file) then failwithf "%s: cannot find the standard library directory, expected %s. If the standard library directory is in a non-standard location then set GOALS_DATADIR. If you can trying to run goals from the build directory then use ‘./run goals ...’" - Sys.executable_name stdlibdir - -let input_file, - debug_flag, directory, includes, use_prelude, anon_vars, targets = - let args = ref [] in - let debug_flag = ref false in - let directory = ref "." in - let input_file = ref "Goalfile" in - let includes = ref [stdlibdir] in - let add_include dir = includes := dir :: !includes in - let use_prelude = ref true in + Sys.executable_name stdlibdir; + let jobshelp = + sprintf "jobs Set number of parallel jobs (default: %d)" !nr_jobs in let argspec = [ "-C", Arg.Set_string directory, "directory Change to directory before running"; @@ -75,24 +78,33 @@ let input_file, "dir Add include directory"; "--include", Arg.String add_include, "dir Add include directory"; + "-j", Arg.Set_int nr_jobs, + jobshelp; + "--jobs", Arg.Set_int nr_jobs, + jobshelp; "--no-prelude",Arg.Clear use_prelude, " Do not automatically use prelude.gl from stdlib"; + "-s", Arg.Set silent, + " Silent operation"; + "--silent", Arg.Set silent, + " Silent operation"; + "--quiet", Arg.Set silent, + " Silent operation"; "-v", Arg.Unit print_version, " Print version and exit"; "--version", Arg.Unit print_version, " Print version and exit"; ] in let argspec = Arg.align argspec in + let args = ref [] in let anon_fun s = args := s :: !args in Arg.parse argspec anon_fun usage; + (* Check various params are sensible. *) + if !nr_jobs < 1 then + failwithf "%s: -j must be >= 1" Sys.executable_name; + let args = List.rev !args in - let debug_flag = !debug_flag in - let directory = !directory in - let input_file = !input_file in - (* Don't reverse includes - we want newer -I options to take precedence. *) - let includes = !includes in - let use_prelude = !use_prelude in (* Get the anon var assignments and targets. *) let anon_vars, targets = @@ -108,10 +120,21 @@ let input_file, (name, expr) ) anon_vars in - input_file, - debug_flag, directory, includes, use_prelude, anon_vars, targets + anon_vars, targets + +let debug_flag () = !debug_flag (* Create the debug function. *) let debug fs = - let display str = if debug_flag then prerr_endline str in + let display str = if debug_flag () then prerr_endline str in ksprintf display fs + +let directory () = !directory +let input_file () = !input_file + +(* Don't reverse includes - we want newer -I options to take precedence. *) +let includes () = !includes + +let nr_jobs () = !nr_jobs +let silent () = !silent +let use_prelude () = !use_prelude