From 48dec7739ecc42aa48841b795caf2aac032198f9 Mon Sep 17 00:00:00 2001
From: Francois-Rene Rideau <tunes@google.com>
Date: Wed, 23 Apr 2014 14:22:29 -0400
Subject: [PATCH] Contrib: a trick to build an ASDF system from an external
 build system.

---
 contrib/fast-compile-op.lisp | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 contrib/fast-compile-op.lisp

diff --git a/contrib/fast-compile-op.lisp b/contrib/fast-compile-op.lisp
new file mode 100644
index 00000000..2e60762a
--- /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))
+
-- 
GitLab