diff --git a/contrib/fast-compile-op.lisp b/contrib/fast-compile-op.lisp new file mode 100644 index 0000000000000000000000000000000000000000..2e60762ace17b1c51b18b241bca805cacf2b87aa --- /dev/null +++ b/contrib/fast-compile-op.lisp @@ -0,0 +1,30 @@ +;; fast-compile-op: compile just one file in the current process, +;; loading all dependencies as source. +;; How to use it: +;; (1) your build system compiles all your system's dependencies as bundle. +;; (2) For each component in the system, invoke a process that +;; (a) loads all the transitive dependencies as bundles +;; (b) use register-preloaded-system +;; to tell ASDF the direct dependencies are loaded +;; (c) use fast-compile-op on each of the components in the system +;; (3) when they are all done, combine the fasls in a bundle. + +#+sbcl (setf sb-ext:*evaluator-mode* :interpret) + +(defclass fast-compile-op (basic-compile-op selfward-operation) + ((selfward-operation :initform 'prepare-source-op))) + +(defmethod action-description ((o fast-compile-op) (c component)) + (declare (ignorable o)) + (format nil (compatfmt "~@<fast compiling ~3i~_~A~@:>") c)) + +(defmethod perform ((o fast-compile-op) (c component)) + (let (#+sbcl (sb-ext:*evaluator-mode* :compile)) + (perform (make-operation 'compile-op) c))) + +(defmethod output-files ((o fast-compile-op) (c component)) + (output-files (make-operation 'compile-op) c)) + +(defmethod input-files ((o fast-compile-op) (c component)) + (input-files (make-operation 'compile-op) c)) +