Situation:
abcl there is a newer compiled file than source file calling load-op on the system with this file causes the fasl to be repeatedly loaded.
The reason, it appears:
(defmethod perform ((o load-op) (c cl-source-file)) #-ecl (mapcar #'load (input-files o c)) #+ecl (loop :for i :in (input-files o c) :unless (string= (pathname-type i) "fas") :collect (let ((output (compile-file-pathname (lispize-pathname i)))) (load output))))
compared to
(defmethod perform ((o load-source-op) (c cl-source-file)) (let ((source (component-pathname c))) (setf (component-property c 'last-loaded-as-source) (and (load source) (get-universal-time)))))
i.e. the last loaded-time is recorded only when the source is loaded.
-Alan
Works for me on ASDF.
For load-op and compile-op, times are stored in the operation-times slot of the component, as accessed by component-operation-times. Load-source-op should be doing the same, really. I've just added a method component-operation-time that allows one to do the Right Thing(tm) whatever that right thing is. Maybe we want load-source-op and load-op to share a same time, for instance.
If ABCL is doing the wrong thing, I suggest that you TRACE operation-done-p and/or safe-file-write-date and see what it tells you.
[ François-René ÐVB Rideau | Reflection&Cybernethics | http://fare.tunes.org ] Death is only a milestone - albeit one that is dropped on you from a very great height — Terry Pratchett.
On 2 May 2010 00:17, Alan Ruttenberg alanruttenberg@gmail.com wrote:
Situation:
abcl there is a newer compiled file than source file calling load-op on the system with this file causes the fasl to be repeatedly loaded.
The reason, it appears:
(defmethod perform ((o load-op) (c cl-source-file)) #-ecl (mapcar #'load (input-files o c)) #+ecl (loop :for i :in (input-files o c) :unless (string= (pathname-type i) "fas") :collect (let ((output (compile-file-pathname (lispize-pathname i)))) (load output))))
compared to
(defmethod perform ((o load-source-op) (c cl-source-file)) (let ((source (component-pathname c))) (setf (component-property c 'last-loaded-as-source) (and (load source) (get-universal-time)))))
i.e. the last loaded-time is recorded only when the source is loaded.
-Alan
On Sun, May 2, 2010 at 12:59 AM, Faré fahree@gmail.com wrote:
Works for me on ASDF.
For load-op and compile-op, times are stored in the operation-times slot of the component, as accessed by component-operation-times. Load-source-op should be doing the same, really. I've just added a method component-operation-time that allows one to do the Right Thing(tm) whatever that right thing is. Maybe we want load-source-op and load-op to share a same time, for instance.
If ABCL is doing the wrong thing, I suggest that you TRACE operation-done-p and/or safe-file-write-date and see what it tells you.
I'm attaching two subsequent calls to (swank:operate-on-system-for-emacs "owl2" (quote load-op)) with tracing of perform and the two functions you mention. I haven't touched any files in between, but you will notice the same set of .abcls are loaded in both cases. Also attaching asd file. I'm not sure where the locus of the problem is, but one way or another it's a regression from abcl/asdf1.
-Alan
[ François-René ÐVB Rideau | Reflection&Cybernethics | http://fare.tunes.org ] Death is only a milestone - albeit one that is dropped on you from a very great height — Terry Pratchett.
On 2 May 2010 00:17, Alan Ruttenberg alanruttenberg@gmail.com wrote:
Situation:
abcl there is a newer compiled file than source file calling load-op on the system with this file causes the fasl to be repeatedly loaded.
The reason, it appears:
(defmethod perform ((o load-op) (c cl-source-file)) #-ecl (mapcar #'load (input-files o c)) #+ecl (loop :for i :in (input-files o c) :unless (string= (pathname-type i) "fas") :collect (let ((output (compile-file-pathname (lispize-pathname i)))) (load output))))
compared to
(defmethod perform ((o load-source-op) (c cl-source-file)) (let ((source (component-pathname c))) (setf (component-property c 'last-loaded-as-source) (and (load source) (get-universal-time)))))
i.e. the last loaded-time is recorded only when the source is loaded.
-Alan
On 2 May 2010 07:53, Alan Ruttenberg alanruttenberg@gmail.com wrote:
I'm attaching two subsequent calls to (swank:operate-on-system-for-emacs "owl2" (quote load-op)) with tracing of perform and the two functions you mention. I haven't touched any files in between, but you will notice the same set of .abcls are loaded in both cases. Also attaching asd file. I'm not sure where the locus of the problem is, but one way or another it's a regression from abcl/asdf1.
Weird. Your two runs (separated in files m1 and m2) are identical, except for object identity.
replperl 'm1 m2' -npe 's/([0-9]+.[0-9]+ seconds)/(x seconds)/g' replperl 'm1 m2' -npe 's/{[0-9A-F]{5,6}}/{}/g' diff -u m1 m2
Can you also trace component-operation-time and maybe put a debug statement in the perform :after method?
Just to make sure, can you try with the latest ASDF 1.714?
And while we're at it, can you? (describe "#p"/___jar___file___root___/") (both on Windows and on Unix if possible).
Thanks!
[ François-René ÐVB Rideau | Reflection&Cybernethics | http://fare.tunes.org ] You cannot teach a man anything; you can only help him find it for himself. — attributed to Galileo Galilei
Tracked this to my bad, sorry to bother. I had operation-done-p returning nil on a custom asdf component that was a dependency. -Alan
On Sun, May 2, 2010 at 10:16 PM, Faré fahree@gmail.com wrote:
On 2 May 2010 07:53, Alan Ruttenberg alanruttenberg@gmail.com wrote:
I'm attaching two subsequent calls to (swank:operate-on-system-for-emacs "owl2" (quote load-op)) with tracing of perform and the two functions you mention. I haven't touched any files in between, but you will notice the same set of .abcls are loaded in both cases. Also attaching asd file. I'm not sure where the locus of the problem is, but one way or another it's a regression from abcl/asdf1.
Weird. Your two runs (separated in files m1 and m2) are identical, except for object identity.
replperl 'm1 m2' -npe 's/([0-9]+.[0-9]+ seconds)/(x seconds)/g' replperl 'm1 m2' -npe 's/{[0-9A-F]{5,6}}/{}/g' diff -u m1 m2
Can you also trace component-operation-time and maybe put a debug statement in the perform :after method?
Just to make sure, can you try with the latest ASDF 1.714?
And while we're at it, can you? (describe "#p"/___jar___file___root___/") (both on Windows and on Unix if possible).
Thanks!
[ François-René ÐVB Rideau | Reflection&Cybernethics | http://fare.tunes.org ] You cannot teach a man anything; you can only help him find it for himself. — attributed to Galileo Galilei