[Ecls-list] ASDF revolt
Daniel Herring
dherring at tentpost.com
Wed Mar 31 03:31:24 UTC 2010
Hi Juanjo,
I largely agree with your thoughts on ASDF, with one glaring exception:
ASDF should be replaced, the sooner the better. The architecture has
fundamental flaws. Frankly, I was shocked with how much development it
has received this year; even Fare has said he would rather work on XCVB.
I think XCVB has some good improvements over ASDF; but last I checked, it
still felt wrong. It solves some important build consistency issues, but
doesn't tackle much other than compilation.
As an aside, I'm not sold on the value of logical pathnames[1].
Rich Kreuter gave an interesting talk at the Boston Lisp meeting several
months ago. In it, he argued that REQUIRE had almost the right semantics
and that defsystems like ASDF were the wrong thing.
One of his basic points was that people who use a library want a simple
way to load it. They don't care what build framework it uses, and they
definitely shouldn't be forced to use the same build framework.
This resonated with me and my experience in the C/C++/unix world. The GNU
autotools are dominant not because they are easy to start with; they took
over because they do the right thing. Configure is a self-contained shell
script; the packager needs autoconf installed, but the user doesn't.
Only a decent shell, compiler, and make are presumed to be on the user's
system. Configure detects the actual system behavior; it doesn't require
the end user to tell it everything, it doesn't rely on preconfigured
tables, it fails with logs about what went wrong, and it outputs
"config.h". Once "configure; make; make install" are finished, the user
never needs to touch anything from the build framework.
Contrast that with ASDF.
- Nontrivial bootstrap; CL impls are encouraged to ship with it.
- ASDF is always used to load the library/application.
- All libraries must use the same version of ASDF.
- No interaction with non-asdf systems.
...
Considering "autotools for CL", the autotools (and even make) simply are
not suitable for CL. Furthermore, a great source of their pain comes from
the reliance on "portable" shell scripting and make. A CL build tool that
followed their basic pattern should be much easier to develop in portable
CL...
My current idea is to write two packages for each library:
configure-(library)-(version) with nickname "configure" and
make-(library)-(version) with nickname "make". Each would be in a single
source file, the result of a "macroexpansion" performed by the packager,
so the end user doesn't need any build tools installed. If configure
detected a local build tool, that could be exploited instead of the
standard make script.
The final result of a "make" would be a single file, source or fasl, that
pulls in everything when loaded. No build framework required. All CL
implementations have support for hooking such a file into REQUIRE (ASDF
requires a more sophisticated hook). I outlined a couple other details on
the ASDF list[2].
Last point for tonight. Somebody needs to figure out a way to handle
library versioning. Preferably in a way that allows multiple versions to
peacefully coexist. Again, Kreuter claims to have made a system that
almost did the right thing. I have also daydreamed on the topic[3].
Later,
Daniel
P.S. Work and home have had me completely swamped this year; but I keep
hoping that time will lighten up.
[1] Zach's Journal - Logical pathnames survey
http://xach.livejournal.com/242280.html
[2] Subject: A dream for ASDF2
http://thread.gmane.org/gmane.lisp.asdf.devel/825
[3] Subject: Thoughts on library versioning
http://thread.gmane.org/gmane.lisp.libcl.devel/110
More information about the ecl-devel
mailing list