Actually run goal code.
authorRichard W.M. Jones <rjones@redhat.com>
Fri, 27 Dec 2019 20:26:43 +0000 (20:26 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Fri, 27 Dec 2019 20:26:43 +0000 (20:26 +0000)
src/eval.ml
src/utils.ml
src/utils.mli
tests/file2.c [new file with mode: 0644]

index daa13b6..9fc6e5c 100644 (file)
@@ -17,6 +17,8 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *)
 
+open Printf
+
 open Utils
 
 let rec evaluate_targets env exprs =
@@ -94,7 +96,12 @@ and run_goal env loc name args (params, patterns, deps, code) =
           | [] -> env
           | d :: _ -> Ast.Env.add "^" d env in
         let code = Ast.to_shell_script env loc code in
-        Printf.printf "running : %s\n" code
+        printf "%s\n%!" (trim code);
+        let r = Sys.command code in
+        if r <> 0 then (
+          eprintf "*** goal ā€˜%sā€™ failed with exit code %d\n" name r;
+          exit 1
+        )
     );
 
     (* Check all targets were updated (else it's an error). *)
index ef11975..235167d 100644 (file)
@@ -54,3 +54,28 @@ let rec string_find s sub =
       -1 (* not found *)
   in
   loop 0
+
+let isspace c =
+  c = ' '
+  (* || c = '\f' *) || c = '\n' || c = '\r' || c = '\t' (* || c = '\v' *)
+
+let triml ?(test = isspace) str =
+  let i = ref 0 in
+  let n = ref (String.length str) in
+  while !n > 0 && test str.[!i]; do
+    decr n;
+    incr i
+  done;
+  if !i = 0 then str
+  else String.sub str !i !n
+
+let trimr ?(test = isspace) str =
+  let n = ref (String.length str) in
+  while !n > 0 && test str.[!n-1]; do
+    decr n
+  done;
+  if !n = String.length str then str
+  else String.sub str 0 !n
+
+let trim ?(test = isspace) str =
+  trimr ~test (triml ~test str)
index 0f61751..cb99fad 100644 (file)
@@ -28,3 +28,9 @@ val filter_map : ('a -> 'b option) -> 'a list -> 'b list
 val string_find : string -> string -> int
 (** [string_find str sub] finds the index of [sub] in [str].  If
     not found, returns -1. *)
+
+val isspace : char -> bool
+val triml : ?test:(char -> bool) -> string -> string
+val trimr : ?test:(char -> bool) -> string -> string
+val trim : ?test:(char -> bool) -> string -> string
+(** Trim strings at left, right or both. *)
diff --git a/tests/file2.c b/tests/file2.c
new file mode 100644 (file)
index 0000000..e69de29