[bknr-cvs] r2236 - in branches/trunk-reorg/thirdparty: . asdf asdf/CVS asdf/debian asdf/debian/CVS asdf/test asdf/test/CVS

bknr at bknr.net bknr at bknr.net
Sun Oct 14 19:13:20 UTC 2007


Author: hhubner
Date: 2007-10-14 15:13:17 -0400 (Sun, 14 Oct 2007)
New Revision: 2236

Added:
   branches/trunk-reorg/thirdparty/asdf/
   branches/trunk-reorg/thirdparty/asdf/CVS/
   branches/trunk-reorg/thirdparty/asdf/CVS/Entries
   branches/trunk-reorg/thirdparty/asdf/CVS/Repository
   branches/trunk-reorg/thirdparty/asdf/CVS/Root
   branches/trunk-reorg/thirdparty/asdf/LICENSE
   branches/trunk-reorg/thirdparty/asdf/README
   branches/trunk-reorg/thirdparty/asdf/asdf-install.lisp
   branches/trunk-reorg/thirdparty/asdf/asdf.lisp
   branches/trunk-reorg/thirdparty/asdf/asdf.texinfo
   branches/trunk-reorg/thirdparty/asdf/cclan-package.lisp
   branches/trunk-reorg/thirdparty/asdf/cclan.asd
   branches/trunk-reorg/thirdparty/asdf/cclan.lisp
   branches/trunk-reorg/thirdparty/asdf/debian/
   branches/trunk-reorg/thirdparty/asdf/debian/CVS/
   branches/trunk-reorg/thirdparty/asdf/debian/CVS/Entries
   branches/trunk-reorg/thirdparty/asdf/debian/CVS/Repository
   branches/trunk-reorg/thirdparty/asdf/debian/CVS/Root
   branches/trunk-reorg/thirdparty/asdf/debian/README.Debian
   branches/trunk-reorg/thirdparty/asdf/debian/changelog
   branches/trunk-reorg/thirdparty/asdf/debian/cl-asdf.postinst
   branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.postinst
   branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.prerm
   branches/trunk-reorg/thirdparty/asdf/debian/compat
   branches/trunk-reorg/thirdparty/asdf/debian/control
   branches/trunk-reorg/thirdparty/asdf/debian/copyright
   branches/trunk-reorg/thirdparty/asdf/debian/docs
   branches/trunk-reorg/thirdparty/asdf/debian/postinst
   branches/trunk-reorg/thirdparty/asdf/debian/rules
   branches/trunk-reorg/thirdparty/asdf/test/
   branches/trunk-reorg/thirdparty/asdf/test/CVS/
   branches/trunk-reorg/thirdparty/asdf/test/CVS/Entries
   branches/trunk-reorg/thirdparty/asdf/test/CVS/Repository
   branches/trunk-reorg/thirdparty/asdf/test/CVS/Root
   branches/trunk-reorg/thirdparty/asdf/test/compile-asdf.lisp
   branches/trunk-reorg/thirdparty/asdf/test/file1.lisp
   branches/trunk-reorg/thirdparty/asdf/test/file2.lisp
   branches/trunk-reorg/thirdparty/asdf/test/file3.lisp
   branches/trunk-reorg/thirdparty/asdf/test/file4.lisp
   branches/trunk-reorg/thirdparty/asdf/test/run-tests.sh
   branches/trunk-reorg/thirdparty/asdf/test/script-support.lisp
   branches/trunk-reorg/thirdparty/asdf/test/static-and-serial.asd
   branches/trunk-reorg/thirdparty/asdf/test/test-force.asd
   branches/trunk-reorg/thirdparty/asdf/test/test-force.script
   branches/trunk-reorg/thirdparty/asdf/test/test-package.asd
   branches/trunk-reorg/thirdparty/asdf/test/test-package.script
   branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.lisp
   branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.script
   branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-1.asd
   branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-load.lisp
   branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-test.lisp
   branches/trunk-reorg/thirdparty/asdf/test/test-static-and-serial.script
   branches/trunk-reorg/thirdparty/asdf/test/test-version.script
   branches/trunk-reorg/thirdparty/asdf/test/test1.asd
   branches/trunk-reorg/thirdparty/asdf/test/test1.script
   branches/trunk-reorg/thirdparty/asdf/test/test2.asd
   branches/trunk-reorg/thirdparty/asdf/test/test2.script
   branches/trunk-reorg/thirdparty/asdf/test/test2a.asd
   branches/trunk-reorg/thirdparty/asdf/test/test2b1.asd
   branches/trunk-reorg/thirdparty/asdf/test/test2b2.asd
   branches/trunk-reorg/thirdparty/asdf/test/test2b3.asd
   branches/trunk-reorg/thirdparty/asdf/test/test3.asd
   branches/trunk-reorg/thirdparty/asdf/test/test3.script
   branches/trunk-reorg/thirdparty/asdf/test/test4.script
   branches/trunk-reorg/thirdparty/asdf/test/wild-module.asd
   branches/trunk-reorg/thirdparty/asdf/test/wild-module.script
   branches/trunk-reorg/thirdparty/asdf/wild-modules.lisp
Log:
update asdf from cvs

Added: branches/trunk-reorg/thirdparty/asdf/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/CVS/Entries	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/CVS/Entries	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,11 @@
+/LICENSE/1.1/Wed Mar  6 23:59:29 2002//
+/README/1.39/Mon Aug 21 10:52:32 2006//
+/asdf-install.lisp/1.7/Mon Dec  1 03:14:35 2003//
+/asdf.lisp/1.110/Thu Sep 27 13:15:06 2007//
+/asdf.texinfo/1.8/Sat Jun  2 02:44:59 2007//
+/cclan-package.lisp/1.4/Thu Jun  5 01:13:49 2003//
+/cclan.asd/1.6/Thu Jun  5 01:13:49 2003//
+/cclan.lisp/1.9/Fri Jul 18 05:32:53 2003//
+/wild-modules.lisp/1.3/Tue Aug 12 03:56:43 2003//
+D/debian////
+D/test////

Added: branches/trunk-reorg/thirdparty/asdf/CVS/Repository
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/CVS/Repository	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/CVS/Repository	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+asdf

Added: branches/trunk-reorg/thirdparty/asdf/CVS/Root
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/CVS/Root	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/CVS/Root	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+:pserver:anonymous at cclan.cvs.sourceforge.net:/cvsroot/cclan

Added: branches/trunk-reorg/thirdparty/asdf/LICENSE
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/LICENSE	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/LICENSE	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,24 @@
+
+(This is the MIT / X Consortium license as taken from 
+ http://www.opensource.org/licenses/mit-license.html)
+
+Copyright (c) 2001, 2002 Daniel Barlow and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Added: branches/trunk-reorg/thirdparty/asdf/README
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/README	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/README	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,762 @@
+$Id: README,v 1.39 2006/08/21 10:52:32 crhodes Exp $         -*- Text -*-
+
+The canonical documentation for asdf is in the file asdf.texinfo.  
+The significant overlap between this file and that will one day be
+resolved by deleting text from this file; in the meantime, please look
+there before here.
+
+
+
+asdf: another system definition facility          
+========================================
+
+* Getting the latest version
+
+0) Decide which version you want.  HEAD is the newest version and
+usually OK, whereas RELEASE is for cautious people (e.g. who already
+have systems using asdf that they don't want broken), a slightly older
+version about which none of the HEAD users have complained.
+
+1) Check it out from sourceforge cCLan CVS:
+
+1a) cvs -d:pserver:anonymous at cvs.cclan.sourceforge.net:/cvsroot/cclan login
+     (no password: just press Enter)
+ 
+1a.1) cvs -z3 -d:pserver:anonymous at cvs.cclan.sourceforge.net:/cvsroot/cclan
+         co -r RELEASE asdf
+
+or for the bleeding edge, instead
+
+1a.2) cvs -z3 -d:pserver:anonymous at cvs.cclan.sourceforge.net:/cvsroot/cclan
+          co -A asdf
+
+If you are tracking the bleeding edge, you may want to subscribe to
+the cclan-commits mailing list (see
+<URL:http://sourceforge.net/mail/?group_id=28536>) to receive commit
+messages and diffs whenever changes are made.
+
+For more CVS information, look at http://sourceforge.net/cvs/?group_id=28536
+
+
+* Getting started
+
+- The single file asdf.lisp is all you need to use asdf normally.  For
+maximum convenience you want to have it loaded whenever you start your
+Lisp implementation, by loading it from the startup script, or dumping
+a custom core, or something.
+
+- The variable asdf:*central-registry* is a list of system directory
+  designators.  A system directory designator is a form which will be
+  evaluated whenever a system is to be found, and must evaluate to a
+  directory to look in.  For example, you might have
+
+     (*default-pathname-defaults* "/home/me/cl/systems/"
+      "/usr/share/common-lisp/systems/")
+
+  (When we say "directory" here, we mean "designator for a pathname
+  with a supplied DIRECTORY component")
+
+  It is possible to customize the system definition file search.
+  That's considered advanced use, and covered later: search forward
+  for *system-definition-search-functions*
+
+- To compile and load a system 'foo', you need to (1) ensure that
+  foo.asd is in one of the directories in *central-registry* (a
+  symlink to the real location of foo.asd is preferred), (2) execute
+  ``(asdf:operate 'asdf:load-op 'foo)''
+
+    $ cd /home/me/cl/systems/
+    $ ln -s ~/src/foo/foo.asd .
+    $ lisp
+    * (asdf:operate 'asdf:load-op 'foo)
+
+- To write your own system definitions, look at the test systems in
+  test/ , and read the rest of this.  Ignore systems/ which is old
+  and may go away when next I clean up
+
+- Syntax is similar to mk-defsystem 3 for straightforward systems, you
+  may only need to remove the :source-pathname option (and replace it
+  with :pathname if the asd file is not in the same place as the
+  system sources)
+
+- Join cclan-list at lists.sf.net for discussion, bug reports, questions, etc
+
+- cclan.asd and the source files listed therein contain useful extensions 
+  for maintainers of systems in the cCLan.  If this isn't you, you
+  don't need them - although you may want to look at them anyway
+
+- For systems that do complicated things (e.g. compiling C files to
+  load as foreign code), the packages in vn-cclan may provide some
+  guidance.  db-sockets, for example, is known to do outlandish things
+  with preprocessors
+
+   http://ww.telent.net/cliki/vn-cclan 
+
+
+
+* Concepts
+
+This system definition utility talks in terms of 'components' and
+'operations'.
+
+Components form systems: a component represents a source file, or a
+collection of components.  A system is therefore a component,
+recursively formed of a tree of subcomponents.
+
+Operations are instantiated then performed on the nodes of a tree to
+do things like
+
+ - compile all its files
+ - load the files into a running lisp environment
+ - copy its source files somewhere else
+
+Operations can be invoked directly, or examined to see what their
+effects would be without performing them.  There are a bunch of 
+methods specialised on operation and component type which actually do
+the grunt work.
+
+asdf is extensible to new operations and to new component types.  This
+allows the addition of behaviours: for example, a new component could
+be added for Java JAR archives, and methods specialised on compile-op
+added for it that would accomplish the relevant actions.  Users
+defining their own operations and component types should inherit from
+the asdf base classes asdf:operation and asdf:component respectively.
+
+* Inspiration
+
+** mk-defsystem (defsystem-3.x)
+
+We aim to solve basically the same problems as mk-defsystem does.
+However, our architecture for extensibility better exploits CL
+language features (and is documented), and we intend to be portable
+rather than just widely-ported.  No slight on the mk-defsystem authors
+and maintainers is intended here; that implementation has the
+unenviable task of supporting non-ANSI implementations, which I
+propose to ignore.
+
+The surface defsystem syntax of asdf is more-or-less compatible with
+mk-defsystem
+
+The mk-defsystem code for topologically sorting a module's dependency
+list was very useful.
+
+** defsystem-4 proposal
+
+Marco and Peter's proposal for defsystem 4 served as the driver for
+many of the features in here.  Notable differences are
+
+- we don't specify output files or output file extensions as part of
+  the system
+
+  If you want to find out what files an operation would create, ask
+  the operation
+
+- we don't deal with CL packages
+
+  If you want to compile in a particular package, use an in-package
+  form in that file (ilisp will like you more if you do this anyway)
+
+- there is no proposal here that defsystem does version control.  
+
+  A system has a given version which can be used to check
+  dependencies, but that's all.
+
+The defsystem 4 proposal tends to look more at the external features,
+whereas this one centres on a protocol for system introspection.
+
+** kmp's "The Description of Large Systems", MIT AI Memu 801
+
+Available in updated-for-CL form on the web at 
+http://world.std.com/~pitman/Papers/Large-Systems.html
+
+In our implementation we borrow kmp's overall PROCESS-OPTIONS and
+concept to deal with creating component trees from defsystem surface
+syntax.  [ this is not true right now, though it used to be and
+probably will be again soon ]
+
+
+* The Objects
+
+** component
+
+*** Component Attributes
+
+**** A name (required)
+
+This is a string or a symbol.  If a symbol, its name is taken and
+lowercased.  The name must be a suitable value for the :name initarg
+to make-pathname in whatever filesystem the system is to be found.
+
+The lower-casing-symbols behaviour is unconventional, but was selected
+after some consideration.  Observations suggest that the type of
+systems we want to support either have lowercase as customary case
+(Unix, Mac, windows) or silently convert lowercase to uppercase
+(lpns), so this makes more sense than attempting to use :case :common,
+which is reported not to work on some implementations
+
+**** a version identifier (optional)
+
+This is used by the test-system-version operation (see later).
+
+**** *features* required
+
+Traditionally defsystem users have used reader conditionals to include
+or exclude specific per-implementation files.  This means that any
+single implementation cannot read the entire system, which becomes a
+problem if it doesn't wish to compile it, but instead for example to
+create an archive file containing all the sources, as it will omit to
+process the system-dependent sources for other systems.
+
+Each component in an asdf system may therefore specify features using
+the same syntax as #+ does, and it will (somehow) be ignored for
+certain operations unless the feature conditional matches
+
+**** dependencies on its siblings  (optional but often necessary)
+
+There is an excitingly complicated relationship between the initarg
+and the method that you use to ask about dependencies
+
+Dependencies are between (operation component) pairs.  In your
+initargs, you can say
+
+:in-order-to ((compile-op (load-op "a" "b") (compile-op "c"))
+	      (load-op (load-op "foo")))
+
+- before performing compile-op on this component, we must perform
+load-op on "a" and "b", and compile-op on c, - before performing
+load-op, we have to load "foo"
+
+The syntax is approximately
+
+(this-op {(other-op required-components)}+)
+
+required-components := component-name
+                     | (required-components required-components)
+
+component-name := string
+                | (:version string minimum-version-object)
+
+[ This is on a par with what ACL defsystem does.  mk-defsystem is less
+general: it has an implied dependency
+
+  for all x, (load x) depends on (compile x)
+
+and using a :depends-on argument to say that b depends on a _actually_
+means that
+
+  (compile b) depends on (load a) 
+
+This is insufficient for e.g. the McCLIM system, which requires that
+all the files are loaded before any of them can be compiled ]
+
+In asdf, the dependency information for a given component and
+operation can be queried using (component-depends-on operation
+component), which returns a list
+
+((load-op "a") (load-op "b") (compile-op "c") ...)
+
+component-depends-on can be subclassed for more specific
+component/operation types: these need to (call-next-method) and append
+the answer to their dependency, unless they have a good reason for
+completely overriding the default dependencies
+
+(If it weren't for CLISP, we'd be using a LIST method combination to
+do this transparently.  But, we need to support CLISP.  If you have
+the time for some CLISP hacking, I'm sure they'd welcome your fixes)
+
+**** a pathname
+
+This is optional and if absent will be inferred from name, type (the
+subclass of source-file), and the location of parent.
+
+The rules for this inference are:
+
+(for source-files)
+- the host is taken from the parent
+- pathname type is (source-file-type component system)
+- the pathname case option is :local
+- the pathname is merged against the parent
+
+(for modules)
+- the host is taken from the parent
+- the name and type are NIL
+- the directory is (:relative component-name)
+- the pathname case option is :local
+- the pathname is merged against the parent
+
+Note that the DEFSYSTEM operator (used to create a "top-level" system)
+does additional processing to set the filesystem location of the
+top component in that system.  This is detailed elsewhere
+
+The answer to the frequently asked question "how do I create a system 
+definition where all the source files have a .cl extension" is thus
+
+(defmethod source-file-type ((c cl-source-file) (s (eql (find-system 'my-sys))))
+   "cl")
+
+**** properties (optional)
+
+Packaging systems often require information about files or systems
+additional to that specified here.  Programs that create vendor
+packages out of asdf systems therefore have to create "placeholder"
+information to satisfy these systems.  Sometimes the creator of an
+asdf system may know the additional information and wish to provide it
+directly.
+
+(component-property component property-name) and associated setf method 
+will allow the programmatic update of this information.  Property
+names are compared as if by EQL, so use symbols or keywords or something
+
+** Subclasses of component
+
+*** 'source-file'
+
+A source file is any file that the system does not know how to
+generate from other components of the system. 
+
+(Note that this is not necessarily the same thing as "a file
+containing data that is typically fed to a compiler".  If a file is
+generated by some pre-processor stage (e.g. a ".h" file from ".h.in"
+by autoconf) then it is not, by this definition, a source file.
+Conversely, we might have a graphic file that cannot be automatically
+regenerated, or a proprietary shared library that we received as a
+binary: these do count as source files for our purposes.  All
+suggestions for better terminology gratefully received)
+
+Subclasses of source-file exist for various languages.  
+
+*** 'module', a collection of sub-components
+
+This has extra slots for
+
+ :components - the components contained in this module
+
+ :default-component-class - for child components which don't specify
+   their class explicitly
+
+ :if-component-dep-fails takes one of the values :fail, :try-next, :ignore 
+   (default value is :fail).  The other values can be used for implementing
+   conditional compilation based on implementation *features*, where
+   it is not necessary for all files in a module to be compiled
+
+The default operation knows how to traverse a module, so most
+operations will not need to provide methods specialised on modules.
+
+The module may be subclassed to represent components such as
+foreign-language linked libraries or archive files.
+
+*** system, subclasses module
+
+A system is a module with a few extra attributes for documentation
+purposes.  In behaviour, it's usually identical.
+
+Users can create new classes for their systems: the default defsystem
+macro takes a :classs keyword argument.
+
+
+** operation
+
+An operation is instantiated whenever the user asks that an operation
+be performed, inspected, or etc.  The operation object contains
+whatever state is relevant to this purpose (perhaps a list of visited
+nodes, for example) but primarily is a nice thing to specialise
+operation methods on and easier than having them all be EQL methods.
+
+There are no differences between standard operations and user-defined
+operations, except that the user is respectfully requested to keep his
+(or more importantly, our) package namespace clean
+
+*** invoking operations
+
+(operate operation system &rest keywords-args)
+
+keyword-args are passed to the make-instance call when creating the
+operation: valid keywords depend on the initargs that the operation is
+defined to accept.  Note that dependencies may cause the operation to
+invoke other operations on the system or its components: the new
+operation will be created with the same initargs as the original one.
+
+oos is accepted as a synonym for operate
+
+*** standard operations
+
+**** feature-dependent-op
+
+This is not intended to be instantiated directly, but other operations
+may inherit from it.  An instance of feature-dependent-op will ignore
+any components which have a `features' attribute, unless the feature
+combination it designates is satisfied by *features*
+
+See the earlier explanation about the component features attribute for
+more information
+
+**** compile-op &key proclamations
+
+If proclamations are supplied, they will be proclaimed.  This is a
+good place to specify optimization settings
+
+When creating a new component, you should provide methods for this.  
+
+If you invoke compile-op as a user, component dependencies often mean
+you may get some parts of the system loaded.  This may not necessarily
+be the whole thing, though; for your own sanity it is recommended that
+you use load-op if you want to load a system.
+
+**** load-op &key proclamations
+
+The default methods for load-op compile files before loading them.
+For parity, your own methods on new component types should probably do
+so too
+
+**** load-source-op
+
+This method will load the source for the files in a module even if the
+source files have been compiled. Systems sometimes have knotty
+dependencies which require that sources are loaded before they can be
+compiled.  This is how you do that.
+
+If you are creating a component type, you need to implement this
+operation - at least, where meaningful.
+
+**** test-system-version &key minimum
+
+Asks the system whether it satisfies a version requirement.
+
+The default method accepts a string, which is expected to contain of a
+number of integers separated by #\. characters.  The method is not
+recursive.  The component satisfies the version dependency if it has
+the same major number as required and each of its sub-versions is
+greater than or equal to the sub-version number required.
+
+(defun version-satisfies (x y)
+  (labels ((bigger (x y)
+	     (cond ((not y) t)
+		   ((not x) nil)
+		   ((> (car x) (car y)) t)
+		   ((= (car x) (car y))
+		    (bigger (cdr x) (cdr y))))))
+    (and (= (car x) (car y))
+	 (or (not (cdr y)) (bigger (cdr x) (cdr y))))))
+
+If that doesn't work for your system, you can override it.  I hope
+yoyu have as much fun writing the new method as #lisp did
+reimplementing this one. 
+
+*** Creating new operations
+
+subclass operation, provide methods for source-file for 
+
+- output-files
+- perform
+   The perform method must call output-files to find out where to
+   put its files, because the user is allowed to override output-files
+   for local policy
+- explain
+- operation-done-p, if you don't like the default one
+
+* Writing system definitions
+
+** System designators
+
+System designators are strings or symbols and behave just like
+any other component names (including case conversion)
+
+** find-system
+
+Given a system designator, find-system finds an actual system - either
+in memory, or in a file on the disk.  It funcalls each element in the
+*system-definition-search-functions* list, expecting a pathname to be
+returned.
+
+If a suitable file exists, it is loaded if
+
+- there is no system of that name in memory, 
+- the file's last-modified time exceeds the last-modified time of the
+  system in memory
+
+When system definitions are loaded from .asd files, a new scratch
+package is created for them to load into, so that different systems do
+not overwrite each others operations.  The user may also wish to (and
+is recommended to) include defpackage and in-package forms in his
+system definition files, however, so that they can be loaded manually
+if need be.  It is not recommended to use the CL-USER package for this
+purpose, as definitions made in this package will affect the parsing
+of asdf systems.
+
+For convenience in the normal case, and for backward compatibility
+with the spirit of mk-defsystem, the default contents of
+*system-definition-search-functions* is a function called
+sysdef-central-registry-search.  This looks in each of the directories
+given by evaluating members of *central-registry*, for a file whose
+name is the name of the system and whose type is "asd".  The first
+such file is returned, whether or not it turns out to actually define
+the appropriate system
+
+
+
+** Syntax
+
+Systems can always be constructed programmatically by instantiating
+components using make-instance.  For most purposes, however, it is
+likely that people will want a static defystem form. 
+
+asdf is based around the principle that components should not have to
+know defsystem syntax.  That is, the initargs that a component accepts
+are not necessarily related to the defsystem form which creates it.
+
+A defsystem parser must implement a `defsystem' macro, which can
+be named for compatibility with whatever other system definition
+utility is being emulated.  It should instantiate components in
+accordance with whatever language it accepts, and register the topmost
+component using REGISTER-SYSTEM
+
+*** Native syntax
+
+The native syntax is inspired by mk-defsystem, to the extent that it
+should be possible to take most straightforward mk- system definitions
+and run them with only light editing.  For my convenience, this turns
+out to be basically the same as the initargs to the various
+components, with a few extensions for convenience
+               
+system-definition := ( defsystem system-designator {option}* )
+
+option := :components component-list
+        | :pathname pathname
+        | :default-component-class
+        | :perform method-form 
+        | :explain method-form
+	| :output-files  method-form
+        | :operation-done-p method-form
+        | :depends-on ( {simple-component-name}* ) 
+	| :serial [ t | nil ]
+        | :in-order-to ( {dependency}+ )
+
+component-list := ( {component-def}* )
+                
+component-def  := simple-component-name
+                | ( component-type name {option}* )
+
+component-type := :module | :file | :system | other-component-type
+
+dependency := (dependent-op {requirement}+)
+requirement := (required-op {required-component}+)
+             | (feature feature-name)
+dependent-op := operation-name
+required-op := operation-name | feature
+
+For example
+
+(defsystem "foo"
+  :version "1.0"
+  :components ((:module "foo" :components ((:file "bar") (:file"baz") 
+                                           (:file "quux"))
+	        :perform (compile-op :after (op c)
+			  (do-something c))
+		:explain (compile-op :after (op c)
+			  (explain-something c)))
+               (:file "blah")))
+
+
+The method-form tokens need explaining: esentially, 
+
+	        :perform (compile-op :after (op c)
+			  (do-something c))
+		:explain (compile-op :after (op c)
+			  (explain-something c)))
+has the effect of
+
+(defmethod perform :after ((op compile-op) (c (eql ...)))
+	   (do-something c))
+(defmethod explain :after ((op compile-op) (c (eql ...)))
+	   (explain-something c))
+
+where ... is the component in question; note that although this also
+supports :before methods, they may not do what you want them to - a
+:before method on perform ((op compile-op) (c (eql ...)))  will run
+after all the dependencies and sub-components have been processed, but
+before the component in question has been compiled.
+
+**** Serial dependencies
+
+If the `:serial t' option is specified for a module, asdf will add
+dependencies for each each child component, on all the children
+textually preceding it.  This is done as if by :depends-on
+
+:components ((:file "a") (:file "b") (:file "c"))
+:serial t
+
+is equivalent to
+:components ((:file "a") 
+	     (:file "b" :depends-on ("a"))
+	     (:file "c" :depends-on ("a" "b")))
+
+
+
+have all the 
+
+**** Source location
+
+The :pathname option is optional in all cases for native-syntax
+systems, and in the usual case the user is recommended not to supply
+it.  If it is not supplied for the top-level form, defsystem will set
+it from
+
+- The host/device/directory parts of *load-truename*, if it is bound
+- *default-pathname-defaults*, otherwise
+
+If a system is being redefined, the top-level pathname will be 
+
+- changed, if explicitly supplied or obtained from *load-truename*
+- changed if it had previously been set from *default-pathname-defaults*
+- left as before, if it had previously been set from *load-truename*
+  and *load-truename* is not now bound
+
+These rules are designed so that (i) find-system will load a system
+from disk and have its pathname default to the right place, (ii)
+this pathname information will not be overwritten with
+*default-pathname-defaults* (which could be somewhere else altogether)
+if the user loads up the .asd file into his editor and
+interactively re-evaluates that form
+
+ * Error handling
+
+It is an error to define a system incorrectly: an implementation may
+detect this and signal a generalised instance of
+SYSTEM-DEFINITION-ERROR.
+
+Operations may go wrong (for example when source files contain
+errors).  These are signalled using generalised instances of
+OPERATION-ERROR, with condition readers ERROR-COMPONENT and
+ERROR-OPERATION for the component and operation which erred.
+
+* Compilation error and warning handling
+
+ASDF checks for warnings and errors when a file is compiled. The
+variables *compile-file-warnings-behaviour* and
+*compile-file-errors-behavior* controls the handling of any such
+events. The valid values for these variables are :error, :warn, and
+:ignore.
+
+----------------------------------------------------------
+                      TODO List
+----------------------------------------------------------
+
+* Outstanding spec questions, things to add
+
+** packaging systems
+
+*** manual page component?
+
+** style guide for .asd files
+
+You should either use keywords or be careful with the package that you
+evaluate defsystem forms in.  Otherwise (defsystem partition ...)
+being read in the cl-user package will intern a cl-user:partition
+symbol, which will then collide with the partition:partition symbol.
+
+Actually there's a hairier packages problem to think about too.
+in-order-to is not a keyword: if you read defsystem forms in a package
+that doesn't use ASDF, odd things might happen
+
+** extending defsystem with new options
+
+You might not want to write a whole parser, but just to add options to
+the existing syntax.  Reinstate parse-option or something akin
+
+** document all the error classes
+
+** what to do with compile-file failure
+
+Should check the primary return value from compile-file and see if
+that gets us any closer to a sensible error handling strategy
+
+** foreign files
+
+lift unix-dso stuff from db-sockets
+
+** Diagnostics
+
+A "dry run" of an operation can be made with the following form:
+
+(traverse (make-instance '<operation-name>)
+          (find-system <system-name>)
+          'explain)
+
+This uses unexported symbols.  What would be a nice interface for this
+functionality?
+
+** patches
+
+Sometimes one wants to 
+
+
+* missing bits in implementation
+
+** all of the above
+** reuse the same scratch package whenever a system is reloaded from disk
+** rules for system pathname defaulting are not yet implemented properly
+** proclamations probably aren't
+** when a system is reloaded with fewer components than it previously
+   had, odd things happen
+
+we should do something inventive when processing a defsystem form,
+like take the list of kids and setf the slot to nil, then transfer
+children from old to new list as they're found
+
+**  traverse may become a normal function
+
+If you're defining methods on traverse,  speak up.
+
+
+** a lot of load-op methods can be rewritten to use input-files
+
+so should be.
+
+
+** (stuff that might happen later)
+
+*** david lichteblau's patch for symlink resolution?
+
+*** Propagation of the :force option.  ``I notice that
+
+	(oos 'compile-op :araneida :force t)
+
+also forces compilation of every other system the :araneida system
+depends on.  This is rarely useful to me; usually, when I want to force
+recompilation of something more than a single source file, I want to
+recompile only one system.  So it would be more useful to have
+make-sub-operation refuse to propagate ":force t" to other systems, and
+propagate only something like ":force :recursively". ''
+
+Ideally what we actually want is some kind of criterion that says
+to which systems (and which operations) a :force switch will propagate.
+
+The problem is perhaps that 'force' is a pretty meaningless concept.
+How obvious is it that "load :force t" should force _compilation_?
+But we don't really have the right dependency setup for the user to
+compile :force t and expect it to work (files will not be loaded after
+compilation, so the compile environment for subsequent files will be
+emptier than it needs to be)
+
+What does the user actually want to do when he forces?  Usually, for
+me, update for use with a new version of the lisp compiler.  Perhaps
+for recovery when he suspects that something has gone wrong.  Or else
+when he's changed compilation options or configuration in some way
+that's not reflected in the dependency graph.
+
+Other possible interface: have a 'revert' function akin to 'make clean'
+
+  (asdf:revert 'asdf:compile-op 'araneida) 
+
+would delete any files produced by 'compile-op 'araneida.  Of course, it
+wouldn't be able to do much about stuff in the image itself.
+
+How would this work?
+
+traverse
+
+There's a difference between a module's dependencies (peers) and its
+components (children).  Perhaps there's a similar difference in
+operations?  For example, (load "use") depends-on (load "macros") is a
+peer, whereas (load "use") depends-on (compile "use") is more of a
+`subservient' relationship.

Added: branches/trunk-reorg/thirdparty/asdf/asdf-install.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/asdf-install.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/asdf-install.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,299 @@
+#|| sh asdf-install.lisp will compile this file to an exe called asdf-install
+sbcl <<EOF
+(require 'sb-executable)
+(compile-file "asdf-install.lisp")
+(sb-executable:make-executable "asdf-install" *)
+EOF
+exit 0
+||#
+
+;;; Install an ASDF system or anything else that looks convincingly
+;;; like one, including updating symlink for all the toplevel .asd files it
+;;; contains
+
+;;; If the file $HOME/.asdf-install exists, it is loaded.  This can be
+;;; used to override the default values of exported special variables
+;;; (see the defpackage form for details) - however, most of them are
+;;; sensible and/or taken from the environment anyway
+
+#||
+TODO:
+a) gpg signature checking would be better if it actually checked against
+a list of "trusted to write Lisp" keys, instead of just "trusted to be
+who they say they are"
+
+d) in sbcl 0.8.1 we'll have a run-program that knows about $PATH and so
+won't need to hardcode gpgpgpgp and tar locations.
+
+e) nice to have: resume half-done downloads instead of starting from scratch
+every time.  but right now we're dealing in fairly small packages, this is not
+an immediate concern
+
+||#
+(in-package :cl-user)
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (require 'asdf)
+  (require 'sb-posix)
+  (require 'sb-executable)
+  (require 'sb-bsd-sockets))
+
+(defpackage :asdf-install
+  (:use "CL" "SB-EXT"  "SB-BSD-SOCKETS")
+  (:export #:*proxy* #:*cclan-mirror* #:*sbcl-home*
+	   #:*verify-gpg-signatures* #:*locations*))
+
+(defpackage :asdf-install-customize
+  (:use "CL" "SB-EXT"  "SB-BSD-SOCKETS" "ASDF-INSTALL"))
+
+(in-package :asdf-install)
+
+(defvar *proxy* (posix-getenv "http_proxy"))
+(defvar *cclan-mirror*
+  (or (posix-getenv "CCLAN_MIRROR")
+      "http://ftp.linux.org.uk/pub/lisp/cclan/"))
+
+(defun directorify (name)
+  ;; input name may or may not have a training #\/, but we know we
+  ;; want a directory
+  (let ((path (pathname name)))
+    (if (pathname-name path)
+	(merge-pathnames
+	 (make-pathname :directory `(:relative ,(pathname-name path))
+			:name "")
+	 path)
+	path)))
+
+(defvar *sbcl-home* (directorify (posix-getenv "SBCL_HOME")))
+(defvar *dot-sbcl*
+  (merge-pathnames (make-pathname :directory '(:relative ".sbcl"))
+		   (user-homedir-pathname)))
+
+(defvar *verify-gpg-signatures* t)
+
+(defvar *locations*
+  `((,(merge-pathnames "site/" *sbcl-home*)
+     ,(merge-pathnames "site-systems/" *sbcl-home*)
+     "System-wide install")
+    (,(merge-pathnames "site/" *dot-sbcl*)
+     ,(merge-pathnames "systems/" *dot-sbcl*)
+     "Personal installation")))
+
+(let* ((*package* (find-package :asdf-install-customize))
+       (file (probe-file (merge-pathnames
+			  (make-pathname :name ".asdf-install")
+			  (user-homedir-pathname)))))
+  (when file (load file)))
+
+(define-condition download-error (error)
+  ((url :initarg :url :reader download-url)
+   (response :initarg :response :reader download-response))
+  (:report (lambda (c s)
+	     (format s "Server responded ~A for GET ~A"
+		     (download-response c) (download-url c)))))
+
+(define-condition signature-error (error)
+  ((cause :initarg :cause :reader signature-error-cause))
+  (:report (lambda (c s)
+	     (format s "Cannot verify package signature:  ~A"
+		     (signature-error-cause c)))))
+	     
+(defun url-host (url)
+  (assert (string-equal url "http://" :end1 7))
+  (let* ((port-start (position #\: url :start 7))
+	 (host-end (min (or (position #\/ url :start 7) (length url))
+			(or port-start (length url)))))
+    (subseq url 7 host-end)))
+
+(defun url-port (url)
+  (assert (string-equal url "http://" :end1 7))
+  (let ((port-start (position #\: url :start 7)))
+    (if port-start (parse-integer url :start port-start :junk-allowed t) 80)))
+
+(defun url-connection (url)
+  (let ((s (make-instance 'inet-socket :type :stream :protocol :tcp))
+	(host (url-host url))
+	(port (url-port url)))
+    (socket-connect
+     s (car (host-ent-addresses (get-host-by-name (url-host (or *proxy* url)))))
+     (url-port (or  *proxy* url)))
+    (let ((stream (socket-make-stream s :input t :output t :buffering :full)))
+      ;; we are exceedingly unportable about proper line-endings here.
+      ;; Anyone wishing to run this under non-SBCL should take especial care
+      (format stream "GET ~A HTTP/1.0~%Host: ~A~%Cookie: CCLAN-SITE=~A~%~%"
+	      url host *cclan-mirror*)
+      (force-output stream)
+      (list
+       (let* ((l (read-line stream))
+	      (space (position #\Space l)))
+	 (parse-integer l :start (1+ space) :junk-allowed t))
+       (loop for line = (read-line stream nil nil)
+	     until (or (null line) (eql (elt line 0) (code-char 13)))
+	     collect
+	     (let ((colon (position #\: line)))
+	       (cons (intern (string-upcase (subseq line 0 colon)) :keyword)
+		     (string-trim (list #\Space (code-char 13))
+				  (subseq line (1+ colon))))))
+       stream))))
+
+(defun download (package-name-or-url file-name)
+  (let ((url
+	 (if (= (mismatch package-name-or-url "http://") 7)
+	     package-name-or-url
+	     (format nil "http://www.cliki.net/~A?download"
+		     package-name-or-url))))
+    (destructuring-bind (response headers stream)
+	(block got
+	  (loop
+	   (destructuring-bind (response headers stream) (url-connection url)
+	     (unless (member response '(301 302))	       
+	       (return-from got (list response headers stream)))
+	     (close stream)
+	     (setf url (cdr (assoc :location headers))))))
+      (if (>= response 400)
+	(error 'download-error :url url :response response))
+      (let ((length (parse-integer
+		     (or (cdr (assoc :content-length headers)) "")
+		     :junk-allowed t)))
+	(format t "Downloading ~A bytes from ~A ..."
+		(if length length "some unknown number of") url)
+	(force-output)
+	(with-open-file (o file-name :direction :output)
+	  (if length
+	      (let ((buf (make-array length
+				     :element-type
+				     (stream-element-type stream)  )))
+		(read-sequence buf stream)
+		(write-sequence buf o)) 
+	      (sb-executable:copy-stream stream o))))
+      (close stream)
+      (terpri)
+      ;; seems to have worked.  let's try for a detached gpg signature too
+      (when *verify-gpg-signatures*
+	(verify-gpg-signature url file-name)))))
+
+(defun verify-gpg-signature (url file-name)
+  (destructuring-bind (response headers stream)
+      (url-connection (concatenate 'string url ".asc"))
+    (declare (ignore headers))
+    (unwind-protect
+	 (if (= response 200)
+	     ;; sadly, we can't pass the stream directly to run-program,
+	     ;; because (at least in sbcl 0.8) that ignores existing buffered
+	     ;; data and only reads new fresh data direct from the file
+	     ;; descriptor
+	     (let ((data (make-string (parse-integer
+				       (cdr (assoc :content-length headers))
+				       :junk-allowed t))))
+	       (read-sequence data stream)
+	       (let ((ret
+		      (process-exit-code
+		       (sb-ext:run-program "/usr/bin/gpg"
+					   (list "--verify" "-"
+						 (namestring file-name))
+					   :output t
+					   :input (make-string-input-stream data)
+					   :wait t))))
+		 (unless (zerop ret)
+		   (error 'signature-error
+			  :cause (make-condition
+				  'simple-error
+				  :format-control "GPG returned exit status ~A"
+				  :format-arguments (list ret))))))
+	     (error 'signature-error
+		    :cause
+		    (make-condition
+		     'download-error :url  (concatenate 'string url ".asc")
+		     :response response)))
+      (close stream))))
+	
+    
+
+
+(defun where ()  
+  (format t "Install where?~%")
+  (loop for (source system name) in *locations*
+	for i from 1
+	do (format t "~A) ~A: ~%   System in ~A~%   Files in ~A ~%"
+		   i name system source))
+  (format t " --> ") (force-output)
+  (let ((response (read)))
+    (when (> response 0)
+      (elt *locations* (1- response)))))
+
+(defun install (source system packagename)
+  "Returns a list of asdf system names for installed asdf systems"
+  (ensure-directories-exist source )
+    (ensure-directories-exist system )
+  (let* ((tar
+	  (with-output-to-string (o)
+	    (or
+	     (sb-ext:run-program "/bin/tar"
+				 (list "-C" (namestring source)
+				       "-xzvf" (namestring packagename))
+				 :output o
+				 :wait t)
+	     (error "can't untar"))))
+	 (dummy (princ tar))
+	 (pos-slash (position #\/ tar))
+	 (*default-pathname-defaults*
+	  (merge-pathnames
+	   (make-pathname :directory
+			  `(:relative ,(subseq tar 0 pos-slash)))
+	   source)))
+    (loop for asd in (directory
+		      (make-pathname :name :wild :type "asd"))
+	  do (let ((target (merge-pathnames
+			    (make-pathname :name (pathname-name asd)
+					   :type (pathname-type asd))
+			    system)))
+	       (when (probe-file target)
+		 (sb-posix:unlink target))
+	       (sb-posix:symlink asd target))
+	  collect (pathname-name asd))))
+
+(defvar *temporary-files*)
+(defun temp-file-name (p)
+  (let* ((pos-slash (position #\/ p :from-end t))
+	 (pos-dot (position #\. p :start (or pos-slash 0))))
+    (merge-pathnames
+     (make-pathname
+      :name (subseq p (if pos-slash (1+ pos-slash) 0) pos-dot)
+      :type "asdf-install-tmp"))))
+		     
+
+
+(defun run (&optional (packages (cdr *posix-argv*)))
+  (destructuring-bind (source system name) (where)
+    (labels ((one-iter (packages)
+	       (dolist (asd
+			 (loop for p in packages
+			       unless (probe-file p)
+			       do (let ((tmp (temp-file-name p)))
+				    (pushnew tmp *temporary-files*)
+				    (download p tmp)
+				    (setf p tmp))
+			       end
+			       do (format t "Installing ~A in ~A,~A~%" p source system)
+			       append (install source system p)))
+		 (handler-case
+		     (asdf:operate 'asdf:load-op asd)
+		   (asdf:missing-dependency (c)
+		     (format t "Downloading package ~A, required by ~A~%"
+			     (asdf::missing-requires c)
+			     (asdf:component-name (asdf::missing-required-by c)))
+		     (one-iter (list
+				(symbol-name (asdf::missing-requires c)))))))))
+      (one-iter packages))))
+
+(handler-case
+    (let ((*temporary-files* nil))
+      (unwind-protect
+	   (run)
+	(dolist (l *temporary-files*)
+	  (when (probe-file l) (delete-file l)))))
+  (error (c)
+    (princ "Install failed due to error:") (terpri)
+    (princ c) (terpri)
+    (quit :unix-status 1)))
+
+;(quit)
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/asdf.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/asdf.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/asdf.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,1308 @@
+;;; This is asdf: Another System Definition Facility.  $Revision: 1.110 $
+;;;
+;;; Feedback, bug reports, and patches are all welcome: please mail to
+;;; <cclan-list at lists.sf.net>.  But note first that the canonical
+;;; source for asdf is presently the cCLan CVS repository at
+;;; <URL:http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/cclan/asdf/>
+;;;
+;;; If you obtained this copy from anywhere else, and you experience
+;;; trouble using it, or find bugs, you may want to check at the
+;;; location above for a more recent version (and for documentation
+;;; and test files, if your copy came without them) before reporting
+;;; bugs.  There are usually two "supported" revisions - the CVS HEAD
+;;; is the latest development version, whereas the revision tagged
+;;; RELEASE may be slightly older but is considered `stable'
+
+;;; Copyright (c) 2001-2007 Daniel Barlow and contributors
+;;;
+;;; Permission is hereby granted, free of charge, to any person obtaining
+;;; a copy of this software and associated documentation files (the
+;;; "Software"), to deal in the Software without restriction, including
+;;; without limitation the rights to use, copy, modify, merge, publish,
+;;; distribute, sublicense, and/or sell copies of the Software, and to
+;;; permit persons to whom the Software is furnished to do so, subject to
+;;; the following conditions:
+;;;
+;;; The above copyright notice and this permission notice shall be
+;;; included in all copies or substantial portions of the Software.
+;;;
+;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+;;; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+;;; OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+;;; WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+;;; the problem with writing a defsystem replacement is bootstrapping:
+;;; we can't use defsystem to compile it.  Hence, all in one file
+
+(defpackage #:asdf
+  (:export #:defsystem #:oos #:operate #:find-system #:run-shell-command
+	   #:system-definition-pathname #:find-component ; miscellaneous
+	   #:hyperdocumentation #:hyperdoc
+	   
+	   #:compile-op #:load-op #:load-source-op #:test-system-version
+	   #:test-op
+	   #:operation			; operations
+	   #:feature			; sort-of operation
+	   #:version			; metaphorically sort-of an operation
+	   
+	   #:input-files #:output-files #:perform	; operation methods
+	   #:operation-done-p #:explain
+	   
+	   #:component #:source-file 
+	   #:c-source-file #:cl-source-file #:java-source-file
+	   #:static-file
+	   #:doc-file
+	   #:html-file
+	   #:text-file
+	   #:source-file-type
+	   #:module			; components
+	   #:system
+	   #:unix-dso
+	   
+	   #:module-components		; component accessors
+	   #:component-pathname
+	   #:component-relative-pathname
+	   #:component-name
+	   #:component-version
+	   #:component-parent
+	   #:component-property
+	   #:component-system
+	   
+	   #:component-depends-on
+
+	   #:system-description
+	   #:system-long-description
+	   #:system-author
+	   #:system-maintainer
+	   #:system-license
+	   #:system-licence
+	   #:system-source-file
+	   #:system-relative-pathname 
+
+	   #:operation-on-warnings
+	   #:operation-on-failure
+	   
+	   ;#:*component-parent-pathname* 
+	   #:*system-definition-search-functions*
+	   #:*central-registry*		; variables
+	   #:*compile-file-warnings-behaviour*
+	   #:*compile-file-failure-behaviour*
+	   #:*asdf-revision*
+	   
+	   #:operation-error #:compile-failed #:compile-warned #:compile-error
+	   #:error-component #:error-operation
+	   #:system-definition-error 
+	   #:missing-component
+	   #:missing-dependency
+	   #:circular-dependency	; errors
+	   #:duplicate-names
+	   
+	   #:retry
+	   #:accept                     ; restarts
+	   
+           #:preference-file-for-system/operation
+           #:load-preferences
+	   )
+  (:use :cl))
+
+
+#+nil
+(error "The author of this file habitually uses #+nil to comment out forms.  But don't worry, it was unlikely to work in the New Implementation of Lisp anyway")
+
+
+(in-package #:asdf)
+
+(defvar *asdf-revision* (let* ((v "$Revision: 1.110 $")
+			       (colon (or (position #\: v) -1))
+			       (dot (position #\. v)))
+			  (and v colon dot 
+			       (list (parse-integer v :start (1+ colon)
+						    :junk-allowed t)
+				     (parse-integer v :start (1+ dot)
+						    :junk-allowed t)))))
+
+(defvar *compile-file-warnings-behaviour* :warn)
+
+(defvar *compile-file-failure-behaviour* #+sbcl :error #-sbcl :warn)
+
+(defvar *verbose-out* nil)
+
+(defparameter +asdf-methods+
+  '(perform explain output-files operation-done-p))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; utility stuff
+
+(defmacro aif (test then &optional else)
+  `(let ((it ,test)) (if it ,then ,else)))
+
+(defun pathname-sans-name+type (pathname)
+  "Returns a new pathname with same HOST, DEVICE, DIRECTORY as PATHNAME,
+and NIL NAME and TYPE components"
+  (make-pathname :name nil :type nil :defaults pathname))
+
+(define-modify-macro appendf (&rest args) 
+		     append "Append onto list") 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; classes, condiitons
+
+(define-condition system-definition-error (error) ()
+  ;; [this use of :report should be redundant, but unfortunately it's not.
+  ;; cmucl's lisp::output-instance prefers the kernel:slot-class-print-function
+  ;; over print-object; this is always conditions::%print-condition for
+  ;; condition objects, which in turn does inheritance of :report options at
+  ;; run-time.  fortunately, inheritance means we only need this kludge here in
+  ;; order to fix all conditions that build on it.  -- rgr, 28-Jul-02.]
+  #+cmu (:report print-object))
+
+(define-condition formatted-system-definition-error (system-definition-error)
+  ((format-control :initarg :format-control :reader format-control)
+   (format-arguments :initarg :format-arguments :reader format-arguments))
+  (:report (lambda (c s)
+	     (apply #'format s (format-control c) (format-arguments c)))))
+
+(define-condition circular-dependency (system-definition-error)
+  ((components :initarg :components :reader circular-dependency-components)))
+
+(define-condition duplicate-names (system-definition-error)
+  ((name :initarg :name :reader duplicate-names-name)))
+
+(define-condition missing-component (system-definition-error)
+  ((requires :initform "(unnamed)" :reader missing-requires :initarg :requires)
+   (version :initform nil :reader missing-version :initarg :version)
+   (parent :initform nil :reader missing-parent :initarg :parent)))
+
+(define-condition missing-dependency (missing-component)
+  ((required-by :initarg :required-by :reader missing-required-by)))
+
+(define-condition operation-error (error)
+  ((component :reader error-component :initarg :component)
+   (operation :reader error-operation :initarg :operation))
+  (:report (lambda (c s)
+	     (format s "~@<erred while invoking ~A on ~A~@:>"
+		     (error-operation c) (error-component c)))))
+(define-condition compile-error (operation-error) ())
+(define-condition compile-failed (compile-error) ())
+(define-condition compile-warned (compile-error) ())
+
+(defclass component ()
+  ((name :accessor component-name :initarg :name :documentation
+	 "Component name: designator for a string composed of portable pathname characters")
+   (version :accessor component-version :initarg :version)
+   (in-order-to :initform nil :initarg :in-order-to)
+   ;;; XXX crap name
+   (do-first :initform nil :initarg :do-first)
+   ;; methods defined using the "inline" style inside a defsystem form:
+   ;; need to store them somewhere so we can delete them when the system
+   ;; is re-evaluated
+   (inline-methods :accessor component-inline-methods :initform nil)
+   (parent :initarg :parent :initform nil :reader component-parent)
+   ;; no direct accessor for pathname, we do this as a method to allow
+   ;; it to default in funky ways if not supplied
+   (relative-pathname :initarg :pathname)
+   (operation-times :initform (make-hash-table )
+		    :accessor component-operation-times)
+   ;; XXX we should provide some atomic interface for updating the
+   ;; component properties
+   (properties :accessor component-properties :initarg :properties
+	       :initform nil)))
+
+;;;; methods: conditions
+
+(defmethod print-object ((c missing-dependency) s)
+  (format s "~@<~A, required by ~A~@:>"
+	  (call-next-method c nil) (missing-required-by c)))
+
+(defun sysdef-error (format &rest arguments)
+  (error 'formatted-system-definition-error :format-control format :format-arguments arguments))
+
+;;;; methods: components
+
+(defmethod print-object ((c missing-component) s)
+  (format s "~@<component ~S not found~
+             ~@[ or does not match version ~A~]~
+             ~@[ in ~A~]~@:>"
+	  (missing-requires c)
+	  (missing-version c)
+	  (when (missing-parent c)
+	    (component-name (missing-parent c)))))
+
+(defgeneric component-system (component)
+  (:documentation "Find the top-level system containing COMPONENT"))
+  
+(defmethod component-system ((component component))
+  (aif (component-parent component)
+       (component-system it)
+       component))
+
+(defmethod print-object ((c component) stream)
+  (print-unreadable-object (c stream :type t :identity t)
+    (ignore-errors
+      (prin1 (component-name c) stream))))
+
+(defclass module (component)
+  ((components :initform nil :accessor module-components :initarg :components)
+   ;; what to do if we can't satisfy a dependency of one of this module's
+   ;; components.  This allows a limited form of conditional processing
+   (if-component-dep-fails :initform :fail
+			   :accessor module-if-component-dep-fails
+			   :initarg :if-component-dep-fails)
+   (default-component-class :accessor module-default-component-class
+     :initform 'cl-source-file :initarg :default-component-class)))
+
+(defgeneric component-pathname (component)
+  (:documentation "Extracts the pathname applicable for a particular component."))
+
+(defun component-parent-pathname (component)
+  (aif (component-parent component)
+       (component-pathname it)
+       *default-pathname-defaults*))
+
+(defgeneric component-relative-pathname (component)
+  (:documentation "Extracts the relative pathname applicable for a particular component."))
+   
+(defmethod component-relative-pathname ((component module))
+  (or (slot-value component 'relative-pathname)
+      (make-pathname
+       :directory `(:relative ,(component-name component))
+       :host (pathname-host (component-parent-pathname component)))))
+
+(defmethod component-pathname ((component component))
+  (let ((*default-pathname-defaults* (component-parent-pathname component)))
+    (merge-pathnames (component-relative-pathname component))))
+
+(defgeneric component-property (component property))
+
+(defmethod component-property ((c component) property)
+  (cdr (assoc property (slot-value c 'properties) :test #'equal)))
+
+(defgeneric (setf component-property) (new-value component property))
+
+(defmethod (setf component-property) (new-value (c component) property)
+  (let ((a (assoc property (slot-value c 'properties) :test #'equal)))
+    (if a
+	(setf (cdr a) new-value)
+	(setf (slot-value c 'properties)
+	      (acons property new-value (slot-value c 'properties))))))
+
+(defclass system (module)
+  ((description :accessor system-description :initarg :description)
+   (long-description
+    :accessor system-long-description :initarg :long-description)
+   (author :accessor system-author :initarg :author)
+   (maintainer :accessor system-maintainer :initarg :maintainer)
+   (licence :accessor system-licence :initarg :licence
+	    :accessor system-license :initarg :license)))
+
+;;; version-satisfies
+
+;;; with apologies to christophe rhodes ...
+(defun split (string &optional max (ws '(#\Space #\Tab)))
+  (flet ((is-ws (char) (find char ws)))
+    (nreverse
+     (let ((list nil) (start 0) (words 0) end)
+       (loop
+	(when (and max (>= words (1- max)))
+	  (return (cons (subseq string start) list)))
+	(setf end (position-if #'is-ws string :start start))
+	(push (subseq string start end) list)
+	(incf words)
+	(unless end (return list))
+	(setf start (1+ end)))))))
+
+(defgeneric version-satisfies (component version))
+
+(defmethod version-satisfies ((c component) version)
+  (unless (and version (slot-boundp c 'version))
+    (return-from version-satisfies t))
+  (let ((x (mapcar #'parse-integer
+		   (split (component-version c) nil '(#\.))))
+	(y (mapcar #'parse-integer
+		   (split version nil '(#\.)))))
+    (labels ((bigger (x y)
+	       (cond ((not y) t)
+		     ((not x) nil)
+		     ((> (car x) (car y)) t)
+		     ((= (car x) (car y))
+		      (bigger (cdr x) (cdr y))))))
+      (and (= (car x) (car y))
+	   (or (not (cdr y)) (bigger (cdr x) (cdr y)))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; finding systems
+
+(defvar *defined-systems* (make-hash-table :test 'equal))
+(defun coerce-name (name)
+   (typecase name
+     (component (component-name name))
+     (symbol (string-downcase (symbol-name name)))
+     (string name)
+     (t (sysdef-error "~@<invalid component designator ~A~@:>" name))))
+
+;;; for the sake of keeping things reasonably neat, we adopt a
+;;; convention that functions in this list are prefixed SYSDEF-
+
+(defvar *system-definition-search-functions*
+  '(sysdef-central-registry-search))
+
+(defun system-definition-pathname (system)
+  (some (lambda (x) (funcall x system))
+	*system-definition-search-functions*))
+	
+(defvar *central-registry*
+  '(*default-pathname-defaults*
+    #+nil "/home/dan/src/sourceforge/cclan/asdf/systems/"
+    #+nil "telent:asdf;systems;"))
+
+(defun sysdef-central-registry-search (system)
+  (let ((name (coerce-name system)))
+    (block nil
+      (dolist (dir *central-registry*)
+	(let* ((defaults (eval dir))
+	       (file (and defaults
+			  (make-pathname
+			   :defaults defaults :version :newest
+			   :name name :type "asd" :case :local))))
+	  (if (and file (probe-file file))
+	      (return file)))))))
+
+(defun make-temporary-package ()
+  (flet ((try (counter)
+           (ignore-errors
+                   (make-package (format nil "ASDF~D" counter)
+                                 :use '(:cl :asdf)))))
+    (do* ((counter 0 (+ counter 1))
+          (package (try counter) (try counter)))
+         (package package))))
+
+(defun find-system (name &optional (error-p t))
+  (let* ((name (coerce-name name))
+	 (in-memory (gethash name *defined-systems*))
+	 (on-disk (system-definition-pathname name)))	 
+    (when (and on-disk
+	       (or (not in-memory)
+		   (< (car in-memory) (file-write-date on-disk))))
+      (let ((package (make-temporary-package)))
+        (unwind-protect
+             (let ((*package* package))
+               (format 
+                *verbose-out*
+                "~&~@<; ~@;loading system definition from ~A into ~A~@:>~%"
+                ;; FIXME: This wants to be (ENOUGH-NAMESTRING
+                ;; ON-DISK), but CMUCL barfs on that.
+		on-disk
+		*package*)
+               (load on-disk))
+          (delete-package package))))
+    (let ((in-memory (gethash name *defined-systems*)))
+      (if in-memory
+	  (progn (if on-disk (setf (car in-memory) (file-write-date on-disk)))
+		 (cdr in-memory))
+	  (if error-p (error 'missing-component :requires name))))))
+
+(defun register-system (name system)
+  (format *verbose-out* "~&~@<; ~@;registering ~A as ~A~@:>~%" system name)
+  (setf (gethash (coerce-name  name) *defined-systems*)
+	(cons (get-universal-time) system)))
+
+(defun system-registered-p (name)
+  (gethash (coerce-name name) *defined-systems*))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; finding components
+
+(defgeneric find-component (module name &optional version)
+  (:documentation "Finds the component with name NAME present in the
+MODULE module; if MODULE is nil, then the component is assumed to be a
+system."))
+
+(defmethod find-component ((module module) name &optional version)
+  (if (slot-boundp module 'components)
+      (let ((m (find name (module-components module)
+		     :test #'equal :key #'component-name)))
+	(if (and m (version-satisfies m version)) m))))
+	    
+
+;;; a component with no parent is a system
+(defmethod find-component ((module (eql nil)) name &optional version)
+  (let ((m (find-system name nil)))
+    (if (and m (version-satisfies m version)) m)))
+
+;;; component subclasses
+
+(defclass source-file (component) ())
+
+(defclass cl-source-file (source-file) ())
+(defclass c-source-file (source-file) ())
+(defclass java-source-file (source-file) ())
+(defclass static-file (source-file) ())
+(defclass doc-file (static-file) ())
+(defclass html-file (doc-file) ())
+
+(defgeneric source-file-type (component system))
+(defmethod source-file-type ((c cl-source-file) (s module)) "lisp")
+(defmethod source-file-type ((c c-source-file) (s module)) "c")
+(defmethod source-file-type ((c java-source-file) (s module)) "java")
+(defmethod source-file-type ((c html-file) (s module)) "html")
+(defmethod source-file-type ((c static-file) (s module)) nil)
+
+(defmethod component-relative-pathname ((component source-file))
+  (let ((relative-pathname (slot-value component 'relative-pathname)))
+    (if relative-pathname
+        (merge-pathnames 
+         relative-pathname
+         (make-pathname 
+          :type (source-file-type component (component-system component))))
+        (let* ((*default-pathname-defaults* 
+                (component-parent-pathname component))
+               (name-type
+                (make-pathname
+                 :name (component-name component)
+                 :type (source-file-type component
+                                         (component-system component)))))
+          name-type))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; operations
+
+;;; one of these is instantiated whenever (operate ) is called
+
+(defclass operation ()
+  ((forced :initform nil :initarg :force :accessor operation-forced)
+   (original-initargs :initform nil :initarg :original-initargs
+		      :accessor operation-original-initargs)
+   (visited-nodes :initform nil :accessor operation-visited-nodes)
+   (visiting-nodes :initform nil :accessor operation-visiting-nodes)
+   (parent :initform nil :initarg :parent :accessor operation-parent)))
+
+(defmethod print-object ((o operation) stream)
+  (print-unreadable-object (o stream :type t :identity t)
+    (ignore-errors
+      (prin1 (operation-original-initargs o) stream))))
+
+(defmethod shared-initialize :after ((operation operation) slot-names
+				     &key force 
+				     &allow-other-keys)
+  (declare (ignore slot-names force))
+  ;; empty method to disable initarg validity checking
+  )
+
+(defgeneric perform (operation component))
+(defgeneric operation-done-p (operation component))
+(defgeneric explain (operation component))
+(defgeneric output-files (operation component))
+(defgeneric input-files (operation component))
+
+(defun node-for (o c)
+  (cons (class-name (class-of o)) c))
+
+(defgeneric operation-ancestor (operation)
+  (:documentation   "Recursively chase the operation's parent pointer until we get to the head of the tree"))
+
+(defmethod operation-ancestor ((operation operation))
+  (aif (operation-parent operation)
+       (operation-ancestor it)
+       operation))
+
+
+(defun make-sub-operation (c o dep-c dep-o)
+  (let* ((args (copy-list (operation-original-initargs o)))
+	 (force-p (getf args :force)))
+    ;; note explicit comparison with T: any other non-NIL force value
+    ;; (e.g. :recursive) will pass through
+    (cond ((and (null (component-parent c))
+		(null (component-parent dep-c))
+		(not (eql c dep-c)))
+	   (when (eql force-p t)
+	     (setf (getf args :force) nil))
+	   (apply #'make-instance dep-o
+		  :parent o
+		  :original-initargs args args))
+	  ((subtypep (type-of o) dep-o)
+	   o)
+	  (t 
+	   (apply #'make-instance dep-o
+		  :parent o :original-initargs args args)))))
+
+
+(defgeneric visit-component (operation component data))
+
+(defmethod visit-component ((o operation) (c component) data)
+  (unless (component-visited-p o c)
+    (push (cons (node-for o c) data)
+	  (operation-visited-nodes (operation-ancestor o)))))
+
+(defgeneric component-visited-p (operation component))
+
+(defmethod component-visited-p ((o operation) (c component))
+  (assoc (node-for o c)
+	 (operation-visited-nodes (operation-ancestor o))
+	 :test 'equal))
+
+(defgeneric (setf visiting-component) (new-value operation component))
+
+(defmethod (setf visiting-component) (new-value operation component)
+  ;; MCL complains about unused lexical variables
+  (declare (ignorable new-value operation component)))
+
+(defmethod (setf visiting-component) (new-value (o operation) (c component))
+  (let ((node (node-for o c))
+	(a (operation-ancestor o)))
+    (if new-value
+	(pushnew node (operation-visiting-nodes a) :test 'equal)
+	(setf (operation-visiting-nodes a)
+	      (remove node  (operation-visiting-nodes a) :test 'equal)))))
+
+(defgeneric component-visiting-p (operation component))
+
+(defmethod component-visiting-p ((o operation) (c component))
+  (let ((node (cons o c)))
+    (member node (operation-visiting-nodes (operation-ancestor o))
+	    :test 'equal)))
+
+(defgeneric component-depends-on (operation component)
+  (:documentation
+   "Returns a list of dependencies needed by the component to perform
+    the operation.  A dependency has one of the following forms:
+
+      (<operation> <component>*), where <operation> is a class
+        designator and each <component> is a component
+        designator, which means that the component depends on
+        <operation> having been performed on each <component>; or
+
+      (FEATURE <feature>), which means that the component depends
+        on <feature>'s presence in *FEATURES*.
+
+    Methods specialized on subclasses of existing component types
+    should usually append the results of CALL-NEXT-METHOD to the
+    list."))
+
+(defmethod component-depends-on ((op-spec symbol) (c component))
+  (component-depends-on (make-instance op-spec) c))
+
+(defmethod component-depends-on ((o operation) (c component))
+  (cdr (assoc (class-name (class-of o))
+	      (slot-value c 'in-order-to))))
+
+(defgeneric component-self-dependencies (operation component))
+
+(defmethod component-self-dependencies ((o operation) (c component))
+  (let ((all-deps (component-depends-on o c)))
+    (remove-if-not (lambda (x)
+		     (member (component-name c) (cdr x) :test #'string=))
+		   all-deps)))
+    
+(defmethod input-files ((operation operation) (c component))
+  (let ((parent (component-parent c))
+	(self-deps (component-self-dependencies operation c)))
+    (if self-deps
+	(mapcan (lambda (dep)
+		  (destructuring-bind (op name) dep
+		    (output-files (make-instance op)
+				  (find-component parent name))))
+		self-deps)
+	;; no previous operations needed?  I guess we work with the 
+	;; original source file, then
+	(list (component-pathname c)))))
+
+(defmethod input-files ((operation operation) (c module)) nil)
+
+(defmethod operation-done-p ((o operation) (c component))
+  (flet ((fwd-or-return-t (file)
+           ;; if FILE-WRITE-DATE returns NIL, it's possible that the
+           ;; user or some other agent has deleted an input file.  If
+           ;; that's the case, well, that's not good, but as long as
+           ;; the operation is otherwise considered to be done we
+           ;; could continue and survive.
+           (let ((date (file-write-date file)))
+             (cond
+               (date)
+               (t 
+                (warn "~@<Missing FILE-WRITE-DATE for ~S: treating ~
+                       operation ~S on component ~S as done.~@:>" 
+                      file o c)
+                (return-from operation-done-p t))))))
+    (let ((out-files (output-files o c))
+          (in-files (input-files o c)))
+      (cond ((and (not in-files) (not out-files))
+             ;; arbitrary decision: an operation that uses nothing to
+             ;; produce nothing probably isn't doing much 
+             t)
+            ((not out-files) 
+             (let ((op-done
+                    (gethash (type-of o)
+                             (component-operation-times c))))
+               (and op-done
+                    (>= op-done
+                        (apply #'max
+                               (mapcar #'fwd-or-return-t in-files))))))
+            ((not in-files) nil)
+            (t
+             (and
+              (every #'probe-file out-files)
+              (> (apply #'min (mapcar #'file-write-date out-files))
+                 (apply #'max (mapcar #'fwd-or-return-t in-files)))))))))
+
+;;; So you look at this code and think "why isn't it a bunch of
+;;; methods".  And the answer is, because standard method combination
+;;; runs :before methods most->least-specific, which is back to front
+;;; for our purposes.  And CLISP doesn't have non-standard method
+;;; combinations, so let's keep it simple and aspire to portability
+
+(defgeneric traverse (operation component))
+(defmethod traverse ((operation operation) (c component))
+  (let ((forced nil))
+    (labels ((do-one-dep (required-op required-c required-v)
+	       (let* ((dep-c (or (find-component
+				  (component-parent c)
+				  ;; XXX tacky.  really we should build the
+				  ;; in-order-to slot with canonicalized
+				  ;; names instead of coercing this late
+				  (coerce-name required-c) required-v)
+				 (error 'missing-dependency :required-by c
+					:version required-v
+					:requires required-c)))
+		      (op (make-sub-operation c operation dep-c required-op)))
+		 (traverse op dep-c)))	   	   
+	     (do-dep (op dep)
+	       (cond ((eq op 'feature)
+		      (or (member (car dep) *features*)
+			  (error 'missing-dependency :required-by c
+				 :requires (car dep) :version nil)))
+		     (t
+		      (dolist (d dep)
+                        (cond ((consp d)
+                               (assert (string-equal
+                                        (symbol-name (first d))
+                                        "VERSION"))
+                               (appendf forced
+					(do-one-dep op (second d) (third d))))
+                              (t
+                               (appendf forced (do-one-dep op d nil)))))))))
+      (aif (component-visited-p operation c)
+	   (return-from traverse
+	     (if (cdr it) (list (cons 'pruned-op c)) nil)))
+      ;; dependencies
+      (if (component-visiting-p operation c)
+	  (error 'circular-dependency :components (list c)))
+      (setf (visiting-component operation c) t)
+      (loop for (required-op . deps) in (component-depends-on operation c)
+	    do (do-dep required-op deps))
+      ;; constituent bits
+      (let ((module-ops
+	     (when (typep c 'module)
+	       (let ((at-least-one nil)
+		     (forced nil)
+		     (error nil))
+		 (loop for kid in (module-components c)
+		       do (handler-case
+			      (appendf forced (traverse operation kid ))
+			    (missing-dependency (condition)
+			      (if (eq (module-if-component-dep-fails c) :fail)
+				  (error condition))
+			      (setf error condition))
+			    (:no-error (c)
+			      (declare (ignore c))
+			      (setf at-least-one t))))
+		 (when (and (eq (module-if-component-dep-fails c) :try-next)
+			    (not at-least-one))
+		   (error error))
+		 forced))))
+	;; now the thing itself
+	(when (or forced module-ops
+		  (not (operation-done-p operation c))
+		  (let ((f (operation-forced (operation-ancestor operation))))
+		    (and f (or (not (consp f))
+			       (member (component-name
+					(operation-ancestor operation))
+				       (mapcar #'coerce-name f)
+				       :test #'string=)))))
+	  (let ((do-first (cdr (assoc (class-name (class-of operation))
+				      (slot-value c 'do-first)))))
+	    (loop for (required-op . deps) in do-first
+		  do (do-dep required-op deps)))
+	  (setf forced (append (delete 'pruned-op forced :key #'car)
+			       (delete 'pruned-op module-ops :key #'car)
+			       (list (cons operation c))))))
+      (setf (visiting-component operation c) nil)
+      (visit-component operation c (and forced t))
+      forced)))
+  
+
+(defmethod perform ((operation operation) (c source-file))
+  (sysdef-error
+   "~@<required method PERFORM not implemented ~
+    for operation ~A, component ~A~@:>"
+   (class-of operation) (class-of c)))
+
+(defmethod perform ((operation operation) (c module))
+  nil)
+
+(defmethod explain ((operation operation) (component component))
+  (format *verbose-out* "~&;;; ~A on ~A~%" operation component))
+
+;;; compile-op
+
+(defclass compile-op (operation)
+  ((proclamations :initarg :proclamations :accessor compile-op-proclamations :initform nil)
+   (on-warnings :initarg :on-warnings :accessor operation-on-warnings
+		:initform *compile-file-warnings-behaviour*)
+   (on-failure :initarg :on-failure :accessor operation-on-failure
+	       :initform *compile-file-failure-behaviour*)))
+
+(defmethod perform :before ((operation compile-op) (c source-file))
+  (map nil #'ensure-directories-exist (output-files operation c)))
+
+(defmethod perform :after ((operation operation) (c component))
+  (setf (gethash (type-of operation) (component-operation-times c))
+	(get-universal-time))
+  (load-preferences c operation))
+
+;;; perform is required to check output-files to find out where to put
+;;; its answers, in case it has been overridden for site policy
+(defmethod perform ((operation compile-op) (c cl-source-file))
+  #-:broken-fasl-loader
+  (let ((source-file (component-pathname c))
+        (output-file (car (output-files operation c))))
+    (multiple-value-bind (output warnings-p failure-p)
+	                 (compile-file source-file
+			               :output-file output-file)
+      ;(declare (ignore output))
+      (when warnings-p
+        (case (operation-on-warnings operation)
+          (:warn (warn
+                  "~@<COMPILE-FILE warned while performing ~A on ~A.~@:>"
+                  operation c))
+          (:error (error 'compile-warned :component c :operation operation))
+          (:ignore nil)))
+      (when failure-p
+        (case (operation-on-failure operation)
+          (:warn (warn
+                  "~@<COMPILE-FILE failed while performing ~A on ~A.~@:>"
+                  operation c))
+          (:error (error 'compile-failed :component c :operation operation))
+          (:ignore nil)))
+      (unless output
+        (error 'compile-error :component c :operation operation)))))
+
+(defmethod output-files ((operation compile-op) (c cl-source-file))
+  #-:broken-fasl-loader (list (compile-file-pathname (component-pathname c)))
+  #+:broken-fasl-loader (list (component-pathname c)))
+
+(defmethod perform ((operation compile-op) (c static-file))
+  nil)
+
+(defmethod output-files ((operation compile-op) (c static-file))
+  nil)
+
+(defmethod input-files ((op compile-op) (c static-file))
+  nil)
+
+
+;;; load-op
+
+(defclass basic-load-op (operation) ())
+
+(defclass load-op (basic-load-op) ())
+
+(defmethod perform ((o load-op) (c cl-source-file))
+  (mapcar #'load (input-files o c)))
+
+(defmethod perform ((operation load-op) (c static-file))
+  nil)
+(defmethod operation-done-p ((operation load-op) (c static-file))
+  t)
+
+(defmethod output-files ((o operation) (c component))
+  nil)
+
+(defmethod component-depends-on ((operation load-op) (c component))
+  (cons (list 'compile-op (component-name c))
+        (call-next-method)))
+
+;;; load-source-op
+
+(defclass load-source-op (basic-load-op) ())
+
+(defmethod perform ((o load-source-op) (c cl-source-file))
+  (let ((source (component-pathname c)))
+    (setf (component-property c 'last-loaded-as-source)
+          (and (load source)
+               (get-universal-time)))))
+
+(defmethod perform ((operation load-source-op) (c static-file))
+  nil)
+
+(defmethod output-files ((operation load-source-op) (c component))
+  nil)
+
+;;; FIXME: we simply copy load-op's dependencies.  this is Just Not Right.
+(defmethod component-depends-on ((o load-source-op) (c component))
+  (let ((what-would-load-op-do (cdr (assoc 'load-op
+                                           (slot-value c 'in-order-to)))))
+    (mapcar (lambda (dep)
+              (if (eq (car dep) 'load-op)
+                  (cons 'load-source-op (cdr dep))
+                  dep))
+            what-would-load-op-do)))
+
+(defmethod operation-done-p ((o load-source-op) (c source-file))
+  (if (or (not (component-property c 'last-loaded-as-source))
+	  (> (file-write-date (component-pathname c))
+	     (component-property c 'last-loaded-as-source)))
+      nil t))
+
+(defclass test-op (operation) ())
+
+(defmethod perform ((operation test-op) (c component))
+  nil)
+
+(defgeneric load-preferences (system operation)
+  (:documentation "Called to load system preferences after <perform operation system>. Typical uses are to set parameters that don't exist until after the system has been loaded."))
+
+(defgeneric preference-file-for-system/operation (system operation)
+  (:documentation "Returns the pathname of the preference file for this system. Called by 'load-preferences to determine what file to load."))
+
+(defmethod load-preferences ((s t) (operation t))
+  ;; do nothing
+  (values))
+
+(defmethod load-preferences ((s system) (operation basic-load-op))
+  (let* ((*package* (find-package :common-lisp))
+         (file (probe-file (preference-file-for-system/operation s operation))))
+    (when file 
+      (when *verbose-out*
+	(format *verbose-out* 
+		"~&~@<; ~@;loading preferences for ~A/~(~A~) from ~A~@:>~%"
+		(component-name s)
+		(type-of operation) file))
+      (load file))))
+
+(defmethod preference-file-for-system/operation ((system t) (operation t))
+  ;; cope with anything other than systems 
+  (preference-file-for-system/operation (find-system system t) operation))
+
+(defmethod preference-file-for-system/operation ((s system) (operation t))
+  (let ((*default-pathname-defaults* 
+	 (make-pathname :name nil :type nil 
+			:defaults *default-pathname-defaults*)))
+     (merge-pathnames
+      (make-pathname :name (component-name s)
+		     :type "lisp"
+		     :directory '(:relative ".asdf"))
+      (truename (user-homedir-pathname)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; invoking operations
+
+(defvar *operate-docstring* 
+  "Operate does three things:
+
+1. It creates an instance of `operation-class` using any keyword parameters 
+as initargs. 
+2. It finds the  asdf-system specified by `system` (possibly loading 
+it from disk).
+3. It then calls `traverse` with the operation and system as arguments
+
+The traverse operation is wrapped in `with-compilation-unit` and error  
+handling code. If a `version` argument is supplied, then operate also 
+ensures that the system found satisfies it using the `version-satisfies`
+method.")
+
+(defun operate (operation-class system &rest args &key (verbose t) version 
+                                &allow-other-keys)
+  (let* ((op (apply #'make-instance operation-class
+		    :original-initargs args
+		    args))
+	 (*verbose-out* (if verbose *standard-output* (make-broadcast-stream)))
+	 (system (if (typep system 'component) system (find-system system))))
+    (unless (version-satisfies system version)
+      (error 'missing-component :requires system :version version))
+    (let ((steps (traverse op system)))
+      (with-compilation-unit ()
+	(loop for (op . component) in steps do
+	     (loop
+		(restart-case 
+		    (progn (perform op component)
+			   (return))
+		  (retry ()
+		    :report
+		    (lambda (s)
+		      (format s "~@<Retry performing ~S on ~S.~@:>"
+			      op component)))
+		  (accept ()
+		    :report
+		    (lambda (s)
+		      (format s
+			      "~@<Continue, treating ~S on ~S as ~
+                               having been successful.~@:>"
+			      op component))
+		    (setf (gethash (type-of op)
+				   (component-operation-times component))
+			  (get-universal-time))
+		    (return)))))))))
+
+(setf (documentation 'operate 'function)
+      *operate-docstring*)
+
+(defun oos (operation-class system &rest args &key force (verbose t) version)
+  (declare (ignore force verbose version))
+  (apply #'operate operation-class system args))
+
+(setf (documentation 'oos 'function)
+      (format nil 
+             "Short for _operate on system_ and an alias for the `operate` function. ~&~&~a"
+      *operate-docstring*))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; syntax
+
+(defun remove-keyword (key arglist)
+  (labels ((aux (key arglist)
+	     (cond ((null arglist) nil)
+		   ((eq key (car arglist)) (cddr arglist))
+		   (t (cons (car arglist) (cons (cadr arglist)
+						(remove-keyword
+						 key (cddr arglist))))))))
+    (aux key arglist)))
+
+(defmacro defsystem (name &body options)
+  (destructuring-bind (&key pathname (class 'system) &allow-other-keys) options
+    (let ((component-options (remove-keyword :class options)))
+      `(progn
+	;; system must be registered before we parse the body, otherwise
+	;; we recur when trying to find an existing system of the same name
+	;; to reuse options (e.g. pathname) from
+	(let ((s (system-registered-p ',name)))
+	  (cond ((and s (eq (type-of (cdr s)) ',class))
+		 (setf (car s) (get-universal-time)))
+		(s
+		 #+clisp
+		 (sysdef-error "Cannot redefine the existing system ~A with a different class" s)
+		 #-clisp
+		 (change-class (cdr s) ',class))
+		(t
+		 (register-system (quote ,name)
+				  (make-instance ',class :name ',name)))))
+	(parse-component-form nil (apply
+				   #'list
+				   :module (coerce-name ',name)
+				   :pathname
+				   (or ,pathname
+				       (when *load-truename*
+					 (pathname-sans-name+type
+					  (resolve-symlinks  *load-truename*)))
+				       *default-pathname-defaults*)
+				   ',component-options))))))
+  
+
+(defun class-for-type (parent type)
+  (let* ((extra-symbols (list (find-symbol (symbol-name type) *package*)
+                              (find-symbol (symbol-name type) 
+                                           (load-time-value
+					    (package-name :asdf)))))
+         (class (dolist (symbol (if (keywordp type)
+                                    extra-symbols
+                                    (cons type extra-symbols)))
+                  (when (and symbol 
+                             (find-class symbol nil)
+                             (subtypep symbol 'component))
+                    (return (find-class symbol))))))
+    (or class
+	(and (eq type :file)
+	     (or (module-default-component-class parent)
+		 (find-class 'cl-source-file)))
+	(sysdef-error "~@<don't recognize component type ~A~@:>" type))))
+
+(defun maybe-add-tree (tree op1 op2 c)
+  "Add the node C at /OP1/OP2 in TREE, unless it's there already.
+Returns the new tree (which probably shares structure with the old one)"
+  (let ((first-op-tree (assoc op1 tree)))
+    (if first-op-tree
+	(progn
+	  (aif (assoc op2 (cdr first-op-tree))
+	       (if (find c (cdr it))
+		   nil
+		   (setf (cdr it) (cons c (cdr it))))
+	       (setf (cdr first-op-tree)
+		     (acons op2 (list c) (cdr first-op-tree))))
+	  tree)
+	(acons op1 (list (list op2 c)) tree))))
+		
+(defun union-of-dependencies (&rest deps)
+  (let ((new-tree nil))
+    (dolist (dep deps)
+      (dolist (op-tree dep)
+	(dolist (op  (cdr op-tree))
+	  (dolist (c (cdr op))
+	    (setf new-tree
+		  (maybe-add-tree new-tree (car op-tree) (car op) c))))))
+    new-tree))
+
+
+(defun remove-keys (key-names args)
+  (loop for ( name val ) on args by #'cddr
+	unless (member (symbol-name name) key-names 
+		       :key #'symbol-name :test 'equal)
+	append (list name val)))
+
+(defvar *serial-depends-on*)
+
+(defun parse-component-form (parent options)
+
+  (destructuring-bind
+	(type name &rest rest &key
+	      ;; the following list of keywords is reproduced below in the
+	      ;; remove-keys form.  important to keep them in sync
+	      components pathname default-component-class
+	      perform explain output-files operation-done-p
+	      weakly-depends-on
+	      depends-on serial in-order-to
+	      ;; list ends
+	      &allow-other-keys) options
+    (declare (ignorable perform explain output-files operation-done-p)) 
+    (check-component-input type name weakly-depends-on depends-on components in-order-to)
+
+    (when (and parent
+	     (find-component parent name)
+	     ;; ignore the same object when rereading the defsystem
+	     (not 
+	      (typep (find-component parent name)
+		     (class-for-type parent type))))	     
+      (error 'duplicate-names :name name))
+    
+    (let* ((other-args (remove-keys
+			'(components pathname default-component-class
+			  perform explain output-files operation-done-p
+			  weakly-depends-on
+			  depends-on serial in-order-to)
+			rest))
+	   (ret
+	    (or (find-component parent name)
+		(make-instance (class-for-type parent type)))))
+      (when weakly-depends-on
+	(setf depends-on (append depends-on (remove-if (complement #'find-system) weakly-depends-on))))
+      (when (boundp '*serial-depends-on*)
+	(setf depends-on
+	      (concatenate 'list *serial-depends-on* depends-on)))      
+      (apply #'reinitialize-instance
+	     ret
+	     :name (coerce-name name)
+	     :pathname pathname
+	     :parent parent
+	     other-args)
+      (when (typep ret 'module)
+	(setf (module-default-component-class ret)
+	      (or default-component-class
+		  (and (typep parent 'module)
+		       (module-default-component-class parent))))
+	(let ((*serial-depends-on* nil))
+	  (setf (module-components ret)
+		(loop for c-form in components
+		      for c = (parse-component-form ret c-form)
+		      collect c
+		      if serial
+		      do (push (component-name c) *serial-depends-on*))))
+
+	;; check for duplicate names
+	(let ((name-hash (make-hash-table :test #'equal)))
+	  (loop for c in (module-components ret)
+		do
+		(if (gethash (component-name c)
+			     name-hash)
+		    (error 'duplicate-names
+			   :name (component-name c))
+		  (setf (gethash (component-name c)
+				 name-hash)
+			t)))))
+      
+      (setf (slot-value ret 'in-order-to)
+	    (union-of-dependencies
+	     in-order-to
+	     `((compile-op (compile-op , at depends-on))
+	       (load-op (load-op , at depends-on))))
+	    (slot-value ret 'do-first) `((compile-op (load-op , at depends-on))))
+      
+      (%remove-component-inline-methods ret rest)
+
+      ret)))
+
+(defun %remove-component-inline-methods (ret rest)
+  (loop for name in +asdf-methods+
+     do (map 'nil
+	     ;; this is inefficient as most of the stored
+	     ;; methods will not be for this particular gf n
+	     ;; But this is hardly performance-critical
+	     (lambda (m)
+	       (remove-method (symbol-function name) m))
+	     (component-inline-methods ret)))
+  ;; clear methods, then add the new ones
+  (setf (component-inline-methods ret) nil)
+  (loop for name in +asdf-methods+
+     for v = (getf rest (intern (symbol-name name) :keyword))
+     when v do
+     (destructuring-bind (op qual (o c) &body body) v
+       (pushnew
+	(eval `(defmethod ,name ,qual ((,o ,op) (,c (eql ,ret)))
+			  , at body))
+	(component-inline-methods ret)))))
+
+(defun check-component-input (type name weakly-depends-on depends-on components in-order-to)
+  "A partial test of the values of a component."
+  (when weakly-depends-on (warn "We got one! XXXXX"))
+  (unless (listp depends-on)
+    (sysdef-error-component ":depends-on must be a list."
+			    type name depends-on))
+  (unless (listp weakly-depends-on)
+    (sysdef-error-component ":weakly-depends-on must be a list."
+			    type name weakly-depends-on))
+  (unless (listp components)
+    (sysdef-error-component ":components must be NIL or a list of components."
+			    type name components))
+  (unless (and (listp in-order-to) (listp (car in-order-to)))
+    (sysdef-error-component ":in-order-to must be NIL or a list of components."
+			   type name in-order-to)))
+
+(defun sysdef-error-component (msg type name value)
+  (sysdef-error (concatenate 'string msg
+			     "~&The value specified for ~(~A~) ~A is ~W")
+		type name value))
+
+(defun resolve-symlinks (path)
+  #-allegro (truename path)
+  #+allegro (excl:pathname-resolve-symbolic-links path)
+  )
+
+;;; optional extras
+
+;;; run-shell-command functions for other lisp implementations will be
+;;; gratefully accepted, if they do the same thing.  If the docstring
+;;; is ambiguous, send a bug report
+
+(defun run-shell-command (control-string &rest args)
+  "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and
+synchronously execute the result using a Bourne-compatible shell, with
+output to *VERBOSE-OUT*.  Returns the shell's exit code."
+  (let ((command (apply #'format nil control-string args)))
+    (format *verbose-out* "; $ ~A~%" command)
+    #+sbcl
+    (sb-ext:process-exit-code
+     (sb-ext:run-program  
+      #+win32 "sh" #-win32 "/bin/sh"
+      (list  "-c" command)
+      #+win32 #+win32 :search t
+      :input nil :output *verbose-out*))
+    
+    #+(or cmu scl)
+    (ext:process-exit-code
+     (ext:run-program  
+      "/bin/sh"
+      (list  "-c" command)
+      :input nil :output *verbose-out*))
+
+    #+allegro
+    (excl:run-shell-command command :input nil :output *verbose-out*)
+    
+    #+lispworks
+    (system:call-system-showing-output
+     command
+     :shell-type "/bin/sh"
+     :output-stream *verbose-out*)
+    
+    #+clisp				;XXX not exactly *verbose-out*, I know
+    (ext:run-shell-command  command :output :terminal :wait t)
+
+    #+openmcl
+    (nth-value 1
+	       (ccl:external-process-status
+		(ccl:run-program "/bin/sh" (list "-c" command)
+				 :input nil :output *verbose-out*
+				 :wait t)))
+    #+ecl ;; courtesy of Juan Jose Garcia Ripoll
+    (si:system command)
+    #-(or openmcl clisp lispworks allegro scl cmu sbcl ecl)
+    (error "RUN-SHELL-PROGRAM not implemented for this Lisp")
+    ))
+
+
+(defgeneric hyperdocumentation (package name doc-type))
+(defmethod hyperdocumentation ((package symbol) name doc-type)
+  (hyperdocumentation (find-package package) name doc-type))
+
+(defun hyperdoc (name doc-type)
+  (hyperdocumentation (symbol-package name) name doc-type))
+
+(defun system-source-file (system-name)
+  (let ((system (asdf:find-system system-name)))
+    (make-pathname 
+     :type "asd"
+     :name (asdf:component-name system)
+     :defaults (asdf:component-relative-pathname system))))
+
+(defun system-source-directory (system-name)
+  (make-pathname :name nil
+                 :type nil
+                 :defaults (system-source-file system-name)))
+
+(defun system-relative-pathname (system pathname &key name type)
+  (let ((directory (pathname-directory pathname)))
+    (when (eq (car directory) :absolute)
+      (setf (car directory) :relative))
+    (merge-pathnames
+     (make-pathname :name (or name (pathname-name pathname))
+                    :type (or type (pathname-type pathname))
+                    :directory directory)
+     (system-source-directory system))))
+
+
+(pushnew :asdf *features*)
+
+#+sbcl
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (when (sb-ext:posix-getenv "SBCL_BUILDING_CONTRIB")
+    (pushnew :sbcl-hooks-require *features*)))
+
+#+(and sbcl sbcl-hooks-require)
+(progn
+  (defun module-provide-asdf (name)
+    (handler-bind ((style-warning #'muffle-warning))
+      (let* ((*verbose-out* (make-broadcast-stream))
+	     (system (asdf:find-system name nil)))
+	(when system
+	  (asdf:operate 'asdf:load-op name)
+	  t))))
+
+  (defun contrib-sysdef-search (system)
+    (let ((home (sb-ext:posix-getenv "SBCL_HOME")))
+      (when home
+        (let* ((name (coerce-name system))
+               (home (truename home))
+               (contrib (merge-pathnames
+                         (make-pathname :directory `(:relative ,name)
+                                        :name name
+                                        :type "asd"
+                                        :case :local
+                                        :version :newest)
+                         home)))
+          (probe-file contrib)))))
+  
+  (pushnew
+   '(let ((home (sb-ext:posix-getenv "SBCL_HOME")))
+      (when home
+        (merge-pathnames "site-systems/" (truename home))))
+   *central-registry*)
+  
+  (pushnew
+   '(merge-pathnames ".sbcl/systems/"
+     (user-homedir-pathname))
+   *central-registry*)
+  
+  (pushnew 'module-provide-asdf sb-ext:*module-provider-functions*)
+  (pushnew 'contrib-sysdef-search *system-definition-search-functions*))
+
+(provide 'asdf)
+

Added: branches/trunk-reorg/thirdparty/asdf/asdf.texinfo
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/asdf.texinfo	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/asdf.texinfo	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,1286 @@
+\input texinfo          @c -*- texinfo -*-
+ at c %**start of header
+ at setfilename asdf.info
+ at settitle asdf Manual
+ at c %**end of header
+
+ at c for install-info
+ at dircategory Software development
+ at direntry
+* asdf: (asdf).           another system definition facility
+ at end direntry
+
+ at copying
+This manual describes asdf, a system definition facility for Common
+Lisp programs and libraries.
+     
+asdf Copyright @copyright{} 2001-2007 Daniel Barlow and contributors
+
+This manual Copyright @copyright{} 2001-2007 Daniel Barlow and
+contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+``Software''), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ at end copying
+
+
+
+ at titlepage
+ at title asdf: another system definition facility
+     
+ at c The following two commands start the copyright page.
+ at page
+ at vskip 0pt plus 1filll
+ at insertcopying
+ at end titlepage
+     
+ at c Output the table of contents at the beginning.
+ at contents
+
+ at c -------------------
+
+ at ifnottex
+
+ at node Top, Using asdf to load systems, (dir), (dir)
+ at top asdf: another system definition facility
+     
+ at insertcopying
+
+ at menu
+* Using asdf to load systems::  
+* Defining systems with defsystem::  
+* The object model of asdf::    
+* Error handling::              
+* Compilation error and warning handling::  
+* Miscellaneous additional functionality::
+* Getting the latest version::  
+* TODO list::                   
+* missing bits in implementation::  
+* Inspiration::                 
+* Concept Index::               
+* Function and Class Index::    
+* Variable Index::              
+
+ at detailmenu
+ --- The Detailed Node Listing ---
+
+Defining systems with defsystem
+
+* The defsystem form::          
+* A more involved example::     
+* The defsystem grammar::       
+
+The object model of asdf
+
+* Operations::                  
+* Components::                  
+
+Operations
+
+* Predefined operations of asdf::  
+* Creating new operations::     
+
+Components
+
+* Common attributes of components::  
+* Pre-defined subclasses of component::  
+* Creating new component types::  
+
+properties
+
+* Pre-defined subclasses of component::  
+* Creating new component types::  
+
+ at end detailmenu
+ at end menu
+
+ at end ifnottex
+
+ at c -------------------
+
+
+ at node  Using asdf to load systems, Defining systems with defsystem, Top, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Using asdf to load systems
+ at cindex system directory designator
+ at vindex *central-registry*
+
+This chapter describes how to use asdf to compile and load ready-made
+Lisp programs and libraries.
+
+ at section Downloading asdf
+
+Some Lisp implementations (such as SBCL and OpenMCL) come with asdf
+included already, so you don't need to download it separately.
+Consult your Lisp system's documentation.  If you need to download
+asdf and install it by hand, the canonical source is the cCLan CVS
+repository at
+ at url{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/cclan/asdf/}.
+
+ at section Setting up asdf
+
+The single file @file{asdf.lisp} is all you need to use asdf normally.
+Once you load it in a running Lisp, you're ready to use asdf.  For
+maximum convenience you might want to have asdf loaded whenever you
+start your Lisp implementation, for example by loading it from the
+startup script or dumping a custom core -- check your Lisp
+implementation's manual for details.
+
+The variable @code{asdf:*central-registry*} is a list of ``system
+directory designators''@footnote{When we say ``directory'' here, we
+mean ``designator for a pathname with a supplied DIRECTORY
+component''.}.  A @dfn{system directory designator} is a form which
+will be evaluated whenever a system is to be found, and must evaluate
+to a directory to look in.  You might want to set or augment
+ at code{*central-registry*} in your Lisp init file, for example:
+
+ at lisp
+(setf asdf:*central-registry*
+  (list* '*default-pathname-defaults*
+         #p"/home/me/cl/systems/"
+         #p"/usr/share/common-lisp/systems/"
+         asdf:*central-registry*))
+ at end lisp
+
+ at section Setting up a system to be loaded
+
+To compile and load a system, you need to ensure that a symbolic link to its
+system definition is in one of the directories in
+ at code{*central-registry*}@footnote{It is possible to customize the
+system definition file search.  That's considered advanced use, and
+covered later: search forward for
+ at code{*system-definition-search-functions*}.  @xref{Defining systems
+with defsystem}.}.
+
+For example, if @code{#p"/home/me/cl/systems/"} (note the trailing
+slash) is a member of @code{*central-registry*}, you would set up a
+system @var{foo} that is stored in a directory
+ at file{/home/me/src/foo/} for loading with asdf with the following
+commands at the shell (this has to be done only once):
+
+ at example
+$ cd /home/me/cl/systems/
+$ ln -s ~/src/foo/foo.asd .
+ at end example
+
+ at section Loading a system
+
+The system @var{foo} is loaded (and compiled, if necessary) by
+evaluating the following form in your Lisp implementation:
+
+ at example
+(asdf:operate 'asdf:load-op '@var{foo})
+ at end example
+
+Output from asdf and asdf extensions are supposed to be sent to the CL
+stream @code{*standard-output*}, and so rebinding that stream around
+calls to @code{asdf:operate} should redirect all output from asdf
+operations.
+
+That's all you need to know to use asdf to load systems written by
+others.  The rest of this manual deals with writing system
+definitions for Lisp software you write yourself.
+
+ at node   Defining systems with defsystem, The object model of asdf, Using asdf to load systems, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Defining systems with defsystem
+
+This chapter describes how to use asdf to define systems and develop
+software.
+
+
+ at menu
+* The defsystem form::          
+* A more involved example::     
+* The defsystem grammar::       
+* Other code in .asd files::
+ at end menu
+
+ at node  The defsystem form, A more involved example, Defining systems with defsystem, Defining systems with defsystem
+ at comment  node-name,  next,  previous,  up
+ at section The defsystem form
+
+Systems can be constructed programmatically by instantiating
+components using make-instance.  Most of the time, however, it is much
+more practical to use a static @code{defsystem} form.  This section
+begins with an example of a system definition, then gives the full
+grammar of @code{defsystem}.
+
+Let's look at a simple system.  This is a complete file that would
+usually be saved as @file{hello-lisp.asd}:
+
+ at lisp
+(defpackage hello-lisp-system
+  (:use :common-lisp :asdf))
+
+(in-package :hello-lisp-system)
+
+(defsystem "hello-lisp"
+    :description "hello-lisp: a sample Lisp system."
+    :version "0.2"
+    :author "Joe User <joe@@example.com>"
+    :licence "Public Domain"
+    :components ((:file "packages")
+                 (:file "macros" :depends-on ("packages"))
+                 (:file "hello" :depends-on ("macros"))))
+ at end lisp
+
+Some notes about this example:
+
+ at itemize
+
+ at item
+The file starts with @code{defpackage} and @code{in-package} forms to
+make and use a package expressly for defining this system in.  This
+package is named by taking the system name and suffixing
+ at code{-system} - note that it is @emph{not} the same package as you
+will use for the application code.
+
+This is not absolutely required by asdf, but helps avoid namespace
+pollution and so is considered good form. 
+
+ at item
+The defsystem form defines a system named "hello-lisp" that contains
+three source files: @file{packages}, @file{macros} and @file{hello}.
+
+ at item
+The file @file{macros} depends on @file{packages} (presumably because
+the package it's in is defined in @file{packages}), and the file
+ at file{hello} depends on @file{macros} (and hence, transitively on
+ at file{packages}).  This means that asdf will compile and load
+ at file{packages} and @file{macros} before starting the compilation of
+file @file{hello}.
+
+
+ at item
+The files are located in the same directory as the file with the
+system definition.  asdf resolves symbolic links before loading the system
+definition file and stores its location in the resulting
+system at footnote{It is possible, though almost never necessary, to
+override this behaviour.}.  This is a good thing because the user can
+move the system sources without having to edit the system definition.
+
+ at end itemize
+
+ at node  A more involved example, The defsystem grammar, The defsystem form, Defining systems with defsystem
+ at comment  node-name,  next,  previous,  up
+ at section A more involved example
+
+Let's illustrate some more involved uses of @code{defsystem} via a
+slightly convoluted example:
+
+ at lisp
+(defsystem "foo"
+  :version "1.0"
+  :components ((:module "foo" :components ((:file "bar") (:file"baz") 
+                                           (:file "quux"))
+	        :perform (compile-op :after (op c)
+			  (do-something c))
+		:explain (compile-op :after (op c)
+			  (explain-something c)))
+               (:file "blah")))
+ at end lisp
+
+The method-form tokens need explaining: essentially, this part:
+
+ at lisp
+	        :perform (compile-op :after (op c)
+			  (do-something c))
+		:explain (compile-op :after (op c)
+			  (explain-something c))
+ at end lisp
+
+has the effect of
+
+ at lisp
+(defmethod perform :after ((op compile-op) (c (eql ...)))
+	   (do-something c))
+(defmethod explain :after ((op compile-op) (c (eql ...)))
+	   (explain-something c))
+ at end lisp
+
+where @code{...} is the component in question; note that although this
+also supports @code{:before} methods, they may not do what you want
+them to -- a @code{:before} method on perform @code{((op compile-op) (c
+(eql ...)))}  will run after all the dependencies and sub-components
+have been processed, but before the component in question has been
+compiled.
+
+ at node  The defsystem grammar,  Other code in .asd files, A more involved example, Defining systems with defsystem
+ at comment  node-name,  next,  previous,  up
+ at section The defsystem grammar
+
+ at verbatim
+system-definition := ( defsystem system-designator {option}* )
+
+option := :components component-list
+        | :pathname pathname
+        | :default-component-class
+        | :perform method-form 
+        | :explain method-form
+	| :output-files  method-form
+        | :operation-done-p method-form
+        | :depends-on ( {simple-component-name}* ) 
+	| :serial [ t | nil ]
+        | :in-order-to ( {dependency}+ )
+
+component-list := ( {component-def}* )
+                
+component-def  := simple-component-name
+                | ( component-type name {option}* )
+
+component-type := :module | :file | :system | other-component-type
+
+dependency := (dependent-op {requirement}+)
+requirement := (required-op {required-component}+)
+             | (feature feature-name)
+dependent-op := operation-name
+required-op := operation-name | feature
+ at end verbatim
+
+ at subsection Serial dependencies
+
+If the @code{:serial t} option is specified for a module, asdf will add
+dependencies for each each child component, on all the children
+textually preceding it.  This is done as if by @code{:depends-on}.
+
+ at lisp
+:components ((:file "a") (:file "b") (:file "c"))
+:serial t
+ at end lisp
+
+is equivalent to
+
+ at lisp
+:components ((:file "a") 
+	     (:file "b" :depends-on ("a"))
+	     (:file "c" :depends-on ("a" "b")))
+ at end lisp
+
+
+ at subsection Source location
+
+The @code{:pathname} option is optional in all cases for systems
+defined via @code{defsystem}, and in the usual case the user is
+recommended not to supply it.
+
+Instead, asdf follows a hairy set of rules that are designed so that
+ at enumerate
+ at item @code{find-system} will load a system from disk and have its pathname
+default to the right place
+ at item this pathname information will not be
+overwritten with @code{*default-pathname-defaults*} (which could be
+somewhere else altogether) if the user loads up the @file{.asd} file
+into his editor and interactively re-evaluates that form.
+ at end enumerate
+
+If a system is being loaded for the first time, its top-level pathname
+will be set to:
+
+ at itemize
+ at item The host/device/directory parts of @code{*load-truename*}, if it is bound
+ at item @code{*default-pathname-defaults*}, otherwise
+ at end itemize
+
+If a system is being redefined, the top-level pathname will be
+
+ at itemize
+ at item
+changed, if explicitly supplied or obtained from
+ at code{*load-truename*} (so that an updated source location is
+reflected in the system definition)
+ at item
+changed if it had previously been set from
+ at code{*default-pathname-defaults*}
+ at item
+left as before, if it had previously been set from
+ at code{*load-truename*} and @code{*load-truename*} is currently
+unbound (so that a developer can evaluate a @code{defsystem} form from
+within an editor without clobbering its source location)
+ at end itemize
+
+ at node Other code in .asd files, , The defsystem grammar, Defining systems with defsystem
+ at section Other code in .asd files
+
+Files containing defsystem forms are regular Lisp files that are
+executed by @code{load}.  Consequently, you can put whatever Lisp code
+you like into these files (e.g., code that examines the compile-time
+environment and adds appropriate features to @code{*features*}).
+However, some conventions should be followed, so that users can
+control certain details of execution of the Lisp in .asd files:
+
+ at itemize
+ at item
+Any informative output (other than warnings and errors, which are the
+condition system's to dispose of) should be sent to the standard CL
+stream @code{*standard-output*}, so that users can easily control the
+disposition of output from asdf operations.
+ at end itemize
+
+
+ at node The object model of asdf, Error handling, Defining systems with defsystem, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter The object model of asdf
+
+asdf is designed in an object-oriented way from the ground up.  Both a
+system's structure and the operations that can be performed on systems
+follow a protocol.  asdf is extensible to new operations and to new
+component types.  This allows the addition of behaviours: for example,
+a new component could be added for Java JAR archives, and methods
+specialised on @code{compile-op} added for it that would accomplish the
+relevant actions.
+
+This chapter deals with @emph{components}, the building blocks of a
+system, and @emph{operations}, the actions that can be performed on a
+system.
+
+
+
+ at menu
+* Operations::                  
+* Components::                  
+ at end menu
+
+ at node  Operations, Components, The object model of asdf, The object model of asdf
+ at comment  node-name,  next,  previous,  up
+ at section Operations
+ at cindex operation
+
+An @dfn{operation} object of the appropriate type is instantiated
+whenever the user wants to do something with a system like
+
+ at itemize
+ at item compile all its files
+ at item load the files into a running lisp environment
+ at item copy its source files somewhere else
+ at end itemize
+
+Operations can be invoked directly, or examined to see what their
+effects would be without performing them.  @emph{FIXME: document how!}  There
+are a bunch of methods specialised on operation and component type
+that actually do the grunt work.
+
+The operation object contains whatever state is relevant for this
+purpose (perhaps a list of visited nodes, for example) but primarily
+is a nice thing to specialise operation methods on and easier than
+having them all be EQL methods.
+
+Operations are invoked on systems via @code{operate}.
+
+ at deffn {Generic function} operate operation system &rest initargs
+ at deffnx {Generic function} oos operation system &rest initargs
+ at code{operate} invokes @var{operation} on @var{system}.  @code{oos}
+is a synonym for @code{operate}.
+
+ at var{operation} is a symbol that is passed, along with the supplied
+ at var{initargs}, to @code{make-instance} to create the operation object.
+ at var{system} is a system designator.
+
+The initargs are passed to the @code{make-instance} call when creating
+the operation object.  Note that dependencies may cause the operation
+to invoke other operations on the system or its components: the new
+operations will be created with the same initargs as the original one.
+
+ at end deffn
+
+ at menu
+* Predefined operations of asdf::  
+* Creating new operations::     
+ at end menu
+
+ at node Predefined operations of asdf, Creating new operations, Operations, Operations
+ at comment  node-name,  next,  previous,  up
+ at subsection Predefined operations of asdf
+
+All the operations described in this section are in the @code{asdf}
+package.  They are invoked via the @code{operate} generic function.
+
+ at lisp
+(asdf:operate 'asdf:@var{operation-name} '@var{system-name} @{@var{operation-options ...}@})
+ at end lisp
+
+ at deffn Operation compile-op &key proclamations
+
+This operation compiles the specified component.  If proclamations are
+supplied, they will be proclaimed.  This is a good place to specify
+optimization settings.
+
+When creating a new component type, you should provide methods for
+ at code{compile-op}.
+
+When @code{compile-op} is invoked, component dependencies often cause
+some parts of the system to be loaded as well as compiled.  Invoking
+ at code{compile-op} does not necessarily load all the parts of the
+system, though; use @code{load-op} to load a system.
+ at end deffn
+
+ at deffn Operation load-op &key proclamations
+
+This operation loads a system.
+
+The default methods for @code{load-op} compile files before loading them.
+For parity, your own methods on new component types should probably do
+so too.
+ at end deffn
+
+ at deffn Operation load-source-op
+
+This operation will load the source for the files in a module even if
+the source files have been compiled. Systems sometimes have knotty
+dependencies which require that sources are loaded before they can be
+compiled.  This is how you do that.
+
+If you are creating a component type, you need to implement this
+operation - at least, where meaningful.
+ at end deffn
+
+ at deffn Operation test-system-version &key minimum
+
+Asks the system whether it satisfies a version requirement.
+
+The default method accepts a string, which is expected to contain of a
+number of integers separated by #\. characters.  The method is not
+recursive.  The component satisfies the version dependency if it has
+the same major number as required and each of its sub-versions is
+greater than or equal to the sub-version number required.
+
+ at lisp
+(defun version-satisfies (x y)
+  (labels ((bigger (x y)
+	     (cond ((not y) t)
+		   ((not x) nil)
+		   ((> (car x) (car y)) t)
+		   ((= (car x) (car y))
+		    (bigger (cdr x) (cdr y))))))
+    (and (= (car x) (car y))
+	 (or (not (cdr y)) (bigger (cdr x) (cdr y))))))
+ at end lisp
+
+If that doesn't work for your system, you can override it.  I hope
+you have as much fun writing the new method as @verb{|#lisp|} did
+reimplementing this one.
+ at end deffn
+
+ at deffn Operation feature-dependent-op
+
+An instance of @code{feature-dependent-op} will ignore any components
+which have a @code{features} attribute, unless the feature combination
+it designates is satisfied by @code{*features*}.  This operation is
+not intended to be instantiated directly, but other operations may
+inherit from it.
+
+ at end deffn
+
+ at node  Creating new operations,  , Predefined operations of asdf, Operations
+ at comment  node-name,  next,  previous,  up
+ at subsection Creating new operations
+
+asdf was designed to be extensible in an object-oriented fashion.  To
+teach asdf new tricks, a programmer can implement the behaviour he
+wants by creating a subclass of @code{operation}.
+
+
+asdf's pre-defined operations are in no way ``privileged'', but it is
+requested that developers never use the @code{asdf} package for
+operations they develop themselves.  The rationale for this rule is
+that we don't want to establish a ``global asdf operation name
+registry'', but also want to avoid name clashes.
+
+An operation must provide methods for the following generic functions
+when invoked with an object of type @code{source-file}:  @emph{FIXME describe
+this better}
+
+ at itemize
+
+ at item @code{output-files}
+ at item @code{perform}
+The @code{perform} method must call @code{output-files} to find out
+where to put its files, because the user is allowed to override
+ at item @code{output-files} for local policy @code{explain}
+ at item @code{operation-done-p}, if you don't like the default one
+
+ at end itemize
+
+Operations that print output should send that output to the standard
+CL stream @code{*standard-output*}, as the Lisp compiler and loader do.
+
+ at node Components,  , Operations, The object model of asdf
+ at comment  node-name,  next,  previous,  up
+ at section Components
+ at cindex component
+ at cindex system
+ at cindex system designator
+ at vindex *system-definition-search-functions*
+
+A @dfn{component} represents a source file or (recursively) a
+collection of components.  A @dfn{system} is (roughly speaking) a
+top-level component that can be found via @code{find-system}.
+
+A @dfn{system designator} is a string or symbol and behaves just like
+any other component name (including with regard to the case conversion
+rules for component names).
+
+
+ at defun find-system system-designator &optional (error-p t)
+
+Given a system designator, @code{find-system} finds and returns a
+system.  If no system is found, an error of type
+ at code{missing-component} is thrown, or @code{nil} is returned if
+ at code{error-p} is false.
+
+To find and update systems, @code{find-system} funcalls each element
+in the @code{*system-definition-search-functions*} list, expecting a
+pathname to be returned.  The resulting pathname is loaded if either
+of the following conditions is true:
+
+ at itemize
+ at item there is no system of that name in memory
+ at item the file's last-modified time exceeds the last-modified time of the
+  system in memory
+ at end itemize
+
+When system definitions are loaded from @file{.asd} files, a new
+scratch package is created for them to load into, so that different
+systems do not overwrite each others operations.  The user may also
+wish to (and is recommended to) include @code{defpackage} and
+ at code{in-package} forms in his system definition files, however, so
+that they can be loaded manually if need be.
+
+The default value of @code{*system-definition-search-functions*} is a
+function that looks in each of the directories given by evaluating
+members of @code{*central-registry*} for a file whose name is the
+name of the system and whose type is @file{asd}.  The first such file
+is returned, whether or not it turns out to actually define the
+appropriate system.  Hence, it is strongly advised to define a system
+ at var{foo} in the corresponding file @var{foo.asd}.
+ at end defun
+
+
+ at menu
+* Common attributes of components::  
+* Pre-defined subclasses of component::  
+* Creating new component types::  
+ at end menu
+
+ at node  Common attributes of components, Pre-defined subclasses of component, Components, Components
+ at comment  node-name,  next,  previous,  up
+ at subsection Common attributes of components
+
+All components, regardless of type, have the following attributes.
+All attributes except @code{name} are optional.
+
+ at subsubsection Name
+
+A component name is a string or a symbol.  If a symbol, its name is
+taken and lowercased.  The name must be a suitable value for the
+ at code{:name} initarg to @code{make-pathname} in whatever filesystem
+the system is to be found.
+
+The lower-casing-symbols behaviour is unconventional, but was selected
+after some consideration.  Observations suggest that the type of
+systems we want to support either have lowercase as customary case
+(Unix, Mac, windows) or silently convert lowercase to uppercase
+(lpns), so this makes more sense than attempting to use @code{:case
+:common} as argument to @code{make-pathname}, which is reported not to
+work on some implementations
+
+ at subsubsection Version identifier
+
+This optional attribute is used by the test-system-version
+operation. @xref{Predefined operations of asdf}.  For the default method of
+test-system-version, the version should be a string of intergers
+separated by dots, for example @samp{1.0.11}.
+
+ at subsubsection Required features
+
+Traditionally defsystem users have used reader conditionals to include
+or exclude specific per-implementation files.  This means that any
+single implementation cannot read the entire system, which becomes a
+problem if it doesn't wish to compile it, but instead for example to
+create an archive file containing all the sources, as it will omit to
+process the system-dependent sources for other systems.
+
+Each component in an asdf system may therefore specify features using
+the same syntax as #+ does, and it will (somehow) be ignored for
+certain operations unless the feature conditional is a member of
+ at code{*features*}.
+
+
+ at subsubsection Dependencies
+
+This attribute specifies dependencies of the component on its
+siblings.  It is optional but often necessary.
+
+There is an excitingly complicated relationship between the initarg
+and the method that you use to ask about dependencies
+
+Dependencies are between (operation component) pairs.  In your
+initargs for the component, you can say
+
+ at lisp
+:in-order-to ((compile-op (load-op "a" "b") (compile-op "c"))
+	      (load-op (load-op "foo")))
+ at end lisp
+
+This means the following things:
+ at itemize
+ at item
+before performing compile-op on this component, we must perform
+load-op on @var{a} and @var{b}, and compile-op on @var{c},
+ at item
+before performing @code{load-op}, we have to load @var{foo}
+ at end itemize
+
+The syntax is approximately
+
+ at verbatim
+(this-op {(other-op required-components)}+)
+
+required-components := component-name
+                     | (required-components required-components)
+
+component-name := string
+                | (:version string minimum-version-object)
+ at end verbatim
+
+Side note:
+
+This is on a par with what ACL defsystem does.  mk-defsystem is less
+general: it has an implied dependency
+
+ at verbatim
+  for all x, (load x) depends on (compile x)
+ at end verbatim
+
+and using a @code{:depends-on} argument to say that @var{b} depends on
+ at var{a} @emph{actually} means that
+
+ at verbatim
+  (compile b) depends on (load a) 
+ at end verbatim
+
+This is insufficient for e.g. the McCLIM system, which requires that
+all the files are loaded before any of them can be compiled ]
+
+End side note
+
+In asdf, the dependency information for a given component and
+operation can be queried using @code{(component-depends-on operation
+component)}, which returns a list
+
+ at lisp
+((load-op "a") (load-op "b") (compile-op "c") ...)
+ at end lisp
+
+ at code{component-depends-on} can be subclassed for more specific
+component/operation types: these need to @code{(call-next-method)} and
+append the answer to their dependency, unless they have a good reason
+for completely overriding the default dependencies
+
+(If it weren't for CLISP, we'd be using a @code{LIST} method
+combination to do this transparently.  But, we need to support CLISP.
+If you have the time for some CLISP hacking, I'm sure they'd welcome
+your fixes)
+
+ at subsubsection pathname
+
+This attribute is optional and if absent will be inferred from the
+component's name, type (the subclass of source-file), and the location
+of its parent.
+
+The rules for this inference are:
+
+(for source-files)
+ at itemize
+ at item the host is taken from the parent
+ at item pathname type is @code{(source-file-type component system)}
+ at item the pathname case option is @code{:local}
+ at item the pathname is merged against the parent
+ at end itemize
+
+(for modules)
+ at itemize
+ at item the host is taken from the parent
+ at item the name and type are @code{NIL}
+ at item the directory is @code{(:relative component-name)}
+ at item the pathname case option is @code{:local}
+ at item the pathname is merged against the parent
+ at end itemize
+
+Note that the DEFSYSTEM operator (used to create a ``top-level''
+system) does additional processing to set the filesystem location of
+the top component in that system.  This is detailed
+elsewhere, @xref{Defining systems with defsystem}.
+
+The answer to the frequently asked question "how do I create a system 
+definition where all the source files have a .cl extension" is thus
+
+ at lisp
+(defmethod source-file-type ((c cl-source-file) (s (eql (find-system 'my-sys))))
+   "cl")
+ at end lisp
+
+ at subsubsection properties
+
+This attribute is optional.
+
+Packaging systems often require information about files or systems in
+addition to that specified by asdf's pre-defined component attributes.
+Programs that create vendor packages out of asdf systems therefore
+have to create ``placeholder'' information to satisfy these systems.
+Sometimes the creator of an asdf system may know the additional
+information and wish to provide it directly.
+
+(component-property component property-name) and associated setf
+method will allow the programmatic update of this information.
+Property names are compared as if by @code{EQL}, so use symbols or
+keywords or something.
+
+ at menu
+* Pre-defined subclasses of component::  
+* Creating new component types::  
+ at end menu
+
+ at node Pre-defined subclasses of component, Creating new component types, Common attributes of components, Components
+ at comment  node-name,  next,  previous,  up
+ at subsection Pre-defined subclasses of component
+
+ at deffn Component source-file
+
+A source file is any file that the system does not know how to
+generate from other components of the system. 
+
+Note that this is not necessarily the same thing as ``a file
+containing data that is typically fed to a compiler''.  If a file is
+generated by some pre-processor stage (e.g. a @file{.h} file from
+ at file{.h.in} by autoconf) then it is not, by this definition, a source
+file.  Conversely, we might have a graphic file that cannot be
+automatically regenerated, or a proprietary shared library that we
+received as a binary: these do count as source files for our purposes.
+
+Subclasses of source-file exist for various languages.  @emph{FIXME:
+describe these.}
+ at end deffn
+
+ at deffn Component module
+
+A module is a collection of sub-components.
+
+A module component has the following extra initargs:
+
+ at itemize
+ at item
+ at code{:components} the components contained in this module
+
+ at item
+ at code{:default-component-class} All child components which don't
+specify their class explicitly are inferred to be of this type.
+
+ at item
+ at code{:if-component-dep-fails} This attribute takes one of the values
+ at code{:fail}, @code{:try-next}, @code{:ignore}, its default value is
+ at code{:fail}.  The other values can be used for implementing
+conditional compilation based on implementation @code{*features*}, for
+the case where it is not necessary for all files in a module to be
+compiled.
+
+ at item
+ at code{:serial} When this attribute is set, each subcomponent of this
+component is assumed to depend on all subcomponents before it in the
+list given to @code{:components}, i.e. all of them are loaded before
+a compile or load operation is performed on it.
+
+ at end itemize
+
+The default operation knows how to traverse a module, so most
+operations will not need to provide methods specialised on modules.
+
+ at code{module} may be subclassed to represent components such as
+foreign-language linked libraries or archive files.
+ at end deffn
+
+ at deffn Component system
+
+ at code{system} is a subclass of @code{module}.
+
+A system is a module with a few extra attributes for documentation
+purposes; these are given elsewhere.  @xref{The defsystem grammar}.
+
+Users can create new classes for their systems: the default
+ at code{defsystem} macro takes a @code{:classs} keyword
+argument.
+ at end deffn
+
+ at node  Creating new component types,  , Pre-defined subclasses of component, Components
+ at comment  node-name,  next,  previous,  up
+ at subsection Creating new component types
+
+New component types are defined by subclassing one of the existing
+component classes and specializing methods on the new component class.
+
+ at emph{FIXME: this should perhaps be explained more throughly, not only by
+example ...}
+
+As an example, suppose we have some implementation-dependent
+functionality that we want to isolate in one subdirectory per Lisp
+implementation our system supports.  We create a subclass of
+ at code{cl-source-file}:
+
+ at lisp
+(defclass unportable-cl-source-file (cl-source-file)
+    ())
+ at end lisp
+
+A hypothetical function @code{system-dependent-dirname} gives us the
+name of the subdirectory.  All that's left is to define how to
+calculate the pathname of an @code{unportable-cl-source-file}.
+
+ at lisp
+(defmethod component-pathname ((component unportable-cl-source-file))
+  (let ((pathname (call-next-method))
+        (name (string-downcase (system-dependent-dirname))))
+    (merge-pathnames
+     (make-pathname :directory (list :relative name))
+     pathname)))
+ at end lisp
+
+The new component type is used in a @code{defsystem} form in this way:
+
+ at lisp
+(defsystem :foo
+    :components
+    ((:file "packages")
+     ...
+     (:unportable-cl-source-file "threads"
+      :depends-on ("packages" ...))
+     ...
+    )
+ at end lisp
+
+ at node  Error handling, Compilation error and warning handling, The object model of asdf, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Error handling
+ at findex SYSTEM-DEFINITION-ERROR
+ at findex OPERATION-ERROR
+
+It is an error to define a system incorrectly: an implementation may
+detect this and signal a generalised instance of
+ at code{SYSTEM-DEFINITION-ERROR}.
+
+Operations may go wrong (for example when source files contain
+errors).  These are signalled using generalised instances of
+ at code{OPERATION-ERROR}.
+
+ at node  Compilation error and warning handling, Miscellaneous additional functionality, Error handling, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Compilation error and warning handling
+ at vindex *compile-file-warnings-behaviour*
+ at vindex *compile-file-errors-behavior*
+
+ASDF checks for warnings and errors when a file is compiled. The
+variables @code{*compile-file-warnings-behaviour*} and
+ at code{*compile-file-errors-behavior*} controls the handling of any
+such events. The valid values for these variables are @code{:error},
+ at code{:warn}, and @code{:ignore}.
+
+ at node  Miscellaneous additional functionality, Getting the latest version, Compilation error and warning handling, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Additional Functionality
+
+ASDF includes several additional features that are generally 
+useful for system definition and development. These include:
+
+ at enumerate
+ at item
+system-relative-pathname 
+
+It's often handy to locate a file relative to some system. The system-relative-pathname function meets this need. It takes two arguments: the name of a system and a relative pathname. It returns a pathname built from the 
+location of the system's source file and the relative pathname. For example
+
+ at lisp
+> (asdf:system-relative-pathname 'cl-ppcre "regex.data")
+#P"/repository/other/cl-ppcre/regex.data"
+ at end lisp
+
+ at item
+hyperdocumentation
+
+to be documented
+
+ at item 
+hyperdoc
+
+to be documented
+
+ at end enumerate
+
+
+ at node Getting the latest version, TODO list, Miscellaneous additional functionality, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Getting the latest version
+
+ at enumerate
+ at item
+Decide which version you want.  HEAD is the newest version and
+usually OK, whereas RELEASE is for cautious people (e.g. who already
+have systems using asdf that they don't want broken), a slightly older
+version about which none of the HEAD users have complained.
+
+ at item
+Check it out from sourceforge cCLan CVS:
+
+ at kbd{cvs -d:pserver:anonymous@@cvs.cclan.sourceforge.net:/cvsroot/cclan login}
+
+(no password: just press @key{Enter})
+ 
+ at kbd{cvs -z3 -d:pserver:anonymous@@cvs.cclan.sourceforge.net:/cvsroot/cclan co -r RELEASE asdf}
+
+or for the bleeding edge, instead
+
+ at kbd{cvs -z3 -d:pserver:anonymous@@cvs.cclan.sourceforge.net:/cvsroot/cclan co -A asdf}
+
+ at end enumerate
+
+If you are tracking the bleeding edge, you may want to subscribe to
+the cclan-commits mailing list (see
+ at url{http://sourceforge.net/mail/?group_id=28536}) to receive commit
+messages and diffs whenever changes are made.
+
+For more CVS information, look at
+ at url{http://sourceforge.net/cvs/?group_id=28536}.
+
+
+
+
+ at node  TODO list, missing bits in implementation, Getting the latest version, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter TODO list
+
+* Outstanding spec questions, things to add
+
+** packaging systems
+
+*** manual page component?
+
+** style guide for .asd files
+
+You should either use keywords or be careful with the package that you
+evaluate defsystem forms in.  Otherwise (defsystem partition ...)
+being read in the cl-user package will intern a cl-user:partition
+symbol, which will then collide with the partition:partition symbol.
+
+Actually there's a hairier packages problem to think about too.
+in-order-to is not a keyword: if you read defsystem forms in a package
+that doesn't use ASDF, odd things might happen
+
+** extending defsystem with new options
+
+You might not want to write a whole parser, but just to add options to
+the existing syntax.  Reinstate parse-option or something akin
+
+** document all the error classes
+
+** what to do with compile-file failure
+
+Should check the primary return value from compile-file and see if
+that gets us any closer to a sensible error handling strategy
+
+** foreign files
+
+lift unix-dso stuff from db-sockets
+
+** Diagnostics
+
+A ``dry run'' of an operation can be made with the following form:
+
+ at lisp
+(traverse (make-instance '<operation-name>)
+          (find-system <system-name>)
+          'explain)
+ at end lisp
+
+This uses unexported symbols.  What would be a nice interface for this
+functionality?
+
+ at node  missing bits in implementation, Inspiration, TODO list, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter missing bits in implementation
+
+** all of the above
+
+** reuse the same scratch package whenever a system is reloaded from disk
+
+** rules for system pathname defaulting are not yet implemented properly
+
+** proclamations probably aren't
+
+** when a system is reloaded with fewer components than it previously
+   had, odd things happen
+
+we should do something inventive when processing a defsystem form,
+like take the list of kids and setf the slot to nil, then transfer
+children from old to new list as they're found
+
+**  traverse may become a normal function
+
+If you're defining methods on traverse,  speak up.
+
+
+** a lot of load-op methods can be rewritten to use input-files
+
+so should be.
+
+
+** (stuff that might happen later)
+
+*** david lichteblau's patch for symlink resolution?
+
+*** Propagation of the :force option.  ``I notice that
+
+	(oos 'compile-op :araneida :force t)
+
+also forces compilation of every other system the :araneida system
+depends on.  This is rarely useful to me; usually, when I want to force
+recompilation of something more than a single source file, I want to
+recompile only one system.  So it would be more useful to have
+make-sub-operation refuse to propagate @code{:force t} to other systems, and
+propagate only something like @code{:force :recursively}.
+
+Ideally what we actually want is some kind of criterion that says to
+which systems (and which operations) a @code{:force} switch will
+propagate.
+
+The problem is perhaps that `force' is a pretty meaningless concept.
+How obvious is it that @code{load :force t} should force
+ at emph{compilation}?  But we don't really have the right dependency
+setup for the user to compile @code{:force t} and expect it to work
+(files will not be loaded after compilation, so the compile
+environment for subsequent files will be emptier than it needs to be)
+
+What does the user actually want to do when he forces?  Usually, for
+me, update for use with a new version of the lisp compiler.  Perhaps
+for recovery when he suspects that something has gone wrong.  Or else
+when he's changed compilation options or configuration in some way
+that's not reflected in the dependency graph.
+
+Other possible interface: have a 'revert' function akin to 'make clean'
+
+ at lisp
+(asdf:revert 'asdf:compile-op 'araneida) 
+ at end lisp
+
+would delete any files produced by 'compile-op 'araneida.  Of course, it
+wouldn't be able to do much about stuff in the image itself.
+
+How would this work?
+
+traverse
+
+There's a difference between a module's dependencies (peers) and its
+components (children).  Perhaps there's a similar difference in
+operations?  For example, @code{(load "use") depends-on (load "macros")} is a
+peer, whereas @code{(load "use") depends-on (compile "use")} is more of a
+`subservient' relationship.
+
+ at node  Inspiration, Concept Index, missing bits in implementation, Top
+ at comment  node-name,  next,  previous,  up
+ at chapter Inspiration
+
+ at section mk-defsystem (defsystem-3.x)
+
+We aim to solve basically the same problems as mk-defsystem does.
+However, our architecture for extensibility better exploits CL
+language features (and is documented), and we intend to be portable
+rather than just widely-ported.  No slight on the mk-defsystem authors
+and maintainers is intended here; that implementation has the
+unenviable task of supporting pre-ANSI implementations, which is 
+no longer necessary.
+
+The surface defsystem syntax of asdf is more-or-less compatible with
+mk-defsystem, except that we do not support the @code{source-foo} and
+ at code{binary-foo} prefixes for separating source and binary files, and 
+we advise the removal of all options to specify pathnames.
+
+The mk-defsystem code for topologically sorting a module's dependency
+list was very useful.
+
+ at section defsystem-4 proposal
+
+Marco and Peter's proposal for defsystem 4 served as the driver for
+many of the features in here.  Notable differences are:
+
+ at itemize
+ at item
+We don't specify output files or output file extensions as part of the
+system.  
+
+If you want to find out what files an operation would create, ask the
+operation.
+
+ at item
+We don't deal with CL packages
+
+If you want to compile in a particular package, use an in-package form
+in that file (ilisp / SLIME will like you more if you do this anyway)
+
+ at item
+There is no proposal here that defsystem does version control.  
+
+A system has a given version which can be used to check dependencies,
+but that's all.
+ at end itemize
+
+The defsystem 4 proposal tends to look more at the external features,
+whereas this one centres on a protocol for system introspection.
+
+ at section kmp's ``The Description of Large Systems'', MIT AI Memu 801
+
+Available in updated-for-CL form on the web at 
+ at url{http://world.std.com/~pitman/Papers/Large-Systems.html}
+
+In our implementation we borrow kmp's overall PROCESS-OPTIONS and
+concept to deal with creating component trees from defsystem surface
+syntax.  [ this is not true right now, though it used to be and
+probably will be again soon ]
+
+
+ at c -------------------
+
+
+ at node Concept Index, Function and Class Index, Inspiration, Top
+ at unnumbered Concept Index
+     
+ at printindex cp
+
+ at node Function and Class Index, Variable Index, Concept Index, Top
+ at unnumbered Function and Class Index
+     
+ at printindex fn
+
+ at node Variable Index,  , Function and Class Index, Top
+ at unnumbered Variable Index
+     
+ at printindex vr
+
+
+
+
+ at bye
+

Added: branches/trunk-reorg/thirdparty/asdf/cclan-package.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/cclan-package.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/cclan-package.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,5 @@
+(in-package :cl-user)
+
+(defpackage :cclan (:use #:cl #:asdf)
+	    (:export #:all-components #:write-package))
+

Added: branches/trunk-reorg/thirdparty/asdf/cclan.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/cclan.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/cclan.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,8 @@
+;;; -*- Lisp -*- 
+(defpackage :cclan-system (:use #:cl #:asdf))
+(in-package :cclan-system)
+
+(defsystem cclan
+    :version "0.1"
+    :components ((:file "cclan-package")
+		 (:file "cclan" :depends-on ("cclan-package"))))

Added: branches/trunk-reorg/thirdparty/asdf/cclan.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/cclan.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/cclan.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,99 @@
+(in-package :cclan)
+
+;;;; This file contains functions, classes etc that are not part of
+;;;; asdf itself, but extend it in various ways useful for maintainers
+;;;; of new-style cCLan packages
+
+;;;; The public interface consists of the functions whose symbols are 
+;;;; exported from the package
+
+;;;; This file does not contain references to asdf internals - or
+;;;; shouldn't, anyway.  Send bug reports
+
+    
+(defun mapappend (function list)
+  (let ((f (coerce function 'function)))
+    (loop for i in list append (funcall f i))))
+
+(defgeneric all-components (component))
+(defmethod all-components ((source-file source-file))
+  (list source-file))
+
+(defmethod all-components ((module module))
+  (cons module (mapappend #'all-components (module-components module))))
+
+(defmethod all-components ((module symbol))
+  (all-components (find-system module)))
+
+(defun cvs-tag-name (system)
+  (let* ((system (find-system system))
+	 (version (component-version system)))
+    (format nil "release_~A"  (substitute #\_ #\. version))))
+  
+(defun cvs-tag (system)
+  (let* ((system (find-system system))
+	 (directory (component-pathname system)))
+    (run-shell-command "cd ~A && cvs tag -F ~A"
+		       (namestring directory)  (cvs-tag-name system))))
+
+
+(defun write-readme-file (stream suggested-registry system-name)
+  "Write a README.install file detailing a possible sequence of commands to use the newly-untarred system."
+  (format stream "~
+1.  Make a symlink in ~W[*] pointing to the .asd file
+2.  Start your asdf-enabled lisp
+2a. Ensure that ~W[*] is in asdf:*central-registry*
+3.  At the lisp prompt, type '(asdf:operate 'asdf:load-op ~W)'. This
+    will compile and load the system into your running lisp.
+
+[*] This path (~W) is only a suggestion; the important
+thing is that asdf know where to find the .asd file.  asdf uses the
+contents of the variable ASDF:*CENTRAL-REGISTRY* to find its system
+definitions.
+
+These instructions were automatically generated by cCLan software. Use
+at your own peril.~%" suggested-registry suggested-registry system-name suggested-registry))
+
+(defun write-package (system)
+  (let* ((parent-dir
+	  (parse-namestring
+	   (format nil "/tmp/~A.~A/"
+		   #+sbcl (sb-unix:unix-getpid)
+		   #-sbcl (random 1000000)
+		   (get-internal-run-time))))
+	 (system (find-system system))
+	 (sub-dir-name
+	  (format nil "~A_~A"
+		  (component-name system) (component-version system)))
+	 (cvsroot-file
+	  (merge-pathnames "CVS/Root" (component-pathname system)))
+	 (old-pwd *default-pathname-defaults*)
+	 (*default-pathname-defaults* parent-dir))
+    (ensure-directories-exist parent-dir)
+    (cvs-tag system)
+    (and
+     (zerop (asdf:run-shell-command
+	     "cd ~A && cvs -d `cat ~A` checkout -d ~A -r ~A -kv ~A"
+	     (namestring parent-dir)
+	     (namestring cvsroot-file)
+	     sub-dir-name
+	     (cvs-tag-name system)
+	     (component-name system)))
+     (with-open-file (o (format nil "~A/INSTALL.asdf" sub-dir-name)
+			:direction :output)
+       (write-readme-file o "$HOME/lisp/systems/" (component-name system))
+       t)
+     (zerop (asdf:run-shell-command "cd ~A && tar cf ~A~A.tar ~A"
+				    (namestring parent-dir)
+				    (namestring old-pwd) sub-dir-name
+				    sub-dir-name))
+     (zerop (asdf:run-shell-command
+	     "gzip -f9  ~A~A.tar"
+	     (namestring old-pwd) sub-dir-name))
+     (format t "Now run~%  gpg -b -a  ~A~A.tar.gz~%in a shell with a tty"
+	     (namestring old-pwd) sub-dir-name))))
+
+(defun class-name-of (x)
+  (class-name (class-of x)))
+
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/CVS/Entries	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/CVS/Entries	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,12 @@
+/README.Debian/1.2/Sat Jul  2 19:58:38 2005//
+/changelog/1.61/Fri Sep 30 06:18:46 2005//
+/cl-asdf.postinst/1.6/Sun Feb  9 19:34:40 2003//
+/cl-cclan.postinst/1.5/Mon Dec  9 17:27:21 2002//
+/cl-cclan.prerm/1.5/Mon Dec  9 17:27:21 2002//
+/compat/1.2/Sat Jun  7 22:34:20 2003//
+/control/1.17/Fri Jul  1 12:03:47 2005//
+/copyright/1.2/Mon Dec  2 16:29:15 2002//
+/docs/1.1/Sun Aug 18 07:41:36 2002//
+/postinst/1.6/Wed May 25 06:23:00 2005//
+/rules/1.9/Fri Sep 30 06:18:46 2005//
+D

Added: branches/trunk-reorg/thirdparty/asdf/debian/CVS/Repository
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/CVS/Repository	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/CVS/Repository	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+asdf/debian

Added: branches/trunk-reorg/thirdparty/asdf/debian/CVS/Root
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/CVS/Root	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/CVS/Root	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+:pserver:anonymous at cclan.cvs.sourceforge.net:/cvsroot/cclan

Added: branches/trunk-reorg/thirdparty/asdf/debian/README.Debian
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/README.Debian	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/README.Debian	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,18 @@
+Debian Package cl-asdf
+----------------------
+
+This package was created for Debian by Kevin M. Rosenberg
+<kmr at debian.org> in Aug 2002.  The URL for asdf is
+http://www.telent.net/cliki/asdf. The README file has details
+about the use of asdf.
+
+To load asdf into your Lisp system, give the command
+(load "/usr/share/common-lisp/source/asdf/asdf.lisp")
+
+Additionally, there is an optional module that you can load
+with the command
+(load "/usr/share/common-lisp/source/asdf/wild-modules.lisp")
+
+This package is build using darcs-buildpackage and the darcs archives can be
+downloaded from http://people.debian.org/~pvaneynd/repository/
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/changelog
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/changelog	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/changelog	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,358 @@
+cl-asdf (1.88-1) unstable; urgency=low
+
+  * Noticed that I actually increased the version with the CVS commit
+  * Updated the standards version
+  * Remove the prepare build stuff, build through darcs
+  * Improve duplicate names test: use equal instead of equalp.
+    From a comment from Faré.
+
+ -- Peter Van Eynde <pvaneynd at debian.org>  Thu, 22 Sep 2005 12:52:31 +0200
+
+cl-asdf (1.86-5) unstable; urgency=low
+
+  * Fixed duplicate components patch to better handle reloading
+    defsystem files. Now works again with McClim. Closes: #310640
+  * Corrected dependencies.
+  * Added postinst rebuild of all clc-enabled lisps so the new version
+    actually gets loaded. 
+
+ -- Peter Van Eynde <pvaneynd at debian.org>  Wed, 25 May 2005 08:22:17 +0200
+
+cl-asdf (1.86-4) unstable; urgency=low
+
+  * My release script stripped the patch. So this should really contain the
+    patch. Damn. 
+
+ -- Peter Van Eynde <pvaneynd at debian.org>  Tue, 10 May 2005 14:17:51 +0200
+
+cl-asdf (1.86-3) unstable; urgency=low
+
+  * Now checks if components names are unique Closes: #304972, #304970
+  * Fix dependency on common-lisp-controller  Closes: #308385
+
+ -- Peter Van Eynde <pvaneynd at debian.org>  Tue, 10 May 2005 07:50:25 +0200
+
+cl-asdf (1.86-2) unstable; urgency=low
+
+  * New maintainer. (Closes: #297349: O: cl-asdf -- Another System
+    Definition Facility)
+  * Adopted by Peter Van Eynde
+
+ -- Peter Van Eynde <pvaneynd at debian.org>  Tue,  1 Mar 2005 10:11:55 +0100
+
+cl-asdf (1.86-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed,  4 Aug 2004 21:19:16 -0600
+
+cl-asdf (1.84-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 12 May 2004 12:43:58 -0600
+
+cl-asdf (1.81-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 30 Dec 2003 12:12:38 -0700
+
+cl-asdf (1.80-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri,  5 Dec 2003 14:55:43 -0700
+
+cl-asdf (1.79-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 11 Nov 2003 16:12:07 -0700
+
+cl-asdf (1.78-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu,  9 Oct 2003 16:46:38 -0600
+
+cl-asdf (1.77.2-1) unstable; urgency=low
+
+  * Don't export asdf:wild-module as can cause a full warning when
+  reloading asdf
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon, 11 Aug 2003 21:55:16 -0600
+
+cl-asdf (1.77.1-1) unstable; urgency=low
+
+  * cclan.lisp: conditionalize for sbcl (closes: 201822)
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu, 17 Jul 2003 23:30:57 -0600
+
+cl-asdf (1.77-1) unstable; urgency=low
+
+  * New upstream
+  * Add automated [cvs2cl] ChangeLog
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu, 17 Jul 2003 10:27:27 -0600
+
+cl-asdf (1.76) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu, 10 Jul 2003 16:42:48 -0600
+
+cl-asdf (1.75) unstable; urgency=low
+
+  * New upstream
+  * Use compat rather than DH_COMPAT
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu,  5 Jun 2003 00:15:11 -0600
+
+cl-asdf (1.73b) unstable; urgency=low
+
+  * Update README
+  * export two variables
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 28 May 2003 11:19:40 -0600
+
+cl-asdf (1.73) unstable; urgency=low
+
+  * Update README to mention asdf::*compile-file-warnings-behaviour*
+  (closes:194957)
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 27 May 2003 16:00:36 -0600
+
+cl-asdf (1.72) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 20 May 2003 14:07:10 -0600
+
+cl-asdf (1.71) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 13 May 2003 09:33:51 -0600
+
+cl-asdf (1.70) unstable; urgency=low
+
+  * Add another check in check-component-values.
+  * Signal a generalized instance of SYSTEM-DEFINITION-ERROR
+  from check-component-values
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue,  6 May 2003 09:32:16 -0600
+
+cl-asdf (1.69) unstable; urgency=low
+
+  * Add check-component-values function with partial checking of components
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue,  6 May 2003 08:26:11 -0600
+
+cl-asdf (1.68) unstable; urgency=low
+
+  * New upstream with 'asdf:test-op 
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 19 Mar 2003 10:16:01 -0700
+
+cl-asdf (1.66) unstable; urgency=low
+
+  * New upstream version, added changes to dependent system
+  compilations with :force option.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon, 17 Mar 2003 12:50:00 -0700
+
+cl-asdf (1.62) unstable; urgency=low
+
+  * New upstream, fixes a sbcl-specific directory name
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri,  7 Mar 2003 09:23:11 -0700
+
+cl-asdf (1.61-1) unstable; urgency=low
+
+  * New upstream, fixes 'load-source-op
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue,  4 Mar 2003 09:48:40 -0700
+
+cl-asdf (1.60-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon,  3 Mar 2003 12:40:27 -0700
+
+cl-asdf (1.59-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 14 Feb 2003 09:24:59 -0700
+
+cl-asdf (1.58-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Sun,  9 Feb 2003 11:55:03 -0700
+
+cl-asdf (1.57-1) unstable; urgency=low
+
+  * New upstream
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue,  4 Feb 2003 10:23:03 -0700
+
+cl-asdf (1.55-1) unstable; urgency=low
+
+  * New upstream.version (closes: 172074) 
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon,  9 Dec 2002 10:23:21 -0700
+
+cl-asdf (1.54-1) unstable; urgency=low
+
+  * New upstream.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri,  8 Nov 2002 07:30:41 -0700
+
+cl-asdf (1.49-1) unstable; urgency=low
+
+  * Remove clc-reregister-all-impl from postinst
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Sat,  5 Oct 2002 09:38:18 -0600
+
+cl-asdf (1.49) unstable; urgency=low
+
+  * New upstream release, fixes run-shell-command for allegro. Code
+    refactoring for run-shell-code.
+  * Support new CLC reregister command
+  
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 25 Sep 2002 23:57:23 -0600
+
+cl-asdf (1.47) unstable; urgency=low
+
+  * Return numeric exit status for openmcl's run-shell-command
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 20 Sep 2002 10:22:36 -0600
+
+cl-asdf (1.46) unstable; urgency=low
+
+  * New upstream version, adds run-shell-command for openmcl
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 20 Sep 2002 10:11:48 -0600
+
+cl-asdf (1.45) unstable; urgency=low
+
+  * Changes to improve clisp support
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 20 Sep 2002 07:12:21 -0600
+
+cl-asdf (1.44.1-1) unstable; urgency=low
+
+  * Make cclan.asd a symlink, remove :pathname keyword
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 18 Sep 2002 00:19:26 -0600
+
+cl-asdf (1.44-1) unstable; urgency=low
+
+  * New upstream version
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 17 Sep 2002 12:24:27 -0600
+
+cl-asdf (1.43-1) unstable; urgency=low
+
+  * New upstream version
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Tue, 17 Sep 2002 10:34:57 -0600
+
+cl-asdf (1.42-2) unstable; urgency=low
+
+  * Add reregister-common-lisp-implementations call when installing cl-asdf.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon, 16 Sep 2002 08:31:13 -0600
+
+cl-asdf (1.42-1) unstable; urgency=low
+
+  * Remove Depends on lisp-compiler for cl-asdf (fixes problem with
+  circular dependencies)
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Sat, 14 Sep 2002 11:59:58 -0600
+
+cl-asdf (1.42) unstable; urgency=low
+
+  * New upstream.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 13 Sep 2002 08:40:58 -0600
+
+cl-asdf (1.41) unstable; urgency=low
+
+  * Same release as 1.40, but with proper version number.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 13 Sep 2002 08:38:30 -0600
+
+cl-asdf (1.40) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 13 Sep 2002 07:31:27 -0600
+
+cl-asdf (1.39) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 11 Sep 2002 19:21:32 -0600
+
+cl-asdf (1.38) unstable; urgency=low
+
+  * New upstream version
+  * Re-add register and unregister clc-source for cclan
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 11 Sep 2002 13:39:51 -0600
+
+cl-asdf (1.35-1) unstable; urgency=low
+
+  * Comment call to register and unregister clc-source until new
+    version of clc is released. (closes: 158697)
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 28 Aug 2002 18:58:59 -0600
+
+cl-asdf (1.35) unstable; urgency=high
+
+  * New upstream version, fixes important bugs.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 28 Aug 2002 09:36:58 -0600
+
+cl-asdf (1.34) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Wed, 28 Aug 2002 07:18:57 -0600
+
+cl-asdf (0.0+cvs.2002.08.26-1) unstable; urgency=low
+
+  * Add Common Lisp Controller registration functions for cl-cclan
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon, 26 Aug 2002 04:21:32 -0600
+
+cl-asdf (0.0+cvs.2002.08.26) unstable; urgency=low
+
+  * New upstream version
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Mon, 26 Aug 2002 01:23:48 -0600
+
+cl-asdf (0.0+cvs.2002.08.22) unstable; urgency=low
+
+  * Add new binary package: cl-cclan
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Thu, 22 Aug 2002 12:43:21 -0600
+
+cl-asdf (0.0+cvs.2002.08.18) unstable; urgency=low
+
+  * New upstream version
+  * Expand description in control file.
+  * Change version numbering scheme since upstream has native debian
+  directory
+  
+ -- Kevin M. Rosenberg <kmr at debian.org>  Sat, 17 Aug 2002 14:25:33 -0600
+
+cl-asdf (0.0+cvs.2002.08.15-1) unstable; urgency=low
+
+  * Initial Release (closes: 157009)
+
+ -- Kevin M. Rosenberg <kmr at debian.org>  Fri, 16 Aug 2002 23:14:49 -0600
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/cl-asdf.postinst
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/cl-asdf.postinst	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/cl-asdf.postinst	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,45 @@
+#! /bin/sh
+# postinst script for asdf
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+#
+# quoting from the policy:
+#     Any necessary prompting should almost always be confined to the
+#     post-installation script, and should be protected with a conditional
+#     so that unnecessary prompting doesn't happen if a package's
+#     installation fails and the `postinst' is called with `abort-upgrade',
+#     `abort-remove' or `abort-deconfigure'.
+
+case "$1" in
+    configure)
+	if [ -x /usr/sbin/clc-reregister-all-impl ]; then 
+	    /usr/sbin/clc-reregister-all-impl
+	fi
+	;;
+    abort-upgrade|abort-remove|abort-deconfigure)
+	;;
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.postinst
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.postinst	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.postinst	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,41 @@
+#!/bin/sh 
+
+set -e
+
+pkg=cclan
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+#
+# quoting from the policy:
+#     Any necessary prompting should almost always be confined to the
+#     post-installation script, and should be protected with a conditional
+#     so that unnecessary prompting doesn't happen if a package's
+#     installation fails and the `postinst' is called with `abort-upgrade',
+#     `abort-remove' or `abort-deconfigure'.
+
+case "$1" in
+    configure)
+	/usr/sbin/register-common-lisp-source $pkg
+	;;
+    abort-upgrade|abort-remove|abort-deconfigure)
+	;;
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+	;;
+esac
+
+#DEBHELPER#
+
+exit 0
+
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.prerm
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.prerm	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/cl-cclan.prerm	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,36 @@
+#!/bin/sh 
+
+set -e
+
+pkg=cclan
+
+# summary of how this script can be called:
+#        * <prerm> `remove'
+#        * <old-prerm> `upgrade' <new-version>
+#        * <new-prerm> `failed-upgrade' <old-version>
+#        * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
+#        * <deconfigured's-prerm> `deconfigure' `in-favour'
+#          <package-being-installed> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    remove|upgrade|deconfigure)
+	/usr/sbin/unregister-common-lisp-source $pkg
+        ;;
+    failed-upgrade)
+        ;;
+    *)
+        echo "prerm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+
+#DEBHELPER#
+
+exit 0
+
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/compat
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/compat	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/compat	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,2 @@
+4
+4

Added: branches/trunk-reorg/thirdparty/asdf/debian/control
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/control	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/control	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,25 @@
+Source: cl-asdf
+Section: devel
+Priority: optional
+Maintainer: Peter Van Eynde <pvaneynd at debian.org>
+Build-Depends-Indep: debhelper (>> 4.0.0), cvs2cl
+Standards-Version: 3.6.2.1
+
+Package: cl-asdf
+Architecture: all
+Recommends: common-lisp-controller, sbcl | lisp-compiler
+Description: Another System Definition Facility
+ asdf provides a "make" type functions for Common Lisp packages. It
+ provides compilation and loading features for complex Lisp systems
+ with multiple modules and files. It is similar in concept to, but
+ with features different from, "defsystem" which is included in the
+ common-lisp-controller package. Unlike defsystem3 in CLC, asdf is
+ object-oriented and extensible.
+
+Package: cl-cclan
+Architecture: all
+Depends: common-lisp-controller
+Description: Comprehensive Common Lisp Archive Network
+ cclan is a tool for creating a repository of Common Lisp packages.
+ cclan utilizes asdf to automatically create installable packages for various
+ operating systems.

Added: branches/trunk-reorg/thirdparty/asdf/debian/copyright
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/copyright	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/copyright	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,37 @@
+This package was debianized by Kevin M. Rosenberg <kmr at debian.org> on
+Fri, 16 Aug 2002 23:14:49 -0600.
+
+It was downloaded from SourceForge CVS server with the below commands:
+   cvs -d:pserver:anonymous at cvs.cclan.sourceforge.net:/cvsroot/cclan login
+     (no password: just press Enter)
+    cvs -z3 -d:pserver:anonymous at cvs.cclan.sourceforge.net:/cvsroot/cclan \
+         co asdf
+
+Upstream Authors: Dan Barlow <dan at telent.net> & Contributors
+
+Copyright:
+
+(This is the MIT / X Consortium license as taken from 
+ http://www.opensource.org/licenses/mit-license.html)
+
+Copyright (c) 2001, 2002 Daniel Barlow and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/docs
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/docs	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/docs	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+README

Added: branches/trunk-reorg/thirdparty/asdf/debian/postinst
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/postinst	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/postinst	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,62 @@
+#!/bin/bash
+# postinst script for common-lisp-controller
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see /usr/share/doc/packaging-manual/
+#
+# quoting from the policy:
+#     Any necessary prompting should almost always be confined to the
+#     post-installation script, and should be protected with a conditional
+#     so that unnecessary prompting doesn't happen if a package's
+#     installation fails and the `postinst' is called with `abort-upgrade',
+#     `abort-remove' or `abort-deconfigure'.
+
+
+. /usr/share/debconf/confmodule 
+
+case "$1" in
+    configure)
+        #  We need to rebuild the images
+	for compiler in /usr/lib/common-lisp/bin/*.sh ; do
+	    if [ -f "$compiler" -a -r "$compiler" ] ; then
+		i=${compiler##*/}
+		i=${i%.sh}
+		if [ -x "$compiler" ] ; then
+		    echo Reinstalling for $i
+		    echo Recompiling Common Lisp Controller for $i
+		    bash "$compiler" install-clc || true
+		    echo
+		    echo Done rebuilding
+		fi 
+	    fi
+	done 
+	;;
+    
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 0
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+

Added: branches/trunk-reorg/thirdparty/asdf/debian/rules
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/debian/rules	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/debian/rules	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,86 @@
+#!/usr/bin/make -f
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+pkg=cl-asdf
+pkg-cclan=cl-cclan
+clc-base=usr/share/common-lisp
+clc-src=$(clc-base)/source
+clc-systems=$(clc-base)/systems
+asdf-files=$(clc-src)/asdf
+cclan-files=$(clc-src)/cclan
+doc-dir=usr/share/doc/$(pkg)
+
+configure: configure-stamp
+configure-stamp:
+	dh_testdir
+	# Add here commands to configure the package.
+	touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp 
+	dh_testdir
+	# Add here commands to compile the package.
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp configure-stamp
+	# Add here commands to clean up after the build process.
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+
+	# Add here commands to install the package into debian/asdf.
+	dh_installdirs -p $(pkg) $(asdf-files) $(doc-dir)/examples
+	dh_install -p $(pkg) asdf.lisp wild-modules.lisp asdf-install.lisp $(asdf-files)
+	chmod +x test/run-tests.sh
+	dh_install -p $(pkg) test/* $(doc-dir)/examples
+	dh_installdirs -p $(pkg-cclan) $(clc-systems) $(cclan-files)
+	dh_install -p $(pkg-cclan) cclan-package.lisp cclan.lisp cclan.asd $(cclan-files)
+	dh_link -p $(pkg-cclan) $(cclan-files)/cclan.asd $(clc-systems)/cclan.asd
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+#	dh_installdebconf	
+	dh_installdocs
+#	dh_installexamples
+	dh_installmenu
+#	dh_installlogrotate
+#	dh_installemacsen
+#	dh_installpam
+#	dh_installmime
+#	dh_installinit
+	dh_installcron
+	dh_installman
+	dh_installinfo
+#	dh_undocumented
+	dh_installchangelogs ChangeLog
+	find debian/cl-asdf -name CVS -print0 | xargs -0t rm -rf || true
+	find debian/cl-asdf -name .cvsignore -print0 | xargs -0t rm -f || true
+	dh_link
+	dh_strip
+	dh_compress
+	dh_fixperms
+#	dh_makeshlibs
+	dh_installdeb
+#	dh_perl
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure


Property changes on: branches/trunk-reorg/thirdparty/asdf/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: branches/trunk-reorg/thirdparty/asdf/test/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/CVS/Entries	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/CVS/Entries	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,33 @@
+/compile-asdf.lisp/1.1/Fri Jul 27 02:58:19 2007//
+/file1.lisp/1.2/Mon Sep  9 14:28:56 2002//
+/file2.lisp/1.1/Wed Feb 20 11:12:35 2002//
+/file3.lisp/1.2/Mon Sep  9 14:28:56 2002//
+/file4.lisp/1.1/Wed Feb 20 11:12:35 2002//
+/run-tests.sh/1.12/Thu Sep 27 13:15:06 2007//
+/script-support.lisp/1.1/Fri Jul 27 02:58:19 2007//
+/static-and-serial.asd/1.1/Fri Jul 27 02:58:19 2007//
+/test-force.asd/1.1/Tue May 30 18:14:40 2006//
+/test-force.script/1.2/Wed Jun 13 01:30:55 2007//
+/test-package.asd/1.1/Mon Aug 21 10:52:34 2006//
+/test-package.script/1.2/Wed Jun 13 01:30:55 2007//
+/test-preferences-1.lisp/1.1/Thu Jul  6 02:26:00 2006//
+/test-preferences-1.script/1.2/Wed Jun 13 01:30:55 2007//
+/test-preferences-system-1.asd/1.1/Thu Jul  6 02:26:00 2006//
+/test-preferences-system-load.lisp/1.1/Thu Jul  6 02:26:00 2006//
+/test-preferences-system-test.lisp/1.1/Thu Jul  6 02:26:00 2006//
+/test-static-and-serial.script/1.1/Fri Jul 27 02:58:19 2007//
+/test-version.script/1.2/Wed Jun 13 01:30:55 2007//
+/test1.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test1.script/1.4/Wed Jun 13 01:30:55 2007//
+/test2.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test2.script/1.4/Wed Jun 13 01:30:55 2007//
+/test2a.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test2b1.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test2b2.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test2b3.asd/1.1/Wed Feb 20 11:12:35 2002//
+/test3.asd/1.2/Mon May 20 14:16:27 2002//
+/test3.script/1.4/Wed Jun 13 01:30:55 2007//
+/test4.script/1.2/Wed Jun 13 01:30:55 2007//
+/wild-module.asd/1.2/Sun May 14 16:03:16 2006//
+/wild-module.script/1.3/Wed Jun 13 01:30:55 2007//
+D

Added: branches/trunk-reorg/thirdparty/asdf/test/CVS/Repository
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/CVS/Repository	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/CVS/Repository	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+asdf/test

Added: branches/trunk-reorg/thirdparty/asdf/test/CVS/Root
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/CVS/Root	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/CVS/Root	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1 @@
+:pserver:anonymous at cclan.cvs.sourceforge.net:/cvsroot/cclan

Added: branches/trunk-reorg/thirdparty/asdf/test/compile-asdf.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/compile-asdf.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/compile-asdf.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,18 @@
+(in-package #:common-lisp-user)
+
+(load "test/script-support.lisp")
+
+(cond ((probe-file "asdf.lisp")
+       (multiple-value-bind (result warnings-p errors-p)
+	   (compile-file "asdf.lisp")
+	 (declare (ignore result))
+	 (cond (warnings-p 
+		(leave-lisp "Testuite failed: ASDF compiled with warnings" 1))
+	       (errors-p 
+		(leave-lisp "Testuite failed: ASDF compiled with ERRORS" 2))
+	       (t
+		(leave-lisp "ASDF compiled cleanly" 0)))))
+      (t
+       (leave-lisp "Testsuite failed: unable to find ASDF source" 3)))
+       
+		     
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/file1.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/file1.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/file1.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,4 @@
+(defpackage :test-package (:use :cl))
+(in-package :test-package)
+(defvar *file1* t)
+

Added: branches/trunk-reorg/thirdparty/asdf/test/file2.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/file2.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/file2.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,2 @@
+(in-package :test-package)
+(assert *file1*)

Added: branches/trunk-reorg/thirdparty/asdf/test/file3.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/file3.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/file3.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,4 @@
+(defpackage :test-package (:use :cl))
+(in-package :test-package)
+(defvar *file3* t)
+

Added: branches/trunk-reorg/thirdparty/asdf/test/file4.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/file4.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/file4.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,2 @@
+(in-package :test-package)
+(assert *file3*)

Added: branches/trunk-reorg/thirdparty/asdf/test/run-tests.sh
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/run-tests.sh	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/run-tests.sh	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,97 @@
+#!/bin/sh
+
+# do_tests {lisp invocation} {fasl extension}
+# - read lisp forms one at a time from standard input
+# - quit with exit status 0 on getting eof
+# - quit with exit status >0 if an unhandled error occurs
+
+
+if [ -z "$2" ]; then
+    scripts="*.script"
+else
+    scripts="$2"
+fi
+
+sok=1
+
+do_tests() {
+rm *.$2 || true
+( cd .. && echo '(load "test/compile-asdf.lisp")' | $1  )
+if [ $? -eq 0 ] ; then
+    test_count=0
+    test_pass=0
+    test_fail=0
+    failed_list=""
+    for i in $scripts ; 
+    do 
+      echo "Testing: $i" >&2
+      test_count=`expr "$test_count" + 1`
+      rm *.$2 || true
+      if $1 < $i ;then
+        echo "Using $1, $i passed" >&2
+	test_pass=`expr "$test_pass" + 1`
+      else
+        echo "Using $1, $i failed" >&2
+	test_fail=`expr "$test_fail" + 1`
+	failed_list="$failed_list $i"
+        sok=0
+      fi
+    done
+    echo >&2
+    echo "Using $1" >&2
+    echo "Ran $test_count tests: " >&2
+    echo "  $test_pass passing and $test_fail failing" >&2
+    if [ $test_fail -eq 0 ] ; then
+	echo "all tests apparently successful" >&2
+    else
+	echo "failing test(s): $failed_list" >&2
+    fi
+    echo >&2
+fi
+}
+
+# terminate on error
+set -e
+
+lisp=$1
+if [ -z $1 ] ; then
+    lisp="sbcl"
+fi
+
+if [ "$lisp" = "sbcl" ] ; then 
+    if type sbcl ; then
+      fasl_ext="fasl"
+      command="sbcl --userinit /dev/null --sysinit /dev/null --noprogrammer"
+    fi
+elif [ "$lisp" = "clisp" ] ; then
+    if type clisp ; then
+	fasl_ext="fas"
+	command=`where clisp`
+	command="$command -norc -ansi -I - "
+    fi
+elif [ "$lisp" = "allegro" ] ; then
+    if type alisp ; then
+	fasl_ext="fasl"
+	command="alisp -q --batch "
+    fi
+elif [ "$lisp" = "allegromodern" ] ; then
+    if type mlisp ; then
+	fasl_ext="fasl"
+	command="mlisp -q --batch "
+    fi
+fi
+
+
+#if [ -x /usr/bin/lisp ]
+#then 
+#  do_tests "/usr/bin/lisp -batch -noinit" x86f
+#fi
+
+
+if [ -z "$command" ] ; then
+    echo "Error: don't know how to run Lisp named $lisp"
+else
+    echo $command
+    do_tests "$command" $fasl_ext
+fi
+ 

Added: branches/trunk-reorg/thirdparty/asdf/test/script-support.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/script-support.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/script-support.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,36 @@
+(in-package #:common-lisp-user)
+
+#+allegro
+(setf excl:*warn-on-nested-reader-conditionals* nil)
+
+;;; code adapted from cl-launch (any errors in transcription are mine!)
+;; http://www.cliki.net/cl-launch
+(defun leave-lisp (message return)
+  (when message
+    (format *error-output* message))
+  #+allegro
+  (excl:exit return)
+  #+clisp
+  (ext:quit return)
+  #+(or cmu scl)
+  (unix:unix-exit code)
+  #+ecl 
+  (si:quit return)
+  #+gcl
+  (lisp:quit code)
+  #+lispworks
+  (lispworks:quit :status code :confirm nil :return nil :ignore-errors-p t)
+  #+(or openmcl mcl)
+  (ccl::quit return)
+  #+sbcl
+  (sb-ext:quit :unix-status return)
+
+  (error "Don't know how to quit Lisp; wanting to use exit code ~a" return))
+
+(defmacro exit-on-error (&body body)
+  `(handler-case 
+      (progn , at body
+	     (leave-lisp "Script succeeded" 0))
+    (error (c)
+      (format *error-output* "~a" c)
+      (leave-lisp "Script failed" 1))))
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/static-and-serial.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/static-and-serial.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/static-and-serial.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,12 @@
+#|
+make sure that serial t and static-files don't cause full rebuilds all 
+the time...
+|#
+
+(defsystem static-and-serial
+  :version "0.1"
+  :serial t
+  :components
+  ((:static-file "file2.lisp")
+   (:static-file "run-tests.sh")
+   (:file "file1")))

Added: branches/trunk-reorg/thirdparty/asdf/test/test-force.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-force.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-force.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,5 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test-force
+  :components
+  ((:file "file1")))
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test-force.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-force.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-force.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,19 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+
+ (asdf:operate 'asdf:load-op 'test-force)
+ (defvar file1-date (file-write-date (compile-file-pathname "file1")))
+
+ ;; unforced, date should stay same
+ (sleep 1)
+ (asdf:operate 'asdf:load-op 'test-force)
+ (assert (= (file-write-date (compile-file-pathname "file1")) file1-date))
+
+ ;; forced, it should be later
+ (sleep 1)
+ (asdf:operate 'asdf:load-op 'test-force :force t)
+ (assert (> (file-write-date (compile-file-pathname "file1")) file1-date))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test-package.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-package.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-package.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,10 @@
+;;; NB: This way of managing packages is explicitly NOT recommended.
+;;; However, it is found in the wild, and debugging it is a pain, so
+;;; we should probably not break.  The thing that this is testing is
+;;; that unrelated definitions of symbols naming ASDF keywords should
+;;; not affect the parsing of a system.
+
+(in-package :cl-user) ; BAD BAD BAD
+
+(asdf:defsystem test-package
+  :components ((:module "foo" :components ((:file "bar") (:file "baz")))))
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test-package.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-package.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-package.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,14 @@
+(in-package :cl-user)
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+
+ (defun module () 1)
+
+ (load "test-package.asd")
+
+ (defclass module () ())
+
+ (load "test-package.asd")
+)

Added: branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,3 @@
+(in-package #:common-lisp-user)
+
+(defvar *test-preferences-variable-1* :default)

Added: branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-preferences-1.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,11 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (in-package :asdf)
+ (asdf:oos 'asdf:load-op 'test-preferences-system-1)
+ (assert (eq common-lisp-user::*test-preferences-variable-1* :load))
+ (asdf:oos 'asdf:test-op 'test-preferences-system-1)
+ (assert (eq common-lisp-user::*test-preferences-variable-1* :test))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-1.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-1.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-1.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,35 @@
+;;; -*- Lisp -*-
+(in-package #:common-lisp)
+
+(defpackage #:test-preferences-1-asdf-system 
+  (:use #:common-lisp #:asdf))
+(in-package #:asdf)
+
+(defsystem test-preferences-system-1
+  :components
+  ((:file "test-preferences-1"))
+  :in-order-to ((test-op (load-op test-preferences-system-1))))
+
+(defmethod operation-done-p 
+           ((o test-op)
+            (c (eql (find-system 'test-preferences-system-1))))
+  (values nil))
+
+(defmethod load-preferences
+           ((system (eql (find-system 'test-preferences-system-1))) 
+            (operation test-op))
+  ;; the default load-preferences does nothing for anything other than a 
+  ;; basic-load-op. So, ... we hack it
+  (load (make-pathname
+         :name "test-preferences-system-test"
+         :type "lisp"
+         :defaults *default-pathname-defaults*)))
+
+(defmethod preference-file-for-system/operation 
+           ((system (eql (find-system 'test-preferences-system-1))) 
+            (operation load-op))
+  (make-pathname
+   :name "test-preferences-system-load"
+   :type "lisp"
+   :defaults *default-pathname-defaults*))
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-load.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-load.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-load.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,3 @@
+(in-package #:common-lisp-user)
+
+(setf *test-preferences-variable-1* :load)

Added: branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-test.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-test.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-preferences-system-test.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,3 @@
+(in-package #:common-lisp-user)
+
+(setf *test-preferences-variable-1* :test)

Added: branches/trunk-reorg/thirdparty/asdf/test/test-static-and-serial.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-static-and-serial.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-static-and-serial.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,17 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+
+ (asdf:operate 'asdf:load-op 'static-and-serial)
+ (defvar file1-date (file-write-date (compile-file-pathname "file1")))
+
+ ;; cheat
+ (setf asdf::*defined-systems* (make-hash-table :test 'equal))
+  
+ ;; date should stay same
+ (sleep 1)
+ (asdf:operate 'asdf:load-op 'static-and-serial)
+ (assert (= (file-write-date (compile-file-pathname "file1")) file1-date))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test-version.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test-version.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test-version.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,31 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(setf asdf:*central-registry* '(*default-pathname-defaults*))
+
+(defpackage :test-version-system
+  (:use :cl :asdf))
+
+(in-package :test-version-system)
+
+(cl-user::exit-on-error 
+ (defsystem :versioned-system-1
+   :pathname #.*default-pathname-defaults*
+   :version "1.0")
+
+ (defsystem :versioned-system-2
+   :pathname #.*default-pathname-defaults*
+   :version "1.1")
+
+ (defsystem :versioned-system-3
+   :pathname #.*default-pathname-defaults*
+   :version "1.2")
+
+ (flet ((test (name v &optional (true t))
+	  (or (eq true (asdf::version-satisfies (find-system name) v))
+	      (error "no satisfaction: ~S version ~A not ~A" name v true))))
+   (test :versioned-system-1 "1.0")
+   (test :versioned-system-2 "1.0")
+   (test :versioned-system-3 "2.0" nil))
+
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test1.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test1.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test1.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,12 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test1	
+    :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))))
+		 (:file "file1")))
+
+#|
+1) from clean, check that all fasl files build and that some function
+   defined in the second file is present
+
+2) delete the second fasl file, and build again.  do test 1 again and
+   also check the date on file1.fasl
+|#

Added: branches/trunk-reorg/thirdparty/asdf/test/test1.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test1.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test1.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,36 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (asdf:operate 'asdf:load-op 'test1)
+
+ ;; test that it compiled
+ (defvar file1-date (file-write-date (compile-file-pathname "file1")))
+ (assert (and file1-date (file-write-date (compile-file-pathname "file2")))))
+
+;; and loaded
+(assert test-package::*file1*)
+
+(exit-on-error 
+ ;; now remove one output file and check that the other is _not_
+ ;; recompiled
+ (sleep 1) ; mtime has 1-second granularity, so pause here for fast machines
+
+ (asdf::run-shell-command "rm ~A"
+			  (namestring (compile-file-pathname "file2")))
+ (asdf:operate 'asdf:load-op 'test1)
+ (assert (= file1-date (file-write-date (compile-file-pathname "file1"))))
+ (assert (file-write-date (compile-file-pathname "file2")))
+
+ ;; now touch file1 and check that file2 _is_ also recompiled
+
+ ;; XXX run-shell-command loses if *default-pathname-defaults* is not the
+ ;; unix cwd.  this is not a problem for run-tests.sh, but can be in general
+
+ (let ((before (file-write-date (compile-file-pathname "file2"))))
+   (asdf::run-shell-command "touch file1.lisp")
+   (sleep 1)
+   (asdf:operate 'asdf:load-op 'test1)
+   (assert (>  (file-write-date (compile-file-pathname "file2")) before)))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test2.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,8 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test2b
+    :version "1.0"
+    :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))))
+		 (:file "file1"))
+    :depends-on (version 'test2a "1.1"))
+
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test2.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,22 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+					;(trace asdf::perform)
+					;(trace asdf::find-component)
+					;(trace asdf::traverse)
+ (asdf:oos 'asdf:load-op 'test2b1)
+ (assert (and (probe-file (compile-file-pathname "file3"))
+	      (probe-file (compile-file-pathname "file4"))))
+ (handler-case 
+     (asdf:oos 'asdf:load-op 'test2b2)
+   (asdf:missing-dependency (c)
+     (format t "load failed as expected: - ~%~A~%" c))
+   (:no-error (c) (error "should have failed, oops")))
+ (handler-case 
+     (asdf:oos 'asdf:load-op 'test2b3)
+   (asdf:missing-dependency (c)
+     (format t "load failed as expected: - ~%~A~%" c))
+   (:no-error (c) (error "should have failed, oops")))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/test2a.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2a.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2a.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,12 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test2a
+    :version "1.1"
+    :components ((:file "file4" :in-order-to ((compile-op (load-op "file3"))))
+		 (:file "file3")))
+#|
+this system is referenced by test2b[12]
+|#
+
+
+
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test2b1.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2b1.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2b1.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,8 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test2b1
+    :version "1.0"
+    :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))))
+		 (:file "file1"))
+    :in-order-to ((load-op (load-op (version test2a "1.1")))))
+
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test2b2.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2b2.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2b2.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,8 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test2b2
+    :version "1.0"
+    :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))))
+		 (:file "file1"))
+    :in-order-to ((load-op (load-op (version test2a "1.2")))))
+
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test2b3.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test2b3.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test2b3.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,8 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test2b3
+    :version "1.0"
+    :components ((:file "file2" :in-order-to ((compile-op (load-op "file1"))))
+		 (:file "file1"))
+    :depends-on (bet-you-cant-find-this))
+
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test3.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test3.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test3.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,11 @@
+;;; -*- Lisp -*-
+(asdf:defsystem test3
+    :properties ((:prop1 . "value"))
+    :components
+  ((:module "deps"
+	    :if-component-dep-fails :try-next
+	    :pathname "."
+	    :components
+	    ((:file "file1" :in-order-to ((compile-op (feature :f1))))
+	     (:file "file2" :in-order-to ((compile-op (feature :f2))))))))
+

Added: branches/trunk-reorg/thirdparty/asdf/test/test3.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test3.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test3.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,26 @@
+;;; -*- Lisp -*-
+#+(or f1 f2)
+    (error "This test cannot run if :f1 or :f2 are on *features*")
+(load "script-support")
+(load "../asdf")
+(in-package :asdf)
+(cl-user::exit-on-error 
+ (asdf:run-shell-command "rm ~A ~A"
+			 (namestring (compile-file-pathname "file1"))
+			 (namestring (compile-file-pathname "file2")))
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (handler-case 
+     (asdf:oos 'asdf:load-op 'test3)
+   (asdf:missing-dependency (c)
+     (format t "first test failed as expected: - ~%~A~%" c))
+   (:no-error (c) (error "should have failed, oops")))
+ (pushnew :f1 *features*)
+ (asdf:oos 'asdf:load-op 'test3)
+ (assert (probe-file (compile-file-pathname "file1")))
+ (assert (not (probe-file (compile-file-pathname "file2"))))
+ (run-shell-command "rm ~A" (namestring (compile-file-pathname "file1")))
+ (setf *features* (cons :f2 (cdr *features*)))
+ (asdf:oos 'asdf:load-op 'test3)
+ (assert (probe-file (compile-file-pathname "file2")))
+ (assert (not (probe-file (compile-file-pathname "file1"))))
+ )

Added: branches/trunk-reorg/thirdparty/asdf/test/test4.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/test4.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/test4.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,12 @@
+;;; -*- Lisp -*-
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(in-package :asdf)
+(cl-user::exit-on-error 
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (assert (not (component-property (find-system 'test3) :foo)))
+ (assert (equal (component-property (find-system 'test3) :prop1) "value"))
+ (setf (component-property (find-system 'test3) :foo) "bar")
+ (assert (equal (component-property (find-system 'test3) :foo) "bar"))
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/test/wild-module.asd
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/wild-module.asd	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/wild-module.asd	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,5 @@
+;;; -*- Lisp -*-
+
+(asdf:defsystem :wild-module
+  :version "0.0"
+  :components ((:wild-module "systems" :pathname "*.asd")))

Added: branches/trunk-reorg/thirdparty/asdf/test/wild-module.script
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/test/wild-module.script	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/test/wild-module.script	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,11 @@
+;;; -*- Lisp -*-
+(load "script-support")
+(load "../asdf")
+(exit-on-error 
+
+ (load "../asdf")
+ (load "../wild-modules")
+
+ (setf asdf:*central-registry* '(*default-pathname-defaults*))
+ (asdf:operate 'asdf:load-op 'wild-module)
+ )
\ No newline at end of file

Added: branches/trunk-reorg/thirdparty/asdf/wild-modules.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/asdf/wild-modules.lisp	2007-10-14 19:12:46 UTC (rev 2235)
+++ branches/trunk-reorg/thirdparty/asdf/wild-modules.lisp	2007-10-14 19:13:17 UTC (rev 2236)
@@ -0,0 +1,38 @@
+(in-package :asdf)
+
+(defclass wild-module (module)
+  ((component-class :accessor wild-module-component-class
+                    :initform 'static-file :initarg :component-class)
+   (component-options :accessor wild-module-component-options
+                      :initform nil :initarg :component-options)))
+
+(defmethod (setf module-components) (new-value (module wild-module))
+  (when  new-value
+    (sysdef-error "Cannot explicitly set wild-module ~A's components. Please ~
+use a wild pathname instead." module)))
+
+(defmethod reinitialize-instance :after ((self wild-module) &key)
+  (let ((pathname (slot-value self 'relative-pathname)))
+    (and pathname
+         (not (wild-pathname-p pathname))
+         (sysdef-error "Wild-module ~A specified with non-wild pathname ~A."
+                       self pathname))
+    (setf (slot-value self 'components)
+          (let* ((*default-pathname-defaults* (component-parent-pathname self))
+                 (files (directory (merge-pathnames (component-relative-pathname self))))
+                 (class (wild-module-component-class self))
+                 (options (wild-module-component-options self)))
+            (mapcar (lambda (file)
+                      (apply #'make-instance class
+                             :name (file-namestring file)
+                                        ;; XXX fails when wildcards are in
+                                        ;; the directory or higher parts.
+                             :pathname file
+                             :parent self
+                             options))
+                    files)))))
+
+;; Don't export wild-module or else will get a full warning
+;; when (require 'asdf) if asdf is already loaded
+
+;;(export '(wild-module))




More information about the Bknr-cvs mailing list