X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fmain.ml;h=33d91b6e6c7a048c823fd1dae38921314ef2b0f7;hb=24cc20b33e3d81ed7d754391bef929276c1f4f42;hp=2111eaf5271ad08315e3f3428540b422a0a9c2c4;hpb=94430834302e922af6c27a1c88e13f862a57dd0f;p=goals.git diff --git a/src/main.ml b/src/main.ml index 2111eaf..33d91b6 100644 --- a/src/main.ml +++ b/src/main.ml @@ -37,25 +37,34 @@ Options:" let main () = (* Command line arguments. *) + let args = ref [] in + let directory = ref "." in let filename = ref "Goalfile" in let argspec = [ - "-f", Arg.Set_string filename, - "filename Set name of Goalfile"; - "--file", Arg.Set_string filename, - "filename Set name of Goalfile"; + "-C", Arg.Set_string directory, + "directory Change to directory before running"; + "--directory", Arg.Set_string directory, + "directory Change to directory before running"; + "-f", Arg.Set_string filename, + "filename Set name of Goalfile"; + "--file", Arg.Set_string filename, + "filename Set name of Goalfile"; ] 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; - (*let args = List.rev !args in*) + let args = List.rev !args in + let directory = !directory in let filename = !filename in (* Parse the input file. *) let env = Parse.parse_goalfile filename in + (* Now we've read the input, change directory. *) + Sys.chdir directory; + (* Parse the command line anon args. Each parameter has the * form "name=" to assign a value to a variable, or * "" to indicate a target to build. @@ -68,24 +77,27 @@ let main () = (* assignment *) let name = Str.matched_group 1 arg in let expr = Parse.parse_cli_expr (Str.matched_group 2 arg) in - env := Ast.StringMap.add name expr !env + env := Ast.Env.add name expr !env ) else ( (* target *) let expr = Parse.parse_cli_expr arg in targets := expr :: !targets ) - ) !args; + ) args; let targets = List.rev !targets and env = !env in (* If no target was set on the command line, use "all ()". *) let targets = if targets <> [] then targets - else [Ast.ECall ("all", [])] in + else [Ast.ECall (Ast.noloc, "all", [])] in - (*Ast.print_env stdout env;*) + Ast.print_env stderr env; (* Evaluate the target expressions in turn. *) - Eval.evaluate env targets + Eval.evaluate_targets env targets -let () = main () +let () = + try main () + with + Failure msg -> prerr_endline msg; exit 1