From d6331a4aa09dc953bb440dfe84e1dff625625be2 Mon Sep 17 00:00:00 2001
From: Daniel Barlow <>
Date: Mon, 18 Nov 2002 17:42:54 +0000
Subject: [PATCH] mostly untested fixes for more nearly correct dependency
 checking.  Use caution when upgrading

---
 asdf.lisp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/asdf.lisp b/asdf.lisp
index bd5b5ed9..11baf6c5 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,4 +1,4 @@
-;;; This is asdf: Another System Definition Facility.  $Revision: 1.51 $
+;;; This is asdf: Another System Definition Facility.  $Revision: 1.52 $
 ;;;
 ;;; Feedback, bug reports, and patches are all welcome: please mail to
 ;;; <cclan-list@lists.sf.net>.  But note first that the canonical
@@ -88,7 +88,7 @@
 (in-package #:asdf)
 
 ;;; parse the cvs revision into something that might be vaguely useful.  
-(defvar *asdf-revision* (let* ((v "$Revision: 1.51 $")
+(defvar *asdf-revision* (let* ((v "$Revision: 1.52 $")
 			       (colon (position #\: v))
 			       (dot (position #\. v)))
 			  (and v colon dot 
@@ -133,7 +133,7 @@ and NIL NAME and TYPE components"
 	     (apply #'format s (format-control c) (format-arguments c)))))
 
 (define-condition circular-dependency (system-definition-error)
-  ((components :initarg :components)))
+  ((components :initarg :components :reader circular-dependency-components)))
 
 (define-condition missing-component (system-definition-error)
   ((requires :initform "(unnamed)" :reader missing-requires :initarg :requires)
@@ -158,6 +158,8 @@ and NIL NAME and TYPE components"
 	 "Component name, restricted to portable pathname characters")
    (version :accessor component-version :initarg :version)
    (in-order-to :initform nil :initarg :in-order-to)
+   ;;; XXX crap name
+   (do-first :initform nil :initarg :do-first)
    ;; methods defined using the "inline" style inside a defsystem form:
    ;; need to store them somewhere so we can delete them when the system
    ;; is re-evaluated
@@ -499,6 +501,8 @@ system."))
 	;; original source file, then
 	(list (component-pathname c)))))
 
+ (defmethod input-files ((operation operation) (c module)) nil)
+
 (defmethod operation-done-p ((o operation) (c component))
   (let ((out-files (output-files o c))
 	(in-files (input-files o c)))
@@ -589,6 +593,10 @@ system."))
       (when (or forced
 		(operation-forced-p (operation-ancestor operation))
 		(not (operation-done-p operation c)))
+	(let ((do-first (cdr (assoc (class-name (class-of operation))
+				    (slot-value c 'do-first)))))
+	  (loop for (required-op . deps) in do-first
+		do (do-dep required-op deps)))
 	(setf forced (append (delete 'pruned-op forced :key #'car)
 			     (list (cons operation c)))))
       (setf (visiting-component operation c) nil)
@@ -820,8 +828,9 @@ Returns the new tree (which probably shares structure with the old one)"
 		     :parent parent
 		     :in-order-to (union-of-dependencies
 				   in-order-to
-				   `((compile-op (load-op ,@depends-on))
+				   `((compile-op (compile-op ,@depends-on))
 				     (load-op (load-op ,@depends-on))))
+		     :do-first `((compile-op (load-op ,@depends-on)))
 		     other-args)
 	      (when (typep ret 'module)
 		(setf (module-default-component-class ret)
-- 
GitLab