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.