asdf:defsystem
(asdf:defsystem name &rest options)
Defines a system — a named collection of source files with load-order constraints — for a later asdf:load-system, and returns the system name as a symbol. This is a limited, API-compatible subset of ASDF's defsystem: the options are plain data and are never evaluated. name is a literal designator (a string "my-lib", a keyword :my-lib, or a symbol). Supported options:
- Metadata —
:description,:long-description,:version,:author,:maintainer,:license(also:licence),:homepage,:bug-tracker,:source-control,:mailto— accepted for.asdcompatibility and ignored, except that a:versionwritten as a plain string is read back byasdf:component-version(a computed spelling such as(:read-file-form "version.sexp")is never evaluated and answers nil). :depends-on (system...)— systems loaded before this one, located through the same search path asload-system.:defsystem-depends-on (system...)— systems real ASDF loads while the.asdis being read, so they are located the same way and loaded before:depends-on. They are not dependencies of the system (they never appear inasdf:component-sideway-dependencies). A built-in shim system named here also announces its features to this system::defsystem-depends-on ("trivial-features")is what puts:unixand:little-endianin force while this system's own clauses and component files are read. A third-party system announces nothing — it would have to run, and a.asdis data here.:serial t— each component implicitly depends on the previous one.:pathname "dir"— a directory prefix for every component of the system, so the components can be named bare ((:file "main")under:pathname "src"issrc/main.lisp). A literal namestring only; an empty string adds no directory level. A:moduleprefix and a component-level:pathnamenest inside it.:components (component...)— the source files:(:file "name" [:depends-on ("other"...)] [:pathname "file.lisp"])namesname.lisp;(:module "dir" [:serial t] [:depends-on (...)] [:pathname "other-dir"] :components (...))prefixes its children withdir/;(:static-file "name")is accepted and contributes no source. A component may also carry:if-feature expr, which keeps its place in the load order but contributes no source when the feature expression does not hold. Components are loaded in a stable topological order of their:depends-onconstraints.:class :package-inferred-system— the system has no:componentsat all and its graph is derived from the sources: a sub-system name is a file path under the system's directory (my-lib/util/textisutil/text.lisp, below:pathnamewhen the system has one), and that file's leadingdefpackagenames its dependencies. See the Systems guide. No other:classis supported.
The test-op wiring options :in-order-to and :perform are tolerated and ignored (there is no test-op/operate machinery to drive). Any other option (:around-compile, a computed :pathname, ...) or component type is an error naming the unsupported clause. Normally the form lives in a NAME.asd file next to the sources; a .asd file is parsed as data, so it may contain only defsystem forms (bare or asdf:-qualified), in-package/defpackage forms (skipped), register-system-packages forms (which record "this package lives in that system", read when a package-inferred system turns a defpackage dependency into a system name) and top-level defparameters of pure literal values. An inline top-level (asdf:defsystem ...) in a program also registers the system. Component paths resolve against the directory of the .asd file (or of the defining source).
;; my-lib.asd
(defsystem :my-lib
:description "A small example system"
:version "0.1.0"
:serial t
:components ((:file "package")
(:file "main")))
The system loads package.lisp then main.lisp (:serial t), both from the directory of my-lib.asd. See the Systems guide for a complete project walkthrough.