non existent input files patch

Marco Baringer <[email protected]>
Newsgroups gmane.lisp.cclan.general
Message-ID <[email protected]>
More than once i have miss typed a filename in my asdf system files,
the following patch makes asdf do something when this happens (ie an
input file doesn't exist). without this patch all you get is a werid
error abut NIL not being a number (because the result of #'probe-file
is passed to mak in operation-done-p).

comments would be appreciated.


-- 
-Marco
Ring the bells that still can ring.
Forget your perfect offering.
There is a crack in everything.
That's how the light gets in.
     -Leonard Cohen
asdf.diff (text/x-patch, 4.2 KB)
Index: asdf.lisp
===================================================================
RCS file: /cvsroot/cclan/asdf/asdf.lisp,v
retrieving revision 1.68
diff -u -r1.68 asdf.lisp
--- asdf.lisp	19 Mar 2003 12:58:15 -0000	1.68
+++ asdf.lisp	5 Apr 2003 12:51:29 -0000
@@ -98,8 +98,21 @@
 				     (parse-integer v :start (1+ dot)
 						    :junk-allowed t)))))
 
-(defvar  *compile-file-warnings-behaviour* :warn)
-(defvar  *compile-file-failure-behaviour* #+sbcl :error #-sbcl :warn)
+(defvar *asdf-warnings-behaviour* :warn
+  "What to do when an operation warns.
+
+Can be one of:
+:IGNORE - do nothing
+:WARN   - signal a warning
+:ERROR  - signal an error
+")
+
+(defvar *asdf-failure-behaviour* :ignore
+  "What to da when on operation fails. Same values and semantics as
+  *asdf-warnings-behaviour*")
+
+(defvar  *compile-file-warnings-behaviour* *asdf-warnings-behaviour*)
+(defvar  *compile-file-failure-behaviour*  *asdf-failure-behaviour*)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; utility stuff
@@ -430,7 +443,11 @@
 		      :accessor operation-original-initargs)
    (visited-nodes :initform nil :accessor operation-visited-nodes)
    (visiting-nodes :initform nil :accessor operation-visiting-nodes)
-   (parent :initform nil :initarg :parent :accessor operation-parent)))
+   (parent :initform nil :initarg :parent :accessor operation-parent)
+   (on-warnings :initarg :on-warnings :accessor operation-on-warnings
+		:initform *asdf-warnings-behaviour*)
+   (on-failure :initarg :on-failure :accessor operation-on-failure
+	       :initform *asdf-failure-behaviour*)))
 
 (defmethod print-object ((o operation) stream)
   (print-unreadable-object (o stream :type t :identity t)
@@ -533,16 +550,16 @@
     
 (defmethod input-files ((operation operation) (c component))
   (let ((parent (component-parent c))
-	(self-deps (component-self-dependencies operation c)))
+        (self-deps (component-self-dependencies operation c)))
     (if self-deps
-	(mapcan (lambda (dep)
-		  (destructuring-bind (op name) dep
-		    (output-files (make-instance op)
-				  (find-component parent name))))
-		self-deps)
-	;; no previous operations needed?  I guess we work with the 
-	;; original source file, then
-	(list (component-pathname c)))))
+        (mapcan (lambda (dep)
+                  (destructuring-bind (op name) dep
+                    (output-files (make-instance op)
+                                  (find-component parent name))))
+                self-deps)
+        ;; no previous operations needed?  I guess we work with the 
+        ;; original source file, then
+        (list (component-pathname c)))))
 
 (defmethod input-files ((operation operation) (c module)) nil)
 
@@ -551,7 +568,7 @@
 	(in-files (input-files o c)))
     (cond ((and (not in-files) (not out-files))
 	   ;; arbitrary decision: an operation that uses nothing to
-	   ;; produce nothing probably isn't doing much 
+	   ;; produce nothing probably isn't doing much
 	   t)
 	  ((not out-files) 
 	   (let ((op-done
@@ -660,6 +677,19 @@
                for operation ~A, component ~A~@:>")
    (class-of operation) (class-of c)))
 
+(defmethod perform :before ((op operation) (c source-file))
+  (let ((file-name (component-pathname c)))
+    (if (probe-file file-name)
+        file-name
+        ;; input file doesn't exist
+        (ecase (operation-on-failure op)
+          (:ignore nil)
+          (:warn (warn "Inexistent file ~S listed as an input file for ~S."
+                       file-name c))
+          (:error (error "Inexistent file ~S listed as an input file for ~S."
+                         file-name c))))))
+      
+
 (defmethod perform ((operation operation) (c module))
   nil)
 
@@ -671,10 +701,8 @@
 
 (defclass compile-op (operation)
   ((proclamations :initarg :proclamations :accessor compile-op-proclamations :initform nil)
-   (on-warnings :initarg :on-warnings :accessor operation-on-warnings
-		:initform *compile-file-warnings-behaviour*)
-   (on-failure :initarg :on-failure :accessor operation-on-failure
-	       :initform *compile-file-failure-behaviour*)))
+   (on-failure :initform *compile-file-failure-behaviour*)
+   (on-warnings :initform *compile-file-warnings-behaviour*)))
 
 (defmethod perform :before ((operation compile-op) (c source-file))
   (map nil #'ensure-directories-exist (output-files operation c)))
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.