Skip to content
bootstrap.lisp 1.79 KiB
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+))
    (run-program/
     (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
  (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)))