Newer
Older
;;; Lisp implementations
#+xcvb (module (:build-depends-on ("driver") :depends-on ("lisp-invocation")))
(in-package :xcvb-driver)
(defun lisp-present-p (lisp)
(equal
"JUST ANOTHER LISP HACKER"
(first
(ignore-errors
(run-program/
(lisp-invocation:lisp-invocation-arglist
:implementation-type lisp
:eval (format nil "(progn (format t\"~~:@(~~{~~31R~~^ ~~}~~)\"'(595756 9556552524 643802 496307950)) ~A)"
(lisp-invocation:quit-form :code 0 :implementation-type lisp)))
:output :lines)))))
;; These are the only supported so far -- please add support for more!
(defparameter +xcvb-lisps+
'(:sbcl :ccl :clisp)
"Lisp implementations that can compile and run XCVB itself")
(defun find-xcvb-host-implementation ()
(find-if 'lisp-present-p +xcvb-lisps+))
(defun build-xcvb (program)
(let ((lisp (find-xcvb-host-implementation)))
(unless lisp
(error "Cannot find a supported implementation to run XCVB itself~%amongst ~{~A~^ ~}."
+xcvb-lisps+))
(lisp-invocation:lisp-invocation-arglist
:implementation-type lisp
:eval (format nil "(#.(require \"asdf\")#.(asdf:load-system :asdf)#.(asdf:load-system :xcvb-driver)#.(xcvb-driver:with-coded-exit () (asdf:load-system :xcvb) (funcall 'xcvb-driver::dump-xcvb ~S))" program))
:output nil) ;; for side-effects
Francois-Rene Rideau
committed
(native-namestring program)))
(defun dump-xcvb (program)
(let ((program (parse-native-namestring program))
(xcvb-dir (asdf:system-source-directory :xcvb)))
(setf (symbol-value (find-symbol* :*xcvb-lisp-directory* :xcvb)) xcvb-dir)
(call :xcvb :prepare-image
:version (call :xcvb-driver :get-xcvb-version)
:directory xcvb-dir)
(ensure-directories-exist program)
(dump-image program :executable t :entry-point "xcvb::main" :package :xcvb)))