only perfom when the output is missing

Robert Goldman rpgoldman at sift.info
Sat Apr 17 16:46:09 UTC 2021


On 14 Apr 2021, at 18:38, Attila Lendvai wrote:

> FTR, i have managed to solve it with this:
>
> (defclass generate-lisp-op (selfward-operation)
>   ((selfward-operation :initform '()))) ; we will specify it in our 
> own
> COMPONENT-DEPENDS-ON
>
> (defmethod component-depends-on ((op generate-lisp-op) (c c2ffi-file))
>   `((load-op ,(find-system "cffi/c2ffi-generator"))
>     ;; Regenerating the spec file is a lot of headache, so we ignore
>     ;; the file modification times, and only communicate the
>     ;; dependency to ASDF if the spec file is missing.
>     ,@(let ((spec-file (input-file op c))) ; TODO is it legal to call
> ASDF:INPUT-FILES here?
>         (when (or (not (probe-file spec-file))
>                   (zerop (with-input-from-file (s spec-file)
>                            (file-length s))))
>           `((generate-spec-op ,c))))
>     ,@(call-next-method)))
>
> the commit:
> https://github.com/cffi/cffi/commit/46975c644aeb0a832cd170e953cc8ec3cbdc78df

I was wondering why it was important to avoid the build when the `.h` 
file is newer than the `.spec` file.  This shouldn't happen very often, 
should it?  Is it because:

1. The `.h` file is getting refreshed too often by something upstream of 
ASDF?  E.g., is `make` being too eager about rewriting the `.h` file?

2. There is something wrong in the ASDF dependencies?  Is it possible 
that there was an extraneous dependency on the `.spec` file that was 
causing it to mistakenly think it needed refreshing when some component 
upstream in the ASDF system was modified?  E.g., was this in a `:serial` 
system so that other changes were causing ASDF to be too eager about 
re-generating the spec file?

I don't have any great ideas about fixing the problem if it's caused by 
something outside ASDF, but if the second explanation is the case, it 
would be worth investigating further so that you don't need to make this 
change (and can regenerate the spec file when the header file is 
updated without causing lots of wasted work).  I hate to see this kind 
of spoofing, because it can so easily lead to confusing and 
hard-to-debug issues later on when the `.h` file really *does* change 
and ASDF ignores the change.

If it is something outside ASDF that's rewriting the header file when 
it's not necessary then you could do something more sophisticated and 
squirrel away a copy of the old `.h` file and use `diff` or `cmp` in 
`operation-done-p`.

Best,
R
>
> - attila
>
> PS: sorry for the double send, i have cleaned up my mail settings.

Don't worry about the double send: you are now cleared to submit emails 
from either of your email accounts, so even if you send from the wrong 
account, it should turn up OK.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/asdf-devel/attachments/20210417/7564aa9f/attachment.html>


More information about the asdf-devel mailing list