X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fmain.ml;h=33d91b6e6c7a048c823fd1dae38921314ef2b0f7;hb=24cc20b33e3d81ed7d754391bef929276c1f4f42;hp=30ba31fb7a22dda249f3b2040b719701544bef43;hpb=5a6a8b2b8e515941f9a2b3cc051da646ae696251;p=goals.git diff --git a/src/main.ml b/src/main.ml index 30ba31f..33d91b6 100644 --- a/src/main.ml +++ b/src/main.ml @@ -19,11 +19,17 @@ open Printf +open Utils + +(* See also "let id" in [lexer.mll]. *) +let var_regexp = + Str.regexp "\\([a-zA-Z_][a-zA-Z0-9_]*\\)[ \t]*=[ \t]*\\(.*\\)" + let usage = "\ goals: Build software. - goals [-f Goalfile] ['var = value' ...] [target ...] + goals [-f Goalfile] ['var=value' ...] ['target' ...] For detailed help see goals(1). @@ -31,25 +37,67 @@ 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 file = Parse.parse_from_file filename in + 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. + *) + let targets = ref [] in + let env = ref env in + List.iter ( + fun arg -> + if Str.string_match var_regexp arg 0 then ( + (* assignment *) + let name = Str.matched_group 1 arg in + let expr = Parse.parse_cli_expr (Str.matched_group 2 arg) in + env := Ast.Env.add name expr !env + ) + else ( + (* target *) + let expr = Parse.parse_cli_expr arg in + targets := expr :: !targets + ) + ) 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 (Ast.noloc, "all", [])] in + + Ast.print_env stderr env; - Ast.print_file stdout file + (* Evaluate the target expressions in turn. *) + Eval.evaluate_targets env targets -let () = main () +let () = + try main () + with + Failure msg -> prerr_endline msg; exit 1