asdf-package-system
asdf-package-system is an extension to ASDF3 whereby every file is its own system, and starts with a defpackage from which dependencies are deduced.

To use asdf-package-system, see the example from lisp-interface-library: at the top of your hierarchy, say foo.com, you'd have a file foo.com.asd that contains:

(in-package :asdf)
#-asdf3 (error "LIL requires ASDF 3 or later. Please upgrade your ASDF.")
(defsystem :foo.com
  :description "Software from foo.com"
  :class :package-system
  :defsystem-depends-on
  #.(unless (find-class :package-system nil) '(:asdf-package-system))
  :depends-on (:foo.com/bar/all)
  :in-order-to ((test-op (load-op :foo.com/test/all)))
  :perform (test-op (o c) (symbol-call :foo.com/test/all :test-suite)))

(register-system-packages :foo.com/bar/all '(:foo-bar))
(register-system-packages :closer-mop
 '(:c2mop :closer-common-lisp :c2cl :closer-common-lisp-user :c2cl-user))

The latter declarations tell asdf-package-system that package foo-bar is to be found in system foo.com/bar/all, and package closer-common-lisp is to be found in system closer-mop.

Then, in bar/all.lisp, you'd have a file that starts with

(uiop:defpackage :foo.com/bar/all
   (:nicknames :foo-bar)
   (:use :cl :cl-ppcre :uiop)
   (:use-reexport :foo.com/bar/utilities :foo.com/bar/frob :foo.com/bar/main))

And ASDF would detect that it depends on the packages that it uses, while uiop:defpackage would import all the symbols from the given packages and reexport them, but use those from cl, cl-ppcre and uiop without reexporting.

See http://common-lisp.net/gitweb?p=projects/asdf/asdf-package-system.git

asdf-package-system is directly inspired by Alastair Bridgewater's quick-build, itself similar to Peter von Etter's faslpath. It will hopefully be released as part of ASDF 3.0.4 or 3.1 or whatever follows ASDF 3.0.3. Yet, this package will remain for backward compatibility until that feature is universally available.