ASDF: Another System Definition Facility
What is ASDF?
ASDF is the de facto standard build facility for Common Lisp.
Your Lisp implementation probably contains a copy of ASDF,
which you can load using (require "asdf")
.
If you come from the C/C++ world, ASDF covers a bit of what each of
make
, autoconf
, dlopen
and libc
do for C programs:
it orchestrates the compilation and dependency management,
handles some of the portability issues, dynamically finds and loads code,
and offers some portable system access library.
Except everything is different in Common Lisp, and ultimately much simpler,
though it requires acquiring some basic concepts.
Importantly, ASDF builds all software in the current Lisp image,
as opposed to building software into separate processes.
Where to find ASDF?
ASDF's home page contains more information and additional links, and can be found at: https://common-lisp.net/project/asdf/
The one and only official source control repository is at: https://gitlab.common-lisp.net/asdf/asdf
The one and only official bug tracker is at: https://bugs.launchpad.net/asdf
How to use ASDF?
To use ASDF, read our manual: http://common-lisp.net/project/asdf/asdf.html
The first few sections, Loading ASDF, Configuring ASDF and Using ASDF, will get you started as a simple user. If you want to define your own systems, further read the section Defining systems with defsystem.
The manual is also in the doc/ subdirectory, and can be prepared with:
make doc
ASDF 3 now includes an extensive runtime support library: UIOP, the Utilities for Implementation- and OS- Portability. Its documentation unhappily lies mainly in the source code and docstrings. See uiop/README.md for an introduction.
Quick Start
Just use (require "asdf")
to load your implementation-provided ASDF.
If it is recent enough (3.0 or later, check its (asdf:asdf-version)
),
then it will automatically upgrade to the ASDF provided as source code,
assuming the source code in under a path registered by the source-registry.
If it isn't present or isn't recent enough, we recommend you install a recent
ASDF release using tools/install-asdf.lisp
Building and testing it
First, make sure ASDF is checked out under a path registered by the source-registry, if that isn't the case yet (see the manual). One place would be:
~/.local/share/common-lisp/source/asdf/
or, assuming your implementation provides ASDF 3.1 or later:
~/common-lisp/asdf/
If you cloned our git repository, bootstrap a copy of build/asdf.lisp
with:
make
Before you may run tests, you need a few CL libraries. The simplest way to get them is as follows, but read below:
make ext
The above make target uses git submodule update --init
to download
all these libraries using git. If you don't otherwise maintain your
own set of carefully controlled CL libraries, that's what you want to use.
However, if you do maintain your own set of carefully controlled CL libraries
then you will want to use whichever tools you use (e.g. quicklisp
, clbuild
,
or your own scripts around git
) to download these libraries:
alexandria
, closer-mop
, cl-ppcre
, fare-mop
, fare-quasiquote
,
fare-utils
, inferior-shell
, lisp-invocation
, named-readtables
, optima
.
If you are a CL developer, you may already have them, or may want
to use your own tools to download a version of them you control.
If you use Quicklisp, you may let
Quicklisp download those you don't have.
In these cases, you do NOT want to use the git submodules from make ext
.
Otherwise, if you want to let ASDF download known-working versions
of its dependencies, you can do it with:
make ext
To run all the tests on your favorite Lisp implementation $L
,
choose your most elaborate installed system $S
, and try:
make t u l=$L s=$S
Debugging tip
To interactively debug ASDF, you may load it in such a way that M-.
will work,
by installing the source code, and running:
(asdf:load-system :uiop) ;; loading uiop is simple
(map () 'load ;; loading asdf/defsystem is tricky
(mapcar 'asdf:component-pathname
(asdf::required-components :asdf/defsystem :keep-component 'asdf:cl-source-file)))
Note that the above can be adapted in a general recipe to get all the files in a system, in order.
To also have the files in systems it transitively depends on, add the :other-systems t
keyword
argument to the call to asdf::required-components
.
What has changed?
You can consult the debian/changelog for an overview of the
significant changes in each release, and
the git log
for a detailed description of each commit.
How do I navigate this source tree?
-
- The system definition for building ASDF with ASDF.
-
*.lisp
- The source code files for
asdf/defsystem
. See asdf.asd for the order in which they are loaded.
- The source code files for
-
- Utilities of Implementation- and OS- Portability, the portability layer of ASDF. It has its own README, and functions all have docstrings.
-
- a
Makefile
for bootstrap and development purposes.
- a
-
- Some scripts to help ASDF users
- load-asdf.lisp -- a build script to load, configure and use ASDF
- install-asdf.lisp -- replace and update an implementation's ASDF
- cl-source-registry-cache.lisp -- update a cache for the source-registry
- Some scripts to help ASDF users
-
- The system definition for building ASDF with XCVB. It hasn't been tested or maintained for years and has bitrotten.
-
-
The current version. Bumped up every time the code changes, using:
./tools/asdf-builder bump
-
-
- documentation for ASDF, including:
- index.html -- the web page for http://common-lisp.net/project/asdf/
- asdf.texinfo -- our manual
- Makefile -- how to build the manual
- cclan.png lisp-logo120x80.png style.css favicon.ico -- auxiliaries of index.html
- documentation for ASDF, including:
-
- regression test scripts (and ancillary files) for developers to check that they don't unintentionally break any of the functionality of ASDF. Far from covering all of ASDF.
-
- a few contributed files that show case how to use ASDF.
-
- files for packaging on Debian, Ubuntu, etc.
-
- where the
Makefile
andasdf-tools
store their output files, including-
asdf.lisp
-- the current one-file deliverable of ASDF -
asdf-XXX.lisp
-- for upgrade test purposes, old versions -
results/
-- logs of tests that have been run -
fasls/
-- output files while running tests.
-
- where the
-
- external dependencies, that can be populated with
make ext
or equivalently withgit submodule update --init
. Depopulate it withmake noext
.
- external dependencies, that can be populated with
-
- this file
-
- plenty of ideas for how to further improve ASDF.
Last updated Saturday, September 19th, 2015.