/usr/share/doc/cl-asdf/asdf/The-package_002dinferred_002dsystem-extension.html is in cl-asdf 2:3.1.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This manual describes ASDF, a system definition facility
for Common Lisp programs and libraries.
You can find the latest version of this manual at
http://common-lisp.net/project/asdf/asdf.html.
ASDF Copyright (C) 2001-2014 Daniel Barlow and contributors.
This manual Copyright (C) 2001-2014 Daniel Barlow and contributors.
This manual revised (C) 2009-2014 Robert P. Goldman and Francois-Rene Rideau.
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.
-->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>ASDF Manual: The package-inferred-system extension</title>
<meta name="description" content="ASDF Manual: The package-inferred-system extension">
<meta name="keywords" content="ASDF Manual: The package-inferred-system extension">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Defining-systems-with-defsystem.html#Defining-systems-with-defsystem" rel="up" title="Defining systems with defsystem">
<link href="The-object-model-of-ASDF.html#The-object-model-of-ASDF" rel="next" title="The object model of ASDF">
<link href="Other-code-in-_002easd-files.html#Other-code-in-_002easd-files" rel="prev" title="Other code in .asd files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="The-package_002dinferred_002dsystem-extension"></a>
<div class="header">
<p>
Previous: <a href="Other-code-in-_002easd-files.html#Other-code-in-_002easd-files" accesskey="p" rel="prev">Other code in .asd files</a>, Up: <a href="Defining-systems-with-defsystem.html#Defining-systems-with-defsystem" accesskey="u" rel="up">Defining systems with defsystem</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="The-package_002dinferred_002dsystem-extension-1"></a>
<h3 class="section">6.5 The package-inferred-system extension</h3>
<p>Starting with release 3.1.2,
ASDF supports a one-package-per-file style of programming,
whereby each file is its own system,
and dependencies are deduced from the <code>defpackage</code> form
(or its variant <code>uiop:define-package</code>).
</p>
<p>In this style, packages refer to a system with the same name (downcased);
and if a system is defined with <code>:class package-inferred-system</code>,
then system names that start with that name
(using the slash <code>/</code> separator)
refer to files under the filesystem hierarchy where the system is defined.
For instance, if system <code>my-lib</code> is defined in
<samp>/foo/bar/my-lib/my-lib.asd</samp>, then system <code>my-lib/src/utility</code>
will be found in file <samp>/foo/bar/my-lib/src/utility.lisp</samp>.
</p>
<p>This style was made popular by <code>faslpath</code> and <code>quick-build</code> before,
and at the cost of a stricter package discipline,
seems to make for more maintainable code.
It is used by ASDF itself (starting with ASDF 3) and by <code>lisp-interface-library</code>.
</p>
<p>To use this style, choose a toplevel system name, e.g. <code>my-lib</code>,
and create a file <samp>my-lib.asd</samp>
with the <code>:class :package-inferred-system</code> option in its <code>defsystem</code>.
For instance:
</p><div class="example">
<pre class="example">#-asdf3 (error "my-lib requires ASDF 3")
(defsystem my-lib
:class :package-inferred-system
:defsystem-depends-on (:asdf-package-system)
:depends-on (:my-lib/interface/all
:my-lib/src/all
:my-lib/extras/all)
:in-order-to ((test-op (load-op :my-lib/test/all)))
:perform (test-op (o c) (symbol-call :my-lib/test/all :test-suite)))
(defsystem :my-lib/test :depends-on (:my-lib/test/all))
(register-system-packages :my-lib/interface/all '(:my-lib-interface))
(register-system-packages :my-lib/src/all '(:my-lib-implementation))
(register-system-packages :my-lib/test/all '(:my-lib-test))
(register-system-packages
:closer-mop
'(:c2mop :closer-common-lisp :c2cl :closer-common-lisp-user :c2cl-user))
</pre></div>
<p>In the code above, the
<code>:defsystem-depends-on (:asdf-package-system)</code> is
for compatibility with older versions of ASDF 3 (ASDF 2 is not supported),
and requires the <code>asdf-package-system</code> library to be present
(it is implicitly provided by ASDF starting with release 3.1.2,
which can be detected with the feature <code>:asdf3.1</code>).
</p>
<p>The function <code>register-system-packages</code> has to be called to register
packages used or provided by your system and its components
where the name of the system that provides the package
is not the downcase of the package name.
</p>
<p>Then, file <samp>interface/order.lisp</samp> under the <code>lil</code> hierarchy,
that defines abstract interfaces for order comparisons,
starts with the following form,
dependencies being trivially computed from the <code>:use</code> and <code>:mix</code> clauses:
</p>
<div class="example">
<pre class="example">(uiop:define-package :lil/interface/order
(:use :closer-common-lisp
:lil/interface/definition
:lil/interface/base
:lil/interface/eq :lil/interface/group)
(:mix :fare-utils :uiop :alexandria)
(:export ...))
</pre></div>
<p>ASDF can tell that this file depends on system <code>closer-mop</code> (registered above),
<code>lil/interface/definition</code>, <code>lil/interface/base</code>,
<code>lil/interface/eq</code>, and <code>lil/interface/group</code>
(package and system names match, and they will be looked up hierarchically).
</p>
<p>ASDF also detects dependencies from <code>:import-from</code> clauses.
You may thus import a well-defined set of symbols from an existing package
as loaded from suitably named system;
or if you prefer to use any such symbol fully qualified by a package prefix,
you may declare a dependency on such a package and its corresponding system
via an <code>:import-from</code> clause with an empty list of symbols, as in:
</p>
<div class="example">
<pre class="example">(defpackage :foo/bar
(:use :cl)
(:import-from :foo/baz #:sym1 #:sym2)
(:import-from :foo/quux)
(:export ...))
</pre></div>
<p>The form <code>uiop:define-package</code> is supported as well as <code>defpackage</code>,
and has many options that prove useful in this context,
such as <code>:use-reexport</code> and <code>:mix-reexport</code>
that allow for “inheritance” of symbols being exported.
</p>
<hr>
<div class="header">
<p>
Previous: <a href="Other-code-in-_002easd-files.html#Other-code-in-_002easd-files" accesskey="p" rel="prev">Other code in .asd files</a>, Up: <a href="Defining-systems-with-defsystem.html#Defining-systems-with-defsystem" accesskey="u" rel="up">Defining systems with defsystem</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|