Expose parsing of expressions from command line.
[goals.git] / src / main.ml
1 (* Goalfile parser
2  * Copyright (C) 2019 Richard W.M. Jones
3  * Copyright (C) 2019 Red Hat Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  *)
19
20 open Printf
21
22 open Utils
23
24 let usage =
25   "\
26 goals: Build software.
27
28  goals [-f Goalfile] ['var = value' ...] ['target' ...]
29
30 For detailed help see goals(1).
31
32 Options:"
33
34 let main () =
35   (* Command line arguments. *)
36   let filename = ref "Goalfile" in
37
38   let argspec = [
39     "-f",        Arg.Set_string filename,
40                  "filename Set name of Goalfile";
41     "--file",    Arg.Set_string filename,
42                  "filename Set name of Goalfile";
43   ] in
44   let argspec = Arg.align argspec in
45   let args = ref [] in
46   let anon_fun s = args := s :: !args in
47   Arg.parse argspec anon_fun usage;
48
49   (*let args = List.rev !args in*)
50   let filename = !filename in
51
52   (* Parse the input file. *)
53   let file = Parse.parse_goalfile filename in
54
55   Ast.print_file stdout file;
56
57   (* Find the target(s) to execute first. *)
58   let initial_targets = ref [] in
59   (* XXX Parse command line anon args here. XXX *)
60
61   (* If no initial target set on the command line, find
62    * the first goal in the file.
63    *)
64   List.iter (
65     function
66     | Ast.Goal (name, [], _, _, _) ->
67        if !initial_targets = [] then
68          initial_targets := Ast.ECall (name, []) :: !initial_targets
69     | Ast.Goal (name, _, _, _, _) ->
70        if !initial_targets = [] then
71          failwithf "%s: first target ā€˜%sā€™ has parameters and so cannot be used as the default target"
72            filename name
73     | _ -> ()
74   ) file;
75
76   let initial_targets = List.rev !initial_targets in
77   ignore initial_targets
78
79 let () = main ()