evol
evol - entrenched virtues of lisp (love reversed) aims to be a compatible and full-fledged replacement for the GNU autotools stack targeted at coping with the autotools' shortcomings while not repeating the mistakes made and still being made at comparable build tool projects.

It is under development, still has a long way to go and its top-level API is still a moving target but what exists is well-documented and mostly covered by an extensive Stefil-based test suite. Other libraries currently in use are CL-FAD, external-program, Alexandria, CL-PPCRE, unix-options, Bordeaux-Threads and patron. Right now, only SBCL is supported though.

One interesting thing you can already do with evol is:

sh$ cat >> Evolution <<EOF
(default "my-lisp-program")
(devolution "my-lisp-program" ()
            :type 'cl-exe :rule (list ':mlp)
            :init-package :mlp
            :toplevel (quote #'repl) :purify t)
EOF
sh$ evol
(sbcl --noinform --disable-debugger --eval (REQUIRE 'ASDF) --eval
 (ASDF:OOS 'ASDF:LOAD-OP :MLP) --eval (IN-PACKAGE :MLP) --eval
 (SB-EXT:SAVE-LISP-AND-DIE "my-lisp-program" :EXECUTABLE T :TOPLEVEL #'REPL
  :PURIFY T))
(...)
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into evol:
writing 3432 bytes from the read-only space at 0x01000000
writing 2256 bytes from the static space at 0x01100000
writing 32178176 bytes from the dynamic space at 0x09000000
done]
(chmod +x my-lisp-program)
-rwxr-xr-x. 1 foo users 32391196 2009-11-15 20:48 my-lisp-program

And basic stuff not requiring autoconf-like functionality does also work:

cat >> Evolution <<EOF
(defenv cc "cc")
(default "main")

(devolution "main" ("objects") :type 'program :rule "%cc %< -o %@"
            :sourcefn #'(lambda (target modifier)
                          (declare (ignore target modifier))
                          (getenv "objects")))

(devolution "objects" () :type 'hive :of 'generic :spawn '("main.o" "program.o")
            :rule "%cc ${CFLAGS} -c -o %@ %<"
            :sourcefn #'(lambda (target modifier)
                          (declare (ignore modifier))
                          (pathname-change-suffix "c" target)))

(devolution "clean" () :type 'generic :rule "rm -f %objects %main")
EOF
sh$ evol -j 3
(cc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -c -o main.o main.c)
(cc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -c -o program.o program.c)
(cc main.o program.o -o main)
(chmod +x main)
sh$ evol clean
(rm -f main.o program.o main)

Appealing enough? :) The author, Alexander Kahl, hopes this could also pull in more people to the wonderful world of Lisp(s).

The package is asdf-installable. The link to the git repository is available from Github.

ASDF-install package (obsolete) http://github.com/e-user/evol/tarball/master


Topics: build