1.1.13: will be tagged as "sbcl-1.1.13"
[sbcl.git] / src / code / common-os.lisp
index 9846ed6..66ef963 100644 (file)
 
 (defvar *software-version* nil)
 
-(defvar *core-pathname* nil
-  #!+sb-doc
-  "The absolute pathname of the running SBCL core.")
+(sb!alien:define-alien-variable ("posix_argv" *native-posix-argv*) (* (* char)))
+(sb!alien:define-alien-variable ("core_string" *native-core-string*) (* char))
+(sb!alien:define-alien-routine
+ os-get-runtime-executable-path sb!alien:c-string (external-path boolean))
+(sb!alien:define-alien-variable
+ ("saved_runtime_path" *native-saved-runtime-path*) (* char))
 
-;;; if something ever needs to be done differently for one OS, then
+(defmacro init-var-ignoring-errors (variable
+                                    form
+                                    &key default
+                                         explanation
+                                         (condition 'error))
+  `(setf ,variable
+         (handler-case ,form
+           (,condition (c)
+             (let ((default ,default))
+               (warn "Error initializing ~a~@[ ~a~]:~@
+             ~a
+             ~% Using ~s instead."
+                     ',variable
+                     ,explanation
+                     c
+                     default)
+               default)))))
+
+;;; If something ever needs to be done differently for one OS, then
 ;;; split out the different part into per-os functions.
 (defun os-cold-init-or-reinit ()
+  (/show0 "setting *CORE-STRING*")
+  (init-var-ignoring-errors
+   *core-string*
+   (sb!alien:cast *native-core-string* sb!alien:c-string)
+   :default "")
+  (/show0 "setting *POSIX-ARGV*")
+  (init-var-ignoring-errors
+   sb!ext:*posix-argv*
+   (loop for i from 0
+         for arg = (sb!alien:deref *native-posix-argv* i)
+         until (sb!alien:null-alien arg)
+         collect (sb!alien:cast arg sb!alien:c-string)))
   (/show0 "entering OS-COLD-INIT-OR-REINIT")
   (setf *software-version* nil)
   (/show0 "setting *DEFAULT-PATHNAME-DEFAULTS*")
-  (setf *default-pathname-defaults*
-        ;; (temporary value, so that #'NATIVE-PATHNAME won't blow up when
-        ;; we call it below:)
-        (make-trivial-default-pathname)
-        *default-pathname-defaults*
-        ;; (final value, constructed using #'NATIVE-PATHNAME:)
-        (native-pathname (sb!unix:posix-getcwd/)))
+  ;; Temporary value, so that #'NATIVE-PATHNAME won't blow up when
+  ;; we call it below
+  (setf *default-pathname-defaults* (make-trivial-default-pathname))
+  (init-var-ignoring-errors
+   *default-pathname-defaults* (native-pathname (sb!unix:posix-getcwd/))
+   :default (make-trivial-default-pathname)
+   :explanation "with the current directory")
   (/show0 "setting *CORE-PATHNAME*")
-  (setf *core-pathname*
-        (merge-pathnames (native-pathname *core-string*)))
+  (setf *core-pathname* (merge-pathnames (native-pathname *core-string*)))
+  (/show0 "setting *RUNTIME-PATHNAME*")
+  (init-var-ignoring-errors
+   *runtime-pathname*
+   (let ((exe (os-get-runtime-executable-path t))
+         (saved (sb!alien:cast *native-saved-runtime-path* sb!alien:c-string)))
+     (when (or exe saved) (native-pathname (or exe saved)))))
   (/show0 "leaving OS-COLD-INIT-OR-REINIT"))