src/HOL/Tools/Nitpick/kodkod.ML
changeset 34998 5e492a862b34
parent 34982 7b8c366e34a2
child 35010 d6e492cea6e4
child 35074 a88642066448
--- a/src/HOL/Tools/Nitpick/kodkod.ML	Tue Feb 02 23:38:41 2010 +0100
+++ b/src/HOL/Tools/Nitpick/kodkod.ML	Thu Feb 04 13:36:52 2010 +0100
@@ -505,6 +505,19 @@
   filter (is_relevant_setting o fst) (#settings p1)
   = filter (is_relevant_setting o fst) (#settings p2)
 
+val created_temp_dir = Unsynchronized.ref false
+
+(* bool -> string * string *)
+fun serial_string_and_temporary_dir_for_overlord overlord =
+  if overlord then
+    ("", getenv "ISABELLE_HOME_USER")
+  else
+    let
+      val dir = getenv "ISABELLE_TMP"
+      val _ = if !created_temp_dir then ()
+              else (created_temp_dir := true; File.mkdir (Path.explode dir))
+    in (serial_string (), dir) end
+
 (* int -> string *)
 fun base_name j =
   if j < 0 then string_of_int (~j - 1) ^ "'" else string_of_int j
@@ -1012,20 +1025,17 @@
       Normal ([], triv_js)
     else
       let
-        val (serial_str, tmp_path) =
-          if overlord then
-            ("", Path.append (Path.variable "ISABELLE_HOME_USER") o Path.base)
-          else
-            (serial_string (), File.tmp_path)
-        (* string -> string -> Path.T *)
-        fun path_for base suf =
-          tmp_path (Path.explode (base ^ serial_str ^ "." ^ suf))
-        val in_path = path_for "isabelle" "kki"
+        val (serial_str, temp_dir) =
+          serial_string_and_temporary_dir_for_overlord overlord
+        (* string -> Path.T *)
+        fun path_for suf =
+          Path.explode (temp_dir ^ "/kodkodi" ^ serial_str ^ "." ^ suf)
+        val in_path = path_for "kki"
         val in_buf = Unsynchronized.ref Buffer.empty
         (* string -> unit *)
         fun out s = Unsynchronized.change in_buf (Buffer.add s)
-        val out_path = path_for "kodkodi" "out"
-        val err_path = path_for "kodkodi" "err"
+        val out_path = path_for "out"
+        val err_path = path_for "err"
         val _ = write_problem_file out (map snd indexed_problems)
         val _ = File.write_buffer in_path (!in_buf)
         (* unit -> unit *)
@@ -1043,7 +1053,8 @@
           val outcome =
             let
               val code =
-                system ("env CLASSPATH=\"$KODKODI_CLASSPATH:$CLASSPATH\" \
+                system ("cd " ^ temp_dir ^ ";\n" ^
+                        "env CLASSPATH=\"$KODKODI_CLASSPATH:$CLASSPATH\" \
                         \JAVA_LIBRARY_PATH=\"$KODKODI_JAVA_LIBRARY_PATH:\
                         \$JAVA_LIBRARY_PATH\" \
                         \LD_LIBRARY_PATH=\"$KODKODI_JAVA_LIBRARY_PATH:\