Skip to content
pathname-mappings.lisp 1.6 KiB
Newer Older
#+xcvb
(module
  (:depends-on ("specials" "grain-interface")))

;;; TODO: have magic grains, an override method for digesting,
;;; returning a magic NIL, meaning "this grain is not subject to digest"?
;;; Or keep treating magically? Or have some way of segregating
;;; "dependencies at our level of abstraction" vs
;;; "dependencies below our level of abstraction".
;;; Reminds me of the dependencies that do or do not "force"
;;; a module to be recompiled in ASDF.

(in-package :xcvb)

(defun grain-pathname-mapping (env grain)
  (list (fullname grain) :pathname (grain-namestring env grain)))
(defun print-pathname-mappings (env stream grains)
  (with-safe-io-syntax ()
    (let ((*print-readably* nil)
          (*print-pretty* t)
          (*print-case* :downcase))
      (format stream "(in-package :xcvb-driver)~%~
 (defparameter *pathname-mappings*~%  ~
   (macrolet ((f () (let ((m (make-hash-table :test 'equal)))~%    ~
     (loop :for (x . y) :in~%       '~S~%      ~
       :do (setf (gethash x m) y)) m)))~%    ~
              (mapcar/ 'grain-pathname-mapping env
                       (remove-if-not 'file-grain-p grains))))))

(defun pathname-mappings-lisp-pathname ()
  (subpathname *workspace* "pathname-mappings.lisp"))

(defun pathname-mappings-fasl-pathname ()
  (make-pathname :type *fasl-type* :defaults (pathname-mappings-lisp-pathname)))

(defun make-pathname-mappings-lisp (env)
  (with-open-file (s (pathname-mappings-lisp-pathname) :direction :output
                     :if-exists :rename-and-delete :if-does-not-exist :create)
    (print-pathname-mappings env s (list-computation-grains))))