Implement %tmpdir.
authorRichard W.M. Jones <rjones@redhat.com>
Mon, 20 Jan 2020 19:52:21 +0000 (19:52 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 20 Jan 2020 19:54:59 +0000 (19:54 +0000)
docs/Goalfile.pod
src/main.ml

index ec84bae..5355fe0 100644 (file)
@@ -12,6 +12,15 @@ Goalfile - introduction, tutorial, and reference for writing goal files
 
 =head1 REFERENCE
 
+=head2 Standard Variables
+
+=head3 %tmpdir
+
+The location of a temporary directory which is created by goals when
+it starts and is deleted when it exits (either on success or failure).
+You can use this to store any temporary files that you want
+automatically cleaned up.
+
 =head2 Standard Functions
 
 =head3 basename (path)
index cee1dcf..7e1c2f0 100644 (file)
@@ -33,6 +33,19 @@ let main () =
   (* Change directory (-C option). *)
   Sys.chdir (Cmdline.directory ());
 
+  (* Create a temporary directory which is always cleaned up at exit. *)
+  let tmpdir =
+    let temp_dir = try Unix.getenv "TMPDIR" with Not_found -> "/var/tmp" in
+    let t = Filename.temp_file ~temp_dir "goals" ".d" in
+    Unix.unlink t;
+    Unix.mkdir t 0o700;
+    at_exit (
+      fun () ->
+        let cmd = sprintf "rm -rf %s" (Filename.quote t) in
+        ignore (Sys.command cmd)
+    );
+    t in
+
   (* Create the initial environment, containing the system environment
    * and a few other standard strings.
    *)
@@ -43,6 +56,8 @@ let main () =
         Ast.Env.add k (Ast.EConstant (Ast.noloc, Ast.CString v)) env
     ) Ast.Env.empty (Unix.environment ()) in
   let env =
+    Ast.Env.add "tmpdir" (Ast.EConstant (Ast.noloc, Ast.CString tmpdir)) env in
+  let env =
     Ast.Env.add "stdlib"
       (Ast.EConstant (Ast.noloc, Ast.CString Cmdline.stdlibdir))
       env in