From 3b9fac8e9a7165f68ac38f483e5ce8f717f9927e Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sun, 16 Feb 2020 01:21:27 +0300 Subject: [PATCH] Version --- .gitignore | 2 ++ src/Driver.ml | 49 ++++++++++++++++++++++++++++++++++++------------- src/Makefile | 7 +++++-- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 847efcc68..582087932 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ *.cmi *.cmx *.o +version.ml + diff --git a/src/Driver.ml b/src/Driver.ml index 48f36d042..7f7e2de7c 100644 --- a/src/Driver.ml +++ b/src/Driver.ml @@ -41,16 +41,32 @@ class options args = let rec fix f = f (fix f) in let dump_ast = 1 in let dump_sm = 2 in + let help_string = + "Lama compiler. (C) JetBrains Reserach, 2017-2020.\n" ^ + "Usage: lamac \n\n" ^ + "When no options specified, builds the source file into executable.\n" ^ + "Options:\n" ^ + " -c --- compile into object file\n" ^ + " -I --- add into unit search path list\n" ^ + " -i --- interpret on a source-level interpreter\n" ^ + " -s --- compile into stack machine code and interpret on the stack machine initerpreter\n" ^ + " -dp --- dump AST (the output will be written into .ast file)\n" ^ + " -ds --- dump stack machine code (the output will be written into .sm file; has no\n" ^ + " effect if -i option is specfied)\n" ^ + " -v --- show version\n" ^ + " -h --- show this help\n" + in object (self) - val i = ref 1 - val infile = ref (None : string option) - val paths = ref [X86.get_std_path ()] - val mode = ref (`Default : [`Default | `Eval | `SM | `Compile ]) + val version = ref false + val help = ref false + val i = ref 1 + val infile = ref (None : string option) + val paths = ref [X86.get_std_path ()] + val mode = ref (`Default : [`Default | `Eval | `SM | `Compile ]) (* Workaround until Ostap starts to memoize properly *) val const = ref false (* end of the workaround *) val dump = ref 0 - val help = ref false initializer let rec loop () = match self#peek with @@ -60,15 +76,16 @@ class options args = | "-w" -> self#set_workaround (* end of the workaround *) | "-c" -> self#set_mode `Compile - | "-I" -> (match self#peek with None -> raise (Commandline_error "path expected after '-I' specifier") | Some path -> self#add_include_path path) + | "-I" -> (match self#peek with None -> raise (Commandline_error "Path expected after '-I' specifier") | Some path -> self#add_include_path path) | "-s" -> self#set_mode `SM | "-i" -> self#set_mode `Eval | "-ds" -> self#set_dump dump_sm | "-dp" -> self#set_dump dump_ast | "-h" -> self#set_help + | "-v" -> self#set_version | _ -> if opt.[0] = '-' - then raise (Commandline_error (Printf.sprintf "invalid command line specifier ('%s')" opt)) + then raise (Commandline_error (Printf.sprintf "Invalid command line specifier ('%s')" opt)) else self#set_infile opt ); loop () @@ -79,28 +96,29 @@ class options args = method private set_workaround = const := true (* end of the workaround *) + method private set_help = help := true + method private set_version = version := true method private set_dump mask = dump := !dump lor mask method private set_infile name = match !infile with | None -> infile := Some name - | Some name' -> raise (Commandline_error (Printf.sprintf "input file ('%s') already specified" name')) + | Some name' -> raise (Commandline_error (Printf.sprintf "Input file ('%s') already specified" name')) method private add_include_path path = paths := path :: !paths method private set_mode s = match !mode with | `Default -> mode := s - | _ -> raise (Commandline_error "extra compilation mode specifier") + | _ -> raise (Commandline_error "Extra compilation mode specifier") method private peek = let j = !i in if j < n then (incr i; Some (args.(j))) else None - method private set_help = help := true method get_mode = !mode method get_infile = match !infile with - | None -> raise (Commandline_error "input file not specified") + | None -> raise (Commandline_error "Input file not specified") | Some name -> name method get_help = !help method get_include_paths = !paths @@ -122,11 +140,15 @@ class options args = if (!dump land dump_sm) > 0 then self#dump_file "sm" (SM.show_prg sm) else () + method greet = + if !version then Printf.printf "%s\n" Version.version; + if !help then Printf.printf "%s" help_string end let main = try let cmd = new options Sys.argv in + cmd#greet; match (try parse cmd with Language.Semantic_error msg -> `Fail msg) with | `Ok prog -> cmd#dump_AST (snd prog); @@ -150,5 +172,6 @@ let main = List.iter (fun i -> Printf.printf "%d\n" i) output ) | `Fail er -> Printf.eprintf "Error: %s\n" er - with Language.Semantic_error msg -> Printf.printf "Error: %s\n" msg - + with + | Language.Semantic_error msg -> Printf.printf "Error: %s\n" msg + | Commandline_error msg -> Printf.printf "%s\n" msg diff --git a/src/Makefile b/src/Makefile index 8f4fa34cb..afd4e52f9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,13 +2,16 @@ TOPFILE = lamac OCAMLC = ocamlfind c OCAMLOPT = ocamlfind opt OCAMLDEP = ocamlfind dep -SOURCES = Language.ml SM.ml X86.ml Driver.ml +SOURCES = Language.ml SM.ml X86.ml version.ml Driver.ml CAMLP5 = -syntax camlp5o -package ostap.syntax,GT.syntax.all PXFLAGS = $(CAMLP5) BFLAGS = -rectypes -g OFLAGS = $(BFLAGS) -all: .depend $(TOPFILE) +all: version .depend $(TOPFILE) + +version: + echo "let version = \"Version `git rev-parse --abbrev-ref HEAD`, `git rev-parse --short HEAD`, `git rev-parse --verify HEAD |git show --no-patch --no-notes --pretty='%cd'`\"" > version.ml .depend: $(SOURCES) $(OCAMLDEP) $(PXFLAGS) *.ml > .depend