:FEATURE dependency-def

Robert Goldman rpgoldman at sift.net
Mon May 16 19:35:38 UTC 2016

Is it just me, or is the :FEATURE dependency-def form undocumented in
the manual?  It is *mentioned* in the grammar, but I don't see it
documented -- except for the misleading mention that the :FEATURE
*requirement* has been removed from ASDF.

# This is used in :depends-on, as opposed to ``dependency,''
# which is used in :in-order-to
dependency-def := simple-component-name
              | ( :feature FEATURE-EXPRESSION dependency-def )
              | ( :version simple-component-name version-specifier )
              | ( :require module-name )

I'm actually not sure what the semantics of this should be:

1. if the FEATURE is present, include dependency-def and
2a. If the FEATURE is absent FAIL or
2b. If the FEATURE is absent, quietly succeed.

If the semantics is intended to be the latter -- and that's how I read
the relevant code in find-component.lisp -- how does a programmer say
"if this feature is not present, my system should not compile"?

I stubbed my toe on this absent-mindedly compiling Didier's decLt system
on Allegro Common Lisp.

That system doesn't, and cannot, function on ACL, but ASDF tells us it
has compiled successfully.

Instead, what seems to happen is that the net.didierverna.declt.core
system depends on (:feature :sbcl :sb-introspect) which simply seems to
fail quietly on ACL, in what looks like the worst possible way: the
attempt to laod net.didierverna.declt returns T, the guts of the system
is not loaded (seems like this feature system somehow keeps core from
continuing to load), and no error message is issued.

Actually, I don't claim to understand why this happens -- it looks to me
like RESOLVE-DEPENDENCY-SPEC should return NIL, and the load should
continue (trying to load the :net.didierverna.declt.core system and
succeeding -- or more likely choking when it hits a reference to
:SB-INTROSPECT).  But somehow it's failing to load.

I'll see if I can make a minimal test case and file a bug, but I could
use some guidance about what was intended.  If the semantics of :FEATURE
are like those of :IF-FEATURE, as I suspect, it seems like they aren't
working here.  And, if that's what's intended, how do we get the "fail
if this feture is absent" behavior that a programmer might like?


More information about the asdf-devel mailing list