aboutsummaryrefslogtreecommitdiff
path: root/lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml
diff options
context:
space:
mode:
Diffstat (limited to 'lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml')
-rw-r--r--lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml53
1 files changed, 53 insertions, 0 deletions
diff --git a/lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml b/lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml
new file mode 100644
index 000000000000..1ffa5bd5647e
--- /dev/null
+++ b/lang/sml-nj-devel/files/do-patch-src::system::smlnj::installer::libinstall.sml
@@ -0,0 +1,53 @@
+--- src/system/smlnj/installer/libinstall.sml.orig Tue Jul 13 20:49:54 2004
++++ src/system/smlnj/installer/libinstall.sml Thu Aug 12 01:23:08 2004
+@@ -78,9 +78,40 @@
+ fun mkdir "" = ()
+ | mkdir d = if fexists d then () else (mkdir (P.dir d); F.mkDir d)
+
++ (* hack for cross-device moves *)
++ val move = if isUnix
++ then fn args as { old : string, new : string } =>
++ let val xdev_exnName = "SysErr\000"
++ val xdev_exnMessage_substring = "xdev"
++ in F.rename args
++ handle exn =>
++ if exnName exn = xdev_exnName
++ then if String.isSubstring xdev_exnMessage_substring
++ (exnMessage exn)
++ then if OS.Process.system
++ ("mv '" ^ old ^ "' '" ^ new ^ "'")
++ = OS.Process.success
++ then print ("(* cross device mv of \"" ^ old
++ ^ "\" to \"" ^ new
++ ^ "\" done. *)\n")
++ else fail ["move: mv " ^ old ^ " " ^ new
++ ^ " failed.\n"]
++ else ( print ("(* move: \""
++ ^ xdev_exnMessage_substring
++ ^ "\" not found in \""
++ ^ (exnMessage exn)
++ ^ "\". *)\n") ;
++ raise exn )
++ else ( print ("(* move: \"" ^ xdev_exnName
++ ^ "\" != \""
++ ^ (exnName exn) ^ "\". *)\n") ;
++ raise exn )
++ end
++ else F.rename
++
+ (* move a stable library file to its final location *)
+ fun movelib src dst () =
+- (mkdir (P.dir dst); F.rename { old = src, new = dst })
++ (mkdir (P.dir dst); move { old = src, new = dst })
+
+ (* register a temporary anchor-value binding *)
+ fun localanchor { anchor, path } =
+@@ -325,7 +356,7 @@
+ F.chDir treedir;
+ if OS.Process.system buildcmd = OS.Process.success then
+ if fexists targetheaploc then
+- (F.rename { old = targetheaploc,
++ (move { old = targetheaploc,
+ new = finalheaploc };
+ instcmd target;
+ #set (CM.Anchor.anchor target) (SOME bindir))