Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
asdf
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Hugo Ishimaru
asdf
Commits
335d386d
Commit
335d386d
authored
Jul 24, 2014
by
Francois-Rene Rideau
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into minimakefile
Conflicts: Makefile bin/asdf-builder
parents
fe3d1afc
f6c62d75
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
459 additions
and
177 deletions
+459
-177
asdf.asd
asdf.asd
+1
-1
cache.lisp
cache.lisp
+14
-4
debian/changelog
debian/changelog
+17
-2
debian/copyright
debian/copyright
+4
-2
doc/asdf.texinfo
doc/asdf.texinfo
+153
-24
doc/index.html
doc/index.html
+6
-1
find-component.lisp
find-component.lisp
+4
-4
find-system.lisp
find-system.lisp
+60
-69
header.lisp
header.lisp
+1
-1
interface.lisp
interface.lisp
+6
-3
operate.lisp
operate.lisp
+4
-2
test/dll-test.lisp
test/dll-test.lisp
+2
-2
test/monodll-1.lisp
test/monodll-1.lisp
+2
-2
test/monodll.lisp
test/monodll.lisp
+2
-2
test/script-support.lisp
test/script-support.lisp
+11
-9
test/test-cache.script
test/test-cache.script
+35
-0
test/test-try-refinding.script
test/test-try-refinding.script
+83
-0
test/test-utilities.script
test/test-utilities.script
+2
-0
uiop/configuration.lisp
uiop/configuration.lisp
+1
-1
uiop/image.lisp
uiop/image.lisp
+22
-22
uiop/os.lisp
uiop/os.lisp
+5
-2
uiop/package.lisp
uiop/package.lisp
+1
-1
uiop/pathname.lisp
uiop/pathname.lisp
+1
-1
upgrade.lisp
upgrade.lisp
+21
-21
version.lisp-expr
version.lisp-expr
+1
-1
No files found.
asdf.asd
View file @
335d386d
...
...
@@ -75,7 +75,7 @@
:licence
"MIT"
:description
"Another System Definition Facility"
:long-description
"ASDF builds Common Lisp software organized into defined systems."
:version
"3.1.
2.4
"
;; to be automatically updated by make bump-version
:version
"3.1.
3
"
;; to be automatically updated by make bump-version
:depends-on
()
#+
asdf3
:encoding
#+
asdf3
:utf-8
:class
#.
(
if
(
find-class
'package-inferred-system
nil
)
'package-inferred-system
'system
)
...
...
cache.lisp
View file @
335d386d
...
...
@@ -5,8 +5,9 @@
(
:use
:uiop/common-lisp
:uiop
:asdf/upgrade
)
(
:export
#:get-file-stamp
#:compute-file-stamp
#:register-file-stamp
#:set-asdf-cache-entry
#:unset-asdf-cache-entry
#:consult-asdf-cache
#:do-asdf-cache
#:normalize-namestring
#:call-with-asdf-cache
#:with-asdf-cache
#:*asdf-cache*
))
#:do-asdf-cache
#:normalize-namestring
#:call-with-asdf-cache
#:with-asdf-cache
#:*asdf-cache*
#:clear-configuration-and-retry
#:retry
))
(
in-package
:asdf/cache
)
;;; This stamp cache is useful for:
...
...
@@ -42,8 +43,17 @@
(
let
((
fun
(
if
key
#'
(
lambda
()
(
consult-asdf-cache
key
thunk
))
thunk
)))
(
if
(
and
*asdf-cache*
(
not
override
))
(
funcall
fun
)
(
let
((
*asdf-cache*
(
make-hash-table
:test
'equal
)))
(
funcall
fun
)))))
(
loop
(
restart-case
(
let
((
*asdf-cache*
(
make-hash-table
:test
'equal
)))
(
return
(
funcall
fun
)))
(
retry
()
:report
(
lambda
(
s
)
(
format
s
(
compatfmt
"~@<Retry ASDF operation.~@:>"
))))
(
clear-configuration-and-retry
()
:report
(
lambda
(
s
)
(
format
s
(
compatfmt
"~@<Retry ASDF operation after resetting the configuration.~@:>"
)))
(
clear-configuration
)))))))
(
defmacro
with-asdf-cache
((
&key
key
override
)
&body
body
)
`
(
call-with-asdf-cache
#'
(
lambda
()
,@
body
)
:override
,
override
:key
,
key
))
...
...
debian/changelog
View file @
335d386d
cl-asdf (2:3.1.2-1) unstable; urgency=low
cl-asdf (2:3.1.3-1) unstable; urgency=low
Bug fix release:
* A bug in 3.1.2 caused errors when hot-upgrading from 3.1.2 ASDF.
* Fix bugs in ASDF component search caching. In some circumstances,
aggressive caching (particularly of negative results) interfered with
error-handling through restarts. Also, in some cases use of caching
interfered with error-checking. Some of these issues are discussed in
ticket #1335323 on launchpad.
* Miscellaneous bug fixes and tweaks to UIOP.
* Documentation improvements.
-- Francois-Rene Rideau <fare@tunes.org> Thu, 24 Jul 2014 12:48:29 -0400
cl-asdf (2:3.1.2-2) unstable; urgency=low
New release:
* ~/common-lisp/ is now present by default in the source-registry, so
...
...
@@ -56,7 +70,8 @@ cl-asdf (2:3.1.2-1) unstable; urgency=low
* Substantially rewritten, updated, and expanded manual.
* TODO updated.
-- Robert P Goldman <rpgoldman@sift.info> Tue, 6 May 2014 10:54:29 -0500
-- Francois-Rene Rideau <fare@tunes.org> Mon, 19 May 2014 20:07:40 -0400
cl-asdf (2:3.0.3-1) unstable; urgency=low
...
...
debian/copyright
View file @
335d386d
...
...
@@ -7,7 +7,8 @@ maintained the debian package as part of the upstream git repository at
The debian related changes and files are licensed according to the GPL-v2, see
/usr/share/common-licenses/GPL-2
Upstream Authors: Dan Barlow <dan@telent.net> & Contributors
Upstream Authors: Dan Barlow <dan@telent.net>, Francois-Rene Rideau
(fare@tunes.org), Robert P. Goldman (rpgoldman@sift.net) & Contributors.
Copyright:
...
...
@@ -15,7 +16,8 @@ Copyright:
http://www.opensource.org/licenses/mit-license.html on or about
Monday; July 13, 2009)
Copyright (c) 2001-2014 Daniel Barlow and contributors
Copyright (c) 2001-2014 Daniel Barlow, Francois-Rene Rideau, Robert P. Goldman,
and contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
...
...
doc/asdf.texinfo
View file @
335d386d
...
...
@@ -903,6 +903,7 @@ For that you may use the following function:
regarding source-registry or output-translations.
@end defun
@vindex *image-dump-hook*
This function is pushed onto the @code
{
uiop:*image-dump-hook*
}
by default,
which means that if you save an image using @code
{
uiop:dump-image
}
,
or via @code
{
asdf:image-op
}
and @code
{
asdf:program-op
}
,
...
...
@@ -2382,25 +2383,150 @@ the file's @code{last-modified} time exceeds the @code{last-modified} time
of the system in memory
@end itemize
@cindex ASDF-USER package
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 @code
{
in-package
}
forms
in his system definition files, however,
so that they can be loaded manually if need be.
they are implicitly loaded into the @code
{
ASDF-USER
}
package,
which uses @code
{
ASDF
}
, @code
{
UIOP
}
and @code
{
UIOP/COMMON-LISP
}
@footnote
{
Note that between releases 2.27 and 3.0.3, only @code
{
UIOP/PACKAGE
}
,
not all of @code
{
UIOP
}
, was used; if you want your code to work
with releases earlier than 3.1.2, you may have to explicitly define a package
that uses @code
{
UIOP
}
, or use proper package prefix to your symbols, as in
@code
{
uiop:version<
}
.
}
Programmers who do anything non-trivial in a @file
{
.asd
}
file,
such as defining new variables, functions or classes,
should include @code
{
defpackage
}
and @code
{
in-package
}
forms in this file,
so they will not overwrite each others' extensions.
Such forms might also help the files behave identically
if loaded manually with @code
{
cl:load
}
for development or debugging,
though we recommend you use the function @code
{
asdf::load-asd
}
instead,
which the @code
{
slime-asdf
}
contrib knows about.
The default value of @code
{
*system-definition-search-functions*
}
is a list of t
wo
functions.
is a list of t
hree
functions.
The first function 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
}
.
T
he first such file is returned,
for a file whose name is the name of the system and whose type is @file
{
asd
}
;
t
he first such file is returned,
whether or not it turns out to actually define the appropriate system.
The second function does something similar,
for the directories specified in the @code
{
source-registry
}
.
Hence, it is strongly advised to define a system
@var
{
foo
}
in the corresponding file @var
{
foo.asd
}
.
for the directories specified in the @code
{
source-registry
}
,
but searches the filesystem only once and caches its results.
The third function makes the @code
{
package-inferred-system
}
extension work,
@pxref
{
The package-inferred-system extension
}
.
Because of the way these search functions are defined,
you should put the definition for a system
@var
{
foo
}
in a file named @file
{
foo.asd
}
,
in a directory that is
in the central registry or
which can be found using the
source registry configuration.
@c FIXME: Move this discussion to the system definition grammar, or somewhere else.
@anchor
{
System names
}
@cindex System names
@cindex Primary system name
@findex primary-system-name
It is often useful to define multiple systems in a same file,
but ASDF can only locate a system's definition file based on the system
name.
For this reason,
ASDF 3's system search algorithm has been extended to
allow a file @file
{
foo.asd
}
to contain
secondary systems named @var
{
foo/bar
}
, @var
{
foo/baz
}
, @var
{
foo/quux
}
, etc.,
in addition to the primary system named @var
{
foo
}
.
The first component of a system name,
separated by the slash character, @code
{
/
}
,
is called the primary name of a system.
The primary name may be
extracted by function @code
{
asdf::primary-system-name
}
;
when ASDF 3 is told to find a system whose name has a slash,
it will first attempt to load the corresponding primary system,
and will thus see any such definitions, and/or any
definition of a @code
{
package-inferred-system
}
.@footnote
{
ASDF 2.26 and earlier versions
do not support this primary system name convention.
With these versions of ASDF
you must explicitly load @file
{
foo.asd
}
before you can use system @var
{
foo/bar
}
defined therein,
e.g. using @code
{
(asdf:find-system "foo")
}
.
We do not support ASDF 2, and recommend that you should upgrade to ASDF 3.
}
If your file @file
{
foo.asd
}
also defines systems
that do not follow this convention, e.g., a system named @var
{
foo-test
}
,
ASDF will not be able to automatically locate a definition for these systems,
and will only see their definition
if you explicitly find or load the primary system
using e.g. @code
{
(asdf:find-system "foo")
}
before you try to use them.
We strongly recommend against this practice,
though it is currently supported for backward compatibility.
@end defun
@defun primary-system-name name
Internal (not exported) function, @code
{
asdf::primary-system-name
}
.
Returns the primary system name (the portion before
the slash, @code
{
/
}
, in a secondary system name) from @var
{
name
}
.
@end defun
@defun locate-system name
This function should typically @emph
{
not
}
be invoked directly. It is
exported as part of the API only for programmers who wish to provide
their own @code
{
*system-definition-search-functions*
}
.
Given a system @var
{
name
}
designator,
try to locate where to load the system definition from.
@c (This does not include the loading of the system definition,
@c which is done by @code
{
find-system
}
,
@c or the loading of the system itself, which is done by @code
{
load-system
}
;
@c however, for systems the definition of which has already been loaded,
@c @code
{
locate-system
}
may return an object of class @code
{
system
}
.)
Returns five values: @var
{
foundp
}
, @var
{
found-system
}
, @var
{
pathname
}
,
@var
{
previous
}
, and @var
{
previous-time
}
.
@var
{
foundp
}
is true when a system was found,
either a new as yet unregistered one, or a previously registered one.
The @var
{
found-system
}
return value
will be a @code
{
system
}
object, if a system definition is found in your
source registry.
@c This system may be registered (by @code
{
register-system
}
) or may not, if
@c it's preloaded code. Fare writes:
@c In the case of preloaded code, as for "asdf", "uiop", etc.,
@c themselves, the system objects are not registered until after they are
@c initially located by sysdef-preloaded-system-search as a fallback when
@c no source code was found.
The system definition will @emph
{
not
}
be
loaded if it hasn't been loaded already.
@var
{
pathname
}
when not null is a path from which to load the system,
either associated with @var
{
found-system
}
, or with the @var
{
previous
}
system.
If @var
{
previous
}
is not null, it will be a @emph
{
previously loaded
}
@code
{
system
}
object of the same name (note that the system
@emph
{
definition
}
is previously-loaded: the system itself may or may not be).
@var
{
previous-time
}
when not null is
the timestamp of the previous system definition file, at the
time when the @var
{
previous
}
system definition was loaded.
For example, if your current registry has @file
{
foo.asd
}
in
@file
{
/current/path/to/foo.asd
}
,
but system @code
{
foo
}
was previously loaded from @file
{
/previous/path/to/foo.asd
}
then @var
{
locate-system
}
will return the following values:
@enumerate
@item
@var
{
foundp
}
will be @code
{
T
}
,
@item
@var
{
found-system
}
will be @code
{
NIL
}
,
@item
@var
{
pathname
}
will be @code
{
#p"/current/path/to/foo.asd"
}
,
@item
@var
{
previous
}
will be an object of type @code
{
SYSTEM
}
with
@code
{
system-source-file
}
slot value of
@code
{
#p"/previous/path/to/foo.asd"
}
@item
@var
{
previous-time
}
will be the timestamp of
@code
{
#p"/previous/path/to/foo.asd"
}
at the time it was loaded.
@end enumerate
@end defun
@defun find-component base path
...
...
@@ -2719,8 +2845,8 @@ the default @code{defsystem} macro takes a @code{:class} keyword argument.
New component types are defined by subclassing one of the existing
component classes and specializing methods on the new component class.
@
emph
{
FIXME: this should perhaps be explained more throughly,
not only by example ...
}
@
c
FIXME: this should perhaps be explained more throughly,
@c not only by example ...
As an example, suppose we have some implementation-dependent
functionality that we want to isolate
...
...
@@ -2763,10 +2889,10 @@ The new component type is used in a @code{defsystem} form in this way:
@c FIXME: Moved this material here, but it isn't very comfortable
@c here.... Also needs to be revised to be coherent.
To be successfully build
able, this graph of actions bu
t be acyclic.
If, as a user, extender or implementer of ASDF, you
fail
to keep the dependency graph without cycles
,
ASDF will fail loudly
as it eventually finds one
.
To be successfully build
-able, this graph of actions mus
t be acyclic.
If, as a user, extender or implementer of ASDF, you
introduce
a cycle into the dependency graph
,
ASDF will fail loudly.
To clearly distinguish the direction of dependencies,
ASDF 3 uses the words @emph
{
requiring
}
and @emph
{
required
}
as applied to an action depending on the other:
...
...
@@ -2957,7 +3083,7 @@ however we recommend you instead use
our source-registry configuration mechanism described below,
because it is easier to setup in a portable way across users and implementations.
Addtionally, some people dislike truename,
Add
i
tionally, some people dislike truename,
either because it is very slow on their system, or
because they are using content-addressed storage where the truename of a file
is related to a digest of its individual contents,
...
...
@@ -3245,9 +3371,9 @@ directory according to X's (relative) instructions.
When considering environment variable @code
{
CL
_
SOURCE
_
REGISTRY
}
ASDF will skip to next configuration if it's an empty string.
It will @code
{
READ
}
the string as a SEXP in the DSL
if it begins with a paren @code
{
(
}
and it will be interpreted much like @code
{
TEXINPUTS
}
list of paths, where
if it begins with a paren @code
{
(
}
,
otherwise it will be interpreted much like @code
{
TEXINPUTS
}
,
as a
list of paths, where
* paths are separated
by a @code
{
:
}
(colon) on Unix platforms (including cygwin),
...
...
@@ -3703,7 +3829,7 @@ TRANSLATION-FUNCTION :=
SYMBOL | ;; symbol naming a function that takes two arguments:
;; the pathname to be translated and the matching
;; DIRECTORY
-
DESIGNATOR
LAMBDA ;; A form which evalu
t
ates to a function taking two arguments:
LAMBDA ;; A form which evaluates to a function taking two arguments:
;; the pathname to be translated and the matching
;; DIRECTORY
-
DESIGNATOR
...
...
@@ -3764,7 +3890,7 @@ from the file specified.
If the @code
{
translate
-
pathname
}
mechanism cannot achieve a desired
translation, the user may provide a function which provides the
required algorith
i
m. Such a translation function is specified by
required algorithm. Such a translation function is specified by
supplying a list as the second @code
{
directory
-
designator
}
the first element of which is the keyword @code
{
:function
}
,
and the second element of which is
...
...
@@ -5607,3 +5733,6 @@ Also, bugs are now tracked on launchpad:
@printindex vr
@bye
@c LocalWords: clbuild tarballs defsystem Quicklisp initarg uiop fasl
@c LocalWords: namestring initargs fasls
doc/index.html
View file @
335d386d
...
...
@@ -39,7 +39,7 @@
and the ability to deliver standalone executables.
It was pre-released as 2.27 on February 1st 2013,
released as 3.0.0 on May 15th 2013,
a
nd again as 3.1.2 on May 6th
2014.
a
gain as 3.1.2 on May 6th 2014, and as 3.1.3 on 24 July
2014.
</p>
<a
id=
"what_it_is"
></a>
<h3>
What it is
</h3>
...
...
@@ -419,6 +419,11 @@ XCL (Peter Graves) <gnooth@gmail.com>
<a
id=
"news"
></a>
<h3>
What is happening
</h3>
<dl>
<dt>
May 2014 to July 2014
</dt>
<dd>
ASDF bug fixing from 3.1.2 leads to release of 3.1.3, a major bug
fix release. We strongly urge implementors that have shipped with 3.1.2
to upgrade to 3.1.3. There should be no incompatibilities, and some
very important bug fixes are provided. See the Changelog for more details.
</dd>
<dt>
July 2013 to May 2014
</dt>
<dd>
Fran
ç
ois-Ren
é
Rideau has resigned as maintainer
but remained an active developer.
...
...
find-component.lisp
View file @
335d386d
...
...
@@ -107,10 +107,10 @@
(
and
(
typep
c
'missing-dependency
)
(
eq
(
missing-required-by
c
)
component
)
(
equal
(
missing-requires
c
)
name
))))
(
unless
(
component-parent
component
)
(
let
((
name
(
coerce-name
name
)))
(
unset-asdf-cache-entry
`
(
find-system
,
name
))
(
unset-asdf-cache-entry
`
(
locate-system
,
name
))))))))
(
unless
(
component-parent
component
)
(
let
((
name
(
coerce-name
name
)))
(
unset-asdf-cache-entry
`
(
find-system
,
name
))
(
unset-asdf-cache-entry
`
(
locate-system
,
name
))))))))
(
defun
resolve-dependency-spec
(
component
dep-spec
)
...
...
find-system.lisp
View file @
335d386d
...
...
@@ -99,8 +99,8 @@ of which is a system object.")
(
defun
clear-defined-systems
()
;; Invalidate all systems but ASDF itself, if registered.
(
loop
:for
name
:being
:the
:hash-keys
:of
*defined-systems*
:unless
(
equal
name
"asdf"
)
:do
(
clear-defined-system
name
)))
:unless
(
equal
name
"asdf"
)
:do
(
clear-defined-system
name
)))
(
register-hook-function
'*post-upgrade-cleanup-hook*
'clear-defined-systems
nil
)
...
...
@@ -353,79 +353,70 @@ but not loaded in memory"
Returns five values: FOUNDP FOUND-SYSTEM PATHNAME PREVIOUS PREVIOUS-TIME
FOUNDP is true when a system was found,
either a new unregistered one or a previously registered one.
FOUND-SYSTEM when not null is a SYSTEM object that may be REGISTER-SYSTEM'ed
as is
PATHNAME when not null is a path from wh
ere
to load the system,
FOUND-SYSTEM when not null is a SYSTEM object that may be REGISTER-SYSTEM'ed
.
PATHNAME when not null is a path from wh
ich
to load the system,
either associated with FOUND-SYSTEM, or with the PREVIOUS system.
PREVIOUS when not null is a previously loaded SYSTEM object of same name.
PREVIOUS-TIME when not null is the time at which the PREVIOUS system was loaded."
(
with-asdf-cache
(
:key
`
(
locate-system
,
name
))
(
let*
((
name
(
coerce-name
name
))
(
in-memory
(
system-registered-p
name
))
; load from disk if absent or newer on disk
(
previous
(
cdr
in-memory
))
(
previous
(
and
(
typep
previous
'system
)
previous
))
(
previous-time
(
car
in-memory
))
(
found
(
search-for-system-definition
name
))
(
found-system
(
and
(
typep
found
'system
)
found
))
(
pathname
(
ensure-pathname
(
or
(
and
(
typep
found
'
(
or
pathname
string
))
(
pathname
found
))
(
and
found-system
(
system-source-file
found-system
))
(
and
previous
(
system-source-file
previous
)))
:want-absolute
t
:resolve-symlinks
*resolve-symlinks*
))
(
foundp
(
and
(
or
found-system
pathname
previous
)
t
)))
(
check-type
found
(
or
null
pathname
system
))
(
unless
(
check-not-old-asdf-system
name
pathname
)
(
cond
(
previous
(
setf
found
nil
pathname
nil
))
(
t
(
setf
found
(
sysdef-preloaded-system-search
"asdf"
))
(
assert
(
typep
found
'system
))
(
setf
found-system
found
pathname
nil
))))
(
values
foundp
found-system
pathname
previous
previous-time
))))
(
let*
((
name
(
coerce-name
name
))
(
in-memory
(
system-registered-p
name
))
; load from disk if absent or newer on disk
(
previous
(
cdr
in-memory
))
(
previous
(
and
(
typep
previous
'system
)
previous
))
(
previous-time
(
car
in-memory
))
(
found
(
search-for-system-definition
name
))
(
found-system
(
and
(
typep
found
'system
)
found
))
(
pathname
(
ensure-pathname
(
or
(
and
(
typep
found
'
(
or
pathname
string
))
(
pathname
found
))
(
and
found-system
(
system-source-file
found-system
))
(
and
previous
(
system-source-file
previous
)))
:want-absolute
t
:resolve-symlinks
*resolve-symlinks*
))
(
foundp
(
and
(
or
found-system
pathname
previous
)
t
)))
(
check-type
found
(
or
null
pathname
system
))
(
unless
(
check-not-old-asdf-system
name
pathname
)
(
cond
(
previous
(
setf
found
nil
pathname
nil
))
(
t
(
setf
found
(
sysdef-preloaded-system-search
"asdf"
))
(
assert
(
typep
found
'system
))
(
setf
found-system
found
pathname
nil
))))
(
values
foundp
found-system
pathname
previous
previous-time
)))
(
defmethod
find-system
((
name
string
)
&optional
(
error-p
t
))
(
with-asdf-cache
(
:key
`
(
find-system
,
name
))
(
let
((
primary-name
(
primary-system-name
name
)))
(
unless
(
equal
name
primary-name
)
(
find-system
primary-name
nil
)))
(
loop
(
restart-case
(
multiple-value-bind
(
foundp
found-system
pathname
previous
previous-time
)
(
locate-system
name
)
(
when
(
and
found-system
(
eq
found-system
previous
)
(
or
(
first
(
gethash
`
(
find-system
,
name
)
*asdf-cache*
))
(
and
*immutable-systems*
(
gethash
name
*immutable-systems*
))))
(
return
found-system
))
(
assert
(
eq
foundp
(
and
(
or
found-system
pathname
previous
)
t
)))
(
let
((
previous-pathname
(
and
previous
(
system-source-file
previous
)))
(
system
(
or
previous
found-system
)))
(
when
(
and
found-system
(
not
previous
))
(
register-system
found-system
))
(
when
(
and
system
pathname
)
(
setf
(
system-source-file
system
)
pathname
))
(
when
(
and
pathname
(
let
((
stamp
(
get-file-stamp
pathname
)))
(
and
stamp
(
not
(
and
previous
(
or
(
pathname-equal
pathname
previous-pathname
)
(
and
pathname
previous-pathname
(
pathname-equal
(
physicalize-pathname
pathname
)
(
physicalize-pathname
previous-pathname
))))
(
stamp<=
stamp
previous-time
))))))
;; only load when it's a pathname that is different or has newer content, and not an old asdf
(
load-asd
pathname
:name
name
)))
(
let
((
in-memory
(
system-registered-p
name
)))
; try again after loading from disk if needed
(
return
(
cond
(
in-memory
(
when
pathname
(
setf
(
car
in-memory
)
(
get-file-stamp
pathname
)))
(
cdr
in-memory
))
(
error-p
(
error
'missing-component
:requires
name
))))))
(
reinitialize-source-registry-and-retry
()
:report
(
lambda
(
s
)
(
format
s
(
compatfmt
"~@<Retry finding system ~A after reinitializing the source-registry.~@:>"
)
name
))
(
unset-asdf-cache-entry
`
(
locate-system
,
name
))
(
initialize-source-registry
)))))))
(
or
(
and
*immutable-systems*
(
gethash
name
*immutable-systems*
)
(
cdr
(
system-registered-p
name
)))
(
multiple-value-bind
(
foundp
found-system
pathname
previous
previous-time
)
(
locate-system
name
)
(
assert
(
eq
foundp
(
and
(
or
found-system
pathname
previous
)
t
)))
(
let
((
previous-pathname
(
and
previous
(
system-source-file
previous
)))
(
system
(
or
previous
found-system
)))
(
when
(
and
found-system
(
not
previous
))
(
register-system
found-system
))
(
when
(
and
system
pathname
)
(
setf
(
system-source-file
system
)
pathname
))
(
when
(
and
pathname
(
let
((
stamp
(
get-file-stamp
pathname
)))
(
and
stamp
(
not
(
and
previous
(
or
(
pathname-equal
pathname
previous-pathname
)
(
and
pathname
previous-pathname
(
pathname-equal
(
physicalize-pathname
pathname
)
(
physicalize-pathname
previous-pathname
))))
(
stamp<=
stamp
previous-time
))))))
;; only load when it's a pathname that is different or has newer content, and not an old asdf
(
load-asd
pathname
:name
name
)))
(
let
((
in-memory
(
system-registered-p
name
)))
; try again after loading from disk if needed
(
cond
(
in-memory
(
when
pathname
(
setf
(
car
in-memory
)
(
get-file-stamp
pathname
)))
(
cdr
in-memory
))
(
error-p
(
error
'missing-component
:requires
name
))
(
t
;; not found: don't keep negative cache, see lp#1335323
(
unset-asdf-cache-entry
`
(
locate-system
,
name
))
(
return-from
find-system
nil
)))))))))
header.lisp
View file @
335d386d
;;; -*- mode: Common-Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; buffer-read-only: t; -*-
;;; This is ASDF 3.1.
2.4
: Another System Definition Facility.
;;; This is ASDF 3.1.
3
: Another System Definition Facility.
;;;
;;; Feedback, bug reports, and patches are all welcome:
;;; please mail to <asdf-devel@common-lisp.net>.
...
...
interface.lisp
View file @
335d386d
...
...
@@ -126,11 +126,13 @@
#:package-inferred-system-missing-package-error
#:operation-definition-warning
#:operation-definition-error
#:try-recompiling
#:try-recompiling
; restarts
#:retry
#:accept
; restarts
#:accept
#:coerce-entry-to-directory
#:remove-entry-from-registry
#:clear-configuration-and-retry
#:*encoding-detection-hook*
#:*encoding-external-format-hook*
...
...
@@ -166,5 +168,6 @@
#:user-source-registry
#:system-source-registry
#:user-source-registry-directory
#:system-source-registry-directory
))
#:system-source-registry-directory
))
operate.lisp
View file @
335d386d
...
...
@@ -111,7 +111,8 @@ The default operation may change in the future if we implement a
component-directed strategy for how to load or compile systems."
)
(
defmethod
component-depends-on
((
o
prepare-op
)
(
s
system
))
`
((
,
*load-system-operation*
,@
(
component-sideway-dependencies
s
))))
(
loop
:for
(
o
.
cs
)
:in
(
call-next-method
)
:collect
(
cons
(
if
(
eq
o
'load-op
)
*load-system-operation*
o
)
cs
)))
(
defclass
build-op
(
non-propagating-operation
)
()
(
:documentation
"Since ASDF3, BUILD-OP is the recommended 'master' operation,
...
...
@@ -122,7 +123,8 @@ as a symbol or as a string later read as a symbol (after loading the defsystem-d
if NIL is specified (the default), BUILD-OP falls back to the *LOAD-SYSTEM-OPERATION*
that will load the system in the current image, and its typically LOAD-OP."
))
(
defmethod
component-depends-on
((
o
build-op
)
(
c
component
))
`
((
,
(
or
(
component-build-operation
c
)
*load-system-operation*
)
,
c
)))
`
((
,
(
or
(
component-build-operation
c
)
*load-system-operation*
)
,
c
)
,@
(
call-next-method
)))
(
defun
make
(
system
&rest
keys
)
"The recommended way to interact with ASDF3.1 is via (ASDF:MAKE :FOO).
...
...
test/dll-test.lisp
View file @
335d386d
...
...
@@ -6,7 +6,7 @@ extern int sample_function();
int sample_function()
{
return 42;
return 42;
}
"
)
...
...
@@ -16,6 +16,6 @@ extern MKCL_DLLEXPORT int sample_function(void);
int sample_function(void)
{
return 42;
return 42;
}
"
)
test/monodll-1.lisp
View file @
335d386d
...
...
@@ -6,7 +6,7 @@ extern int always_7();
int always_7()
{
return 7;
return 7;
}
"
)
...
...
@@ -16,6 +16,6 @@ extern MKCL_DLLEXPORT int always_7(void);
int always_7(void)
{
return 7;
return 7;
}
"
)
test/monodll.lisp
View file @
335d386d
...
...
@@ -6,7 +6,7 @@ extern int always_42();
int always_42()
{
return 6*always_7();
return 6*always_7();
}
"
)
...
...
@@ -16,6 +16,6 @@ extern MKCL_DLLEXPORT int always_42(void);
int always_42(void)
{
return 6*always_7();
return 6*always_7();
}
"
)
test/script-support.lisp
View file @
335d386d
...
...
@@ -552,16 +552,18 @@ is bound, write a message and exit on an error. If
(
when
(
asym
:*verbose-out*
)
(
setf
(
asymval
:*verbose-out*
)
*standard-output*
))
(
when
(
and
(
asym
:locate-system
)
(
asym
:pathname-directory-pathname
)
(
asym
:pathname-equal
))
(
format
t
"Comparing directories~%"
)
(
let
((
x
(
acall
:pathname-directory-pathname
(
nth-value
2
(
acall
:locate-system
:test-asdf
)))))
(
assert-pathname-equal-helper
;; not always EQUAL (!)
'*test-directory*
*test-directory*
'
(
:pathname-directory-pathname
(
nth-value
2
(
:locate-system
:test-asdf
)))
x
)
(
unless
(
equal
*test-directory*
x
)
(
format
t
"Interestingly, while *test-directory* has components~% ~S~%~
(
acall
:call-with-asdf-cache
#'
(
lambda
()
(
let
((
x
(
acall
:pathname-directory-pathname
(
nth-value
2
(
acall
:locate-system
:test-asdf
)))))
(
assert-pathname-equal-helper
;; not always EQUAL (!)
'*test-directory*
*test-directory*
'
(
:pathname-directory-pathname
(
nth-value
2
(
:locate-system
:test-asdf
)))
x
)
(
unless
(
equal
*test-directory*
x
)
(
format
t
"Interestingly, while *test-directory* has components~% ~S~%~
ASDF finds the ASDs in~% ~S~%Using the latter.~%"
(
pathname-components
*test-directory*
)
(
pathname-components
x
)))
(
setf
*test-directory*
x
)))
(
pathname-components
*test-directory*
)
(
pathname-components
x
)))