[asdf-devel] Advanced Configuration

FAU fau at riseup.net
Sat Nov 16 22:21:49 UTC 2013


Ok so I've come up with something which seems to work.  Please have a
look at this.  Is this a viable solution?

Again here's the foo.lisp file:

;;; foo.lisp
(defpackage :foo
  (:use :cl)
  (:export :foo))

(in-package :foo)

(defun foo ()
  #+foo1.0
  :foo1.0
  #+foo1.1
  :foo1.1
  )
;;; foo.lisp ends here

Here's the corresponding foo.asd file:

;;; foo.asd
(defpackage :foo.system
  (:use :cl :asdf :uiop))

(in-package :foo.system)

(defclass foo-file (cl-source-file)
  ())

(defmethod output-files ((operation compile-op) (component foo-file))
  (let ((l (multiple-value-list (call-next-method))))
    (apply #'values (mapcar #'(lambda (p)
				(make-pathname* :directory (append (pathname-directory p) (list #
+foo1.0 "1.0" #+foo1.1 "1.1")) :defaults p))
			    (car l))
	   (cdr l))))

(defsystem :foo
  :serial t
  :components ((:foo-file "foo")))
;;; foo.asd ends here

In output-files we splice in a directory right before the file name
depending on what is found in *features* (foo1.0 or foo1.1).  By this we
seem to be able to keep a cached version for each.

Any comment is appreciated.

On Mon, 2013-11-11 at 02:44 -0700, FAU wrote:
> Hello Faré,
> 
> Thanks for your comments.  I downloaded asdf-source-in-package.lisp
> which may provide a good starting point.
> 
> Thanks,
> Frank
> 
> 
> On Mon, 2013-11-11 at 04:01 -0500, Faré wrote:
> > On Mon, Nov 11, 2013 at 2:40 AM, FAU <fau at riseup.net> wrote:
> > > I'd like to find out if I can do this with ASDF.
> > >
> > > (defun foo ()
> > >   #+foo1.0
> > >   :foo1.0
> > >   #+foo1.1
> > >   :foo1.1
> > >   )
> > >
> > > As you can see the behaviour of the fn foo depends on version request
> > > features (which, lets say, represents the API version and not the
> > > software package version) which must be pushed on *features* before the
> > > system is compiled (or loaded).
> > >
> > > I'd like to have ASDF reject any operation on system foo if there's not
> > > an appropriate API version request feature present for it and notify
> > > the user in some way.
> > >
> > > I'd like to keep multiple fasls for different API versions in the
> > > cache.  (One way to achieve this, which comes to my mind, would be to
> > > mangle the name of the fasl output file name to incorporate the version
> > > in same way or to change the output directory path.)
> > >
> > Dear Frank,
> > 
> > You could have a form in foo.asd that uses #+ or (featurep ...) to
> > query the features,
> > and control that in your build scripts before you call ASDF on your system.
> > However, I don't recommend this strategy.
> > 
> > I recommend you compile either only the latest version by default, or
> > compile all versions if compatibility is a must, and select at runtime
> > via some parameter or hook.
> > 
> > In general, anything that makes compilation non-deterministic is to be
> > frowned upon.
> > 
> > That said, I remember that at ITA, h4ns did a subclass of
> > cl-source-file so that a file could be compiled twice (with a
> > different output name, each time), one in each of two packages. You
> > could do something similar, except with two features. In the recently
> > published snapshot of QUUX, see in
> > lisp/qres-build/asdf-source-in-package.lisp for inspiration.
> > 
> > —♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org
> > Legislation is the manifestation of Evil in the world. Legislation is the
> > supreme camouflage of the devil, for it institutionalises Evil by giving
> > it the appearance of Good.
> >         — Christian Michel, http://www.liberalia.com/htm/cm_obey_laws.htm
> 
> 
> 





More information about the asdf-devel mailing list