1
|
1
|
;;; -*- mode: Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; buffer-read-only: t; -*-
|
2
|
|
-;;; This is ASDF 3.2.0: Another System Definition Facility.
|
|
2
|
+;;; This is ASDF 3.2.1: Another System Definition Facility.
|
3
|
3
|
;;;
|
4
|
4
|
;;; Feedback, bug reports, and patches are all welcome:
|
5
|
5
|
;;; please mail to <asdf-devel@common-lisp.net>.
|
... |
... |
@@ -1616,7 +1616,8 @@ or a string describing the format-control of a simple-condition." |
1616
|
1616
|
(format-control :initarg :format-control)
|
1617
|
1617
|
(format-arguments :initarg :format-arguments))
|
1618
|
1618
|
(:report (lambda (condition stream)
|
1619
|
|
- (format stream "Not implemented: ~s~@[ ~?~]"
|
|
1619
|
+ (format stream "Not (currently) implemented on ~A: ~S~@[ ~?~]"
|
|
1620
|
+ (nth-value 1 (symbol-call :uiop :implementation-type))
|
1620
|
1621
|
(slot-value condition 'functionality)
|
1621
|
1622
|
(slot-value condition 'format-control)
|
1622
|
1623
|
(slot-value condition 'format-arguments)))))
|
... |
... |
@@ -1667,7 +1668,7 @@ message, that takes the functionality as its first argument (that can be skipped |
1667
|
1668
|
(in-package :uiop/version)
|
1668
|
1669
|
|
1669
|
1670
|
(with-upgradability ()
|
1670
|
|
- (defparameter *uiop-version* "3.2.0")
|
|
1671
|
+ (defparameter *uiop-version* "3.2.1")
|
1671
|
1672
|
|
1672
|
1673
|
(defun unparse-version (version-list)
|
1673
|
1674
|
"From a parsed version (a list of natural numbers), compute the version string"
|
... |
... |
@@ -1865,7 +1866,7 @@ keywords explicitly." |
1865
|
1866
|
((eq :not (car x)) (assert (null (cddr x))) (not (featurep (cadr x))))
|
1866
|
1867
|
((eq :or (car x)) (some #'featurep (cdr x)))
|
1867
|
1868
|
((eq :and (car x)) (every #'featurep (cdr x)))
|
1868
|
|
- (t (error "Malformed feature specification ~S" x))))
|
|
1869
|
+ (t (parameter-error "~S: malformed feature specification ~S" 'featurep x))))
|
1869
|
1870
|
|
1870
|
1871
|
;; Starting with UIOP 3.1.5, these are runtime tests.
|
1871
|
1872
|
;; You may bind *features* with a copy of what your target system offers to test its properties.
|
... |
... |
@@ -1948,7 +1949,7 @@ use getenvp to return NIL in such a case." |
1948
|
1949
|
#+mkcl (#.(or (find-symbol* 'getenv :si nil) (find-symbol* 'getenv :mk-ext nil)) x)
|
1949
|
1950
|
#+sbcl (sb-ext:posix-getenv x)
|
1950
|
1951
|
#-(or abcl allegro clasp clisp clozure cmucl cormanlisp ecl gcl genera lispworks mcl mkcl sbcl scl xcl)
|
1951
|
|
- (error "~S is not supported on your implementation" 'getenv))
|
|
1952
|
+ (not-implemented-error 'getenv))
|
1952
|
1953
|
|
1953
|
1954
|
(defsetf getenv (x) (val)
|
1954
|
1955
|
"Set an environment variable."
|
... |
... |
@@ -1962,7 +1963,7 @@ use getenvp to return NIL in such a case." |
1962
|
1963
|
#+mkcl `(mkcl:setenv ,x ,val)
|
1963
|
1964
|
#+sbcl `(progn (require :sb-posix) (symbol-call :sb-posix :setenv ,x ,val 1))
|
1964
|
1965
|
#-(or allegro clisp clozure cmucl ecl lispworks mkcl sbcl)
|
1965
|
|
- '(error "~S ~S is not supported on your implementation" 'setf 'getenv))
|
|
1966
|
+ '(not-implemented-error '(setf getenv)))
|
1966
|
1967
|
|
1967
|
1968
|
(defun getenvp (x)
|
1968
|
1969
|
"Predicate that is true if the named variable is present in the libc environment,
|
... |
... |
@@ -2059,7 +2060,8 @@ then returning the non-empty string value of the variable" |
2059
|
2060
|
(ecase ext:*case-mode* (:upper "") (:lower "l")))
|
2060
|
2061
|
#+ecl (format nil "~A~@[-~A~]" s
|
2061
|
2062
|
(let ((vcs-id (ext:lisp-implementation-vcs-id)))
|
2062
|
|
- (subseq vcs-id 0 (min (length vcs-id) 8))))
|
|
2063
|
+ (unless (equal vcs-id "UNKNOWN")
|
|
2064
|
+ (subseq vcs-id 0 (min (length vcs-id) 8)))))
|
2063
|
2065
|
#+gcl (subseq s (1+ (position #\space s)))
|
2064
|
2066
|
#+genera
|
2065
|
2067
|
(multiple-value-bind (major minor) (sct:get-system-version "System")
|
... |
... |
@@ -2124,7 +2126,7 @@ suitable for use as a directory name to segregate Lisp FASLs, C dynamic librarie |
2124
|
2126
|
#+mkcl (mk-ext:getcwd)
|
2125
|
2127
|
#+sbcl (sb-ext:parse-native-namestring (sb-unix:posix-getcwd/))
|
2126
|
2128
|
#+xcl (extensions:current-directory)
|
2127
|
|
- (error "getcwd not supported on your implementation")))
|
|
2129
|
+ (not-implemented-error 'getcwd)))
|
2128
|
2130
|
|
2129
|
2131
|
(defun chdir (x)
|
2130
|
2132
|
"Change current directory, as per POSIX chdir(2), to a given pathname object"
|
... |
... |
@@ -2142,7 +2144,7 @@ suitable for use as a directory name to segregate Lisp FASLs, C dynamic librarie |
2142
|
2144
|
#+mkcl (mk-ext:chdir x)
|
2143
|
2145
|
#+sbcl (progn (require :sb-posix) (symbol-call :sb-posix :chdir (sb-ext:native-namestring x)))
|
2144
|
2146
|
#-(or abcl allegro clasp clisp clozure cmucl cormanlisp ecl gcl genera lispworks mkcl sbcl scl xcl)
|
2145
|
|
- (error "chdir not supported on your implementation"))))
|
|
2147
|
+ (not-implemented-error 'chdir))))
|
2146
|
2148
|
|
2147
|
2149
|
|
2148
|
2150
|
;;;; -----------------------------------------------------------------
|
... |
... |
@@ -2286,7 +2288,8 @@ that is a list and not a string." |
2286
|
2288
|
((consp directory)
|
2287
|
2289
|
(cons :relative directory))
|
2288
|
2290
|
(t
|
2289
|
|
- (error (compatfmt "~@<Unrecognized pathname directory component ~S~@:>") directory))))
|
|
2291
|
+ (parameter-error (compatfmt "~@<~S: Unrecognized pathname directory component ~S~@:>")
|
|
2292
|
+ 'normalize-pathname-directory-component directory))))
|
2290
|
2293
|
|
2291
|
2294
|
(defun denormalize-pathname-directory-component (directory-component)
|
2292
|
2295
|
"Convert the DIRECTORY-COMPONENT from a CLHS-standard format to a format usable
|
... |
... |
@@ -2717,7 +2720,8 @@ or if it is a PATHNAME but some of its components are not recognized." |
2717
|
2720
|
((or null string) pathname)
|
2718
|
2721
|
(pathname
|
2719
|
2722
|
(with-output-to-string (s)
|
2720
|
|
- (flet ((err () #+lispworks (describe pathname) (error "Not a valid unix-namestring ~S" pathname)))
|
|
2723
|
+ (flet ((err () (parameter-error "~S: invalid unix-namestring ~S"
|
|
2724
|
+ 'unix-namestring pathname)))
|
2721
|
2725
|
(let* ((dir (normalize-pathname-directory-component (pathname-directory pathname)))
|
2722
|
2726
|
(name (pathname-name pathname))
|
2723
|
2727
|
(name (and (not (eq name :unspecific)) name))
|
... |
... |
@@ -2951,7 +2955,7 @@ In that last case, if ROOT is non-NIL, PATH is first transformated by DIRECTORIZ |
2951
|
2955
|
((eq destination t)
|
2952
|
2956
|
path)
|
2953
|
2957
|
((not (pathnamep destination))
|
2954
|
|
- (error "Invalid destination"))
|
|
2958
|
+ (parameter-error "~S: Invalid destination" 'translate-pathname*))
|
2955
|
2959
|
((not (absolute-pathname-p destination))
|
2956
|
2960
|
(translate-pathname path absolute-source (merge-pathnames* destination root)))
|
2957
|
2961
|
(root
|
... |
... |
@@ -3178,9 +3182,10 @@ but the behavior in presence of symlinks is not portable. Use IOlib to handle su |
3178
|
3182
|
;; logical pathnames have restrictions on wild patterns.
|
3179
|
3183
|
;; Not that the results are very portable when you use these patterns on physical pathnames.
|
3180
|
3184
|
(when (wild-pathname-p dir)
|
3181
|
|
- (error "Invalid wild pattern in logical directory ~S" directory))
|
|
3185
|
+ (parameter-error "~S: Invalid wild pattern in logical directory ~S"
|
|
3186
|
+ 'directory-files directory))
|
3182
|
3187
|
(unless (member (pathname-directory pattern) '(() (:relative)) :test 'equal)
|
3183
|
|
- (error "Invalid file pattern ~S for logical directory ~S" pattern directory))
|
|
3188
|
+ (parameter-error "~S: Invalid file pattern ~S for logical directory ~S" 'directory-files pattern directory))
|
3184
|
3189
|
(setf pattern (make-pathname-logical pattern (pathname-host dir))))
|
3185
|
3190
|
(let* ((pat (merge-pathnames* pattern dir))
|
3186
|
3191
|
(entries (ignore-errors (directory* pat))))
|
... |
... |
@@ -3493,7 +3498,7 @@ check constraints and normalize as per ENSURE-PATHNAME." |
3493
|
3498
|
check constraints and normalize each one as per ENSURE-PATHNAME.
|
3494
|
3499
|
Any empty entries in the environment variable X will be returned as NILs."
|
3495
|
3500
|
(unless (getf constraints :empty-is-nil t)
|
3496
|
|
- (error "Cannot have EMPTY-IS-NIL false for GETENV-PATHNAMES."))
|
|
3501
|
+ (parameter-error "Cannot have EMPTY-IS-NIL false for ~S" 'getenv-pathnames))
|
3497
|
3502
|
(apply 'split-native-pathnames-string (getenvp x)
|
3498
|
3503
|
:on-error (or on-error
|
3499
|
3504
|
`(error "In (~S ~S), invalid pathname ~*~S: ~*~?" getenv-pathnames ,x))
|
... |
... |
@@ -3610,13 +3615,13 @@ If you're suicidal or extremely confident, just use :VALIDATE T." |
3610
|
3615
|
(cond
|
3611
|
3616
|
((not (and (pathnamep directory-pathname) (directory-pathname-p directory-pathname)
|
3612
|
3617
|
(physical-pathname-p directory-pathname) (not (wild-pathname-p directory-pathname))))
|
3613
|
|
- (error "~S was asked to delete ~S but it is not a physical non-wildcard directory pathname"
|
|
3618
|
+ (parameter-error "~S was asked to delete ~S but it is not a physical non-wildcard directory pathname"
|
3614
|
3619
|
'delete-directory-tree directory-pathname))
|
3615
|
3620
|
((not validatep)
|
3616
|
|
- (error "~S was asked to delete ~S but was not provided a validation predicate"
|
|
3621
|
+ (parameter-error "~S was asked to delete ~S but was not provided a validation predicate"
|
3617
|
3622
|
'delete-directory-tree directory-pathname))
|
3618
|
3623
|
((not (call-function validate directory-pathname))
|
3619
|
|
- (error "~S was asked to delete ~S but it is not valid ~@[according to ~S~]"
|
|
3624
|
+ (parameter-error "~S was asked to delete ~S but it is not valid ~@[according to ~S~]"
|
3620
|
3625
|
'delete-directory-tree directory-pathname validate))
|
3621
|
3626
|
((not (directory-exists-p directory-pathname))
|
3622
|
3627
|
(ecase if-does-not-exist
|
... |
... |
@@ -4445,7 +4450,7 @@ This is designed to abstract away the implementation specific quit forms." |
4445
|
4450
|
(exit `(,exit :code code :abort (not finish-output)))
|
4446
|
4451
|
(quit `(,quit :unix-status code :recklessly-p (not finish-output)))))
|
4447
|
4452
|
#-(or abcl allegro clasp clisp clozure cmucl ecl gcl genera lispworks mcl mkcl sbcl scl xcl)
|
4448
|
|
- (error "~S called with exit code ~S but there's no quitting on this implementation" 'quit code))
|
|
4453
|
+ (not-implemented-error 'quit "(called with exit code ~S)" code))
|
4449
|
4454
|
|
4450
|
4455
|
(defun die (code format &rest arguments)
|
4451
|
4456
|
"Die in error with some error message"
|
... |
... |
@@ -4719,7 +4724,7 @@ or COMPRESSION on SBCL, and APPLICATION-TYPE on SBCL/Windows." |
4719
|
4724
|
(setf *image-restored-p* nil)
|
4720
|
4725
|
#-(or clisp clozure (and cmucl executable) lispworks sbcl scl)
|
4721
|
4726
|
(when executable
|
4722
|
|
- (error "Dumping an executable is not supported on this implementation! Aborting."))
|
|
4727
|
+ (not-implemented-error 'dump-image "dumping an executable"))
|
4723
|
4728
|
#+allegro
|
4724
|
4729
|
(progn
|
4725
|
4730
|
(sys:resize-areas :global-gc t :pack-heap t :sift-old-areas t :tenure t) ; :new 5000000
|
... |
... |
@@ -4777,8 +4782,7 @@ or COMPRESSION on SBCL, and APPLICATION-TYPE on SBCL/Windows." |
4777
|
4782
|
;; the default is :console - only works with SBCL 1.1.15 or later.
|
4778
|
4783
|
(when application-type (list :application-type application-type)))))
|
4779
|
4784
|
#-(or allegro clisp clozure cmucl gcl lispworks sbcl scl)
|
4780
|
|
- (error "Can't ~S ~S: UIOP doesn't support image dumping with ~A.~%"
|
4781
|
|
- 'dump-image filename (nth-value 1 (implementation-type))))
|
|
4785
|
+ (not-implemented-error 'dump-image))
|
4782
|
4786
|
|
4783
|
4787
|
(defun create-image (destination lisp-object-files
|
4784
|
4788
|
&key kind output-name prologue-code epilogue-code extra-object-files
|
... |
... |
@@ -4812,17 +4816,27 @@ or COMPRESSION on SBCL, and APPLICATION-TYPE on SBCL/Windows." |
4812
|
4816
|
(shell-boolean-exit
|
4813
|
4817
|
(restore-image))))))))
|
4814
|
4818
|
(when forms `(progn ,@forms))))))
|
4815
|
|
- #+(or clasp ecl) (check-type kind (member :dll :lib :static-library :program :object :fasl))
|
|
4819
|
+ #+(or clasp ecl mkcl)
|
|
4820
|
+ (check-type kind (member :dll :shared-library :lib :static-library
|
|
4821
|
+ :fasl :fasb :program))
|
4816
|
4822
|
(apply #+clasp 'cmp:builder #+clasp kind
|
4817
|
|
- #+ecl 'c::builder #+ecl kind
|
4818
|
|
- #+mkcl (ecase kind
|
4819
|
|
- ((:dll) 'compiler::build-shared-library)
|
4820
|
|
- ((:lib :static-library) 'compiler::build-static-library)
|
4821
|
|
- ((:fasl) 'compiler::build-bundle)
|
4822
|
|
- ((:program) 'compiler::build-program))
|
|
4823
|
+ #+(or ecl mkcl)
|
|
4824
|
+ (ecase kind
|
|
4825
|
+ ((:dll :shared-library)
|
|
4826
|
+ #+ecl 'c::build-shared-library #+mkcl 'compiler:build-shared-library)
|
|
4827
|
+ ((:lib :static-library)
|
|
4828
|
+ #+ecl 'c::build-static-library #+mkcl 'compiler:build-static-library)
|
|
4829
|
+ ((:fasl #+ecl :fasb)
|
|
4830
|
+ #+ecl 'c::build-fasl #+mkcl 'compiler:build-fasl)
|
|
4831
|
+ #+mkcl ((:fasb) 'compiler:build-bundle)
|
|
4832
|
+ ((:program)
|
|
4833
|
+ #+ecl 'c::build-program #+mkcl 'compiler:build-program))
|
4823
|
4834
|
(pathname destination)
|
4824
|
|
- #+(or clasp ecl) :lisp-files #+mkcl :lisp-object-files (append lisp-object-files #+(or clasp ecl) extra-object-files)
|
4825
|
|
- #+(or clasp ecl) :init-name #+(or clasp ecl) (c::compute-init-name (or output-name destination) :kind kind)
|
|
4835
|
+ #+(or clasp ecl) :lisp-files #+mkcl :lisp-object-files
|
|
4836
|
+ (append lisp-object-files #+(or clasp ecl) extra-object-files)
|
|
4837
|
+ #+ecl :init-name
|
|
4838
|
+ #+ecl (c::compute-init-name (or output-name destination)
|
|
4839
|
+ :kind (if (eq kind :fasb) :fasl kind))
|
4826
|
4840
|
(append
|
4827
|
4841
|
(when prologue-code `(:prologue-code ,prologue-code))
|
4828
|
4842
|
(when epilogue-code `(:epilogue-code ,epilogue-code))
|
... |
... |
@@ -5609,8 +5623,7 @@ it will filter them appropriately." |
5609
|
5623
|
(defun combine-fasls (inputs output)
|
5610
|
5624
|
"Combine a list of FASLs INPUTS into a single FASL OUTPUT"
|
5611
|
5625
|
#-(or abcl allegro clisp clozure cmucl lispworks sbcl scl xcl)
|
5612
|
|
- (error "~A does not support ~S~%inputs ~S~%output ~S"
|
5613
|
|
- (implementation-type) 'combine-fasls inputs output)
|
|
5626
|
+ (not-implemented-error 'combine-fasls "~%inputs: ~S~%output: ~S" inputs output)
|
5614
|
5627
|
#+abcl (funcall 'sys::concatenate-fasls inputs output) ; requires ABCL 1.2.0
|
5615
|
5628
|
#+(or allegro clisp cmucl sbcl scl xcl) (concatenate-files inputs output)
|
5616
|
5629
|
#+clozure (ccl:fasl-concatenate output inputs :if-exists :supersede)
|
... |
... |
@@ -5661,7 +5674,8 @@ as either a recognizing function or a sequence of characters." |
5661
|
5674
|
(some
|
5662
|
5675
|
(cond
|
5663
|
5676
|
((and good-chars bad-chars)
|
5664
|
|
- (error "only one of good-chars and bad-chars can be provided"))
|
|
5677
|
+ (parameter-error "~S: only one of good-chars and bad-chars can be provided"
|
|
5678
|
+ 'requires-escaping-p))
|
5665
|
5679
|
((typep good-chars 'function)
|
5666
|
5680
|
(complement good-chars))
|
5667
|
5681
|
((typep bad-chars 'function)
|
... |
... |
@@ -5670,7 +5684,7 @@ as either a recognizing function or a sequence of characters." |
5670
|
5684
|
#'(lambda (c) (not (find c good-chars))))
|
5671
|
5685
|
((and bad-chars (typep bad-chars 'sequence))
|
5672
|
5686
|
#'(lambda (c) (find c bad-chars)))
|
5673
|
|
- (t (error "requires-escaping-p: no good-char criterion")))
|
|
5687
|
+ (t (parameter-error "~S: no good-char criterion" 'requires-escaping-p)))
|
5674
|
5688
|
token))
|
5675
|
5689
|
|
5676
|
5690
|
(defun escape-token (token &key stream quote good-chars bad-chars escaper)
|
... |
... |
@@ -6027,13 +6041,14 @@ to ignore if URGENT is T. On some platforms, it may also be subject to |
6027
|
6041
|
race conditions."
|
6028
|
6042
|
(declare (ignorable urgent))
|
6029
|
6043
|
#+abcl (sys:process-kill (slot-value process-info 'process))
|
|
6044
|
+ #+clasp (mp:process-kill (slot-value process-info 'process))
|
6030
|
6045
|
;; On ECL, this will only work on versions later than 2016-09-06,
|
6031
|
6046
|
;; but we still want to compile on earlier versions, so we use symbol-call
|
6032
|
6047
|
#+ecl (symbol-call :ext :terminate-process (slot-value process-info 'process) urgent)
|
6033
|
6048
|
#+lispworks7+ (sys:pipe-kill-process (slot-value process-info 'process))
|
6034
|
6049
|
#+mkcl (mk-ext:terminate-process (slot-value process-info 'process)
|
6035
|
6050
|
:force urgent)
|
6036
|
|
- #-(or abcl ecl lispworks7+ mkcl)
|
|
6051
|
+ #-(or abcl clasp ecl lispworks7+ mkcl)
|
6037
|
6052
|
(os-cond
|
6038
|
6053
|
((os-unix-p) (%posix-send-signal process-info (if urgent 9 15)))
|
6039
|
6054
|
((os-windows-p) (if-let (pid (process-info-pid process-info))
|
... |
... |
@@ -6140,6 +6155,9 @@ LAUNCH-PROGRAM returns a PROCESS-INFO object." |
6140
|
6155
|
(%handle-if-does-not-exist input if-input-does-not-exist)
|
6141
|
6156
|
(%handle-if-exists output if-output-exists)
|
6142
|
6157
|
(%handle-if-exists error-output if-error-output-exists))
|
|
6158
|
+ #+ecl (let ((*standard-input* *stdin*)
|
|
6159
|
+ (*standard-output* *stdout*)
|
|
6160
|
+ (*error-output* *stderr*)))
|
6143
|
6161
|
(let ((process-info (make-instance 'process-info))
|
6144
|
6162
|
(input (%normalize-io-specifier input :input))
|
6145
|
6163
|
(output (%normalize-io-specifier output :output))
|
... |
... |
@@ -6151,6 +6169,14 @@ LAUNCH-PROGRAM returns a PROCESS-INFO object." |
6151
|
6169
|
#+os-unix (list command)
|
6152
|
6170
|
#+os-windows
|
6153
|
6171
|
(string
|
|
6172
|
+ ;; NB: On other Windows implementations, this is utterly bogus
|
|
6173
|
+ ;; except in the most trivial cases where no quoting is needed.
|
|
6174
|
+ ;; Use at your own risk.
|
|
6175
|
+ #-(or allegro clisp clozure ecl)
|
|
6176
|
+ (nest
|
|
6177
|
+ #+(or ecl sbcl) (unless (find-symbol* :escape-arguments #+ecl :ext #+sbcl :sb-impl nil))
|
|
6178
|
+ (parameter-error "~S doesn't support string commands on Windows on this Lisp"
|
|
6179
|
+ 'launch-program command))
|
6154
|
6180
|
;; NB: We add cmd /c here. Behavior without going through cmd is not well specified
|
6155
|
6181
|
;; when the command contains spaces or special characters:
|
6156
|
6182
|
;; IIUC, the system will use space as a separator,
|
... |
... |
@@ -6161,14 +6187,9 @@ LAUNCH-PROGRAM returns a PROCESS-INFO object." |
6161
|
6187
|
;; On ClozureCL for Windows, we assume you are using
|
6162
|
6188
|
;; r15398 or later in 1.9 or later,
|
6163
|
6189
|
;; so that bug 858 is fixed http://trac.clozure.com/ccl/ticket/858
|
|
6190
|
+ ;; On ECL, commit 2040629 https://gitlab.com/embeddable-common-lisp/ecl/issues/304
|
6164
|
6191
|
;; On SBCL, we assume the patch from fcae0fd (to be part of SBCL 1.3.13)
|
6165
|
|
- #+(or clozure sbcl) (cons "cmd" (strcat "/c " command))
|
6166
|
|
- ;; NB: On other Windows implementations, this is utterly bogus
|
6167
|
|
- ;; except in the most trivial cases where no quoting is needed.
|
6168
|
|
- ;; Use at your own risk.
|
6169
|
|
- #-(or allegro clisp clozure sbcl)
|
6170
|
|
- (parameter-error "~S doesn't support string commands on Windows on this lisp: ~S"
|
6171
|
|
- 'launch-program command))
|
|
6192
|
+ #+(or clozure ecl sbcl) (cons "cmd" (strcat "/c " command)))
|
6172
|
6193
|
#+os-windows
|
6173
|
6194
|
(list
|
6174
|
6195
|
#+allegro (escape-windows-command command)
|
... |
... |
@@ -6176,7 +6197,7 @@ LAUNCH-PROGRAM returns a PROCESS-INFO object." |
6176
|
6197
|
#+(or abcl (and allegro os-unix) clozure cmucl ecl mkcl sbcl)
|
6177
|
6198
|
(let ((program (car command))
|
6178
|
6199
|
#-allegro (arguments (cdr command))))
|
6179
|
|
- #+(and sbcl os-windows)
|
|
6200
|
+ #+(and (or ecl sbcl) os-windows)
|
6180
|
6201
|
(multiple-value-bind (arguments escape-arguments)
|
6181
|
6202
|
(if (listp arguments)
|
6182
|
6203
|
(values arguments t)
|
... |
... |
@@ -6199,7 +6220,7 @@ LAUNCH-PROGRAM returns a PROCESS-INFO object." |
6199
|
6220
|
#+mkcl 'mk-ext:run-program
|
6200
|
6221
|
#+sbcl 'sb-ext:run-program
|
6201
|
6222
|
#+(or abcl clozure cmucl ecl mkcl sbcl) ,@'(program arguments)
|
6202
|
|
- #+(and sbcl os-windows) ,@'(:escape-arguments escape-arguments)
|
|
6223
|
+ #+(and (or ecl sbcl) os-windows) ,@'(:escape-arguments escape-arguments)
|
6203
|
6224
|
:input input :if-input-does-not-exist :error
|
6204
|
6225
|
:output output :if-output-exists :append
|
6205
|
6226
|
,(or #+(or allegro lispworks) :error-output :error) error-output
|
... |
... |
@@ -6397,7 +6418,7 @@ Programmers are encouraged to define their own methods for this generic function |
6397
|
6418
|
stream x
|
6398
|
6419
|
:linewise linewise :prefix prefix :element-type element-type :buffer-size buffer-size))
|
6399
|
6420
|
(t
|
6400
|
|
- (error "Invalid ~S destination ~S" 'slurp-input-stream x)))))
|
|
6421
|
+ (parameter-error "Invalid ~S destination ~S" 'slurp-input-stream x)))))
|
6401
|
6422
|
|
6402
|
6423
|
;;;; Vomiting a stream, typically into the input of another program.
|
6403
|
6424
|
(with-upgradability ()
|
... |
... |
@@ -6474,7 +6495,7 @@ Programmers are encouraged to define their own methods for this generic function |
6474
|
6495
|
x stream
|
6475
|
6496
|
:linewise linewise :prefix prefix :element-type element-type :buffer-size buffer-size))
|
6476
|
6497
|
(t
|
6477
|
|
- (error "Invalid ~S source ~S" 'vomit-output-stream x)))))
|
|
6498
|
+ (parameter-error "Invalid ~S source ~S" 'vomit-output-stream x)))))
|
6478
|
6499
|
|
6479
|
6500
|
|
6480
|
6501
|
;;;; Run-program: synchronously run a program in a subprocess, handling input, output and error-output.
|
... |
... |
@@ -6530,8 +6551,8 @@ or whether it's already taken care of by the implementation's underlying run-pro |
6530
|
6551
|
(activity-spec (if (eq actual-spec :output)
|
6531
|
6552
|
(ecase direction
|
6532
|
6553
|
((:input :output)
|
6533
|
|
- (error "~S not allowed as a ~S ~S spec"
|
6534
|
|
- :output 'run-program direction))
|
|
6554
|
+ (parameter-error "~S does not allow ~S as a ~S spec"
|
|
6555
|
+ 'run-program :output direction))
|
6535
|
6556
|
((:error-output)
|
6536
|
6557
|
nil))
|
6537
|
6558
|
actual-spec)))
|
... |
... |
@@ -6657,20 +6678,10 @@ or whether it's already taken care of by the implementation's underlying run-pro |
6657
|
6678
|
|
6658
|
6679
|
(defun %normalize-system-command (command) ;; helper for %USE-SYSTEM
|
6659
|
6680
|
(etypecase command
|
6660
|
|
- (string
|
6661
|
|
- (os-cond
|
6662
|
|
- ((os-windows-p)
|
6663
|
|
- #+(or allegro clisp ecl)
|
6664
|
|
- (strcat "cmd" " /c " command)
|
6665
|
|
- #-(or allegro clisp ecl) command)
|
6666
|
|
- (t command)))
|
|
6681
|
+ (string command)
|
6667
|
6682
|
(list (escape-shell-command
|
6668
|
6683
|
(os-cond
|
6669
|
6684
|
((os-unix-p) (cons "exec" command))
|
6670
|
|
- ((os-windows-p)
|
6671
|
|
- #+(or allegro clisp ecl sbcl)
|
6672
|
|
- (list* "cmd" "/c" command)
|
6673
|
|
- #-(or allegro clisp ecl sbcl) command)
|
6674
|
6685
|
(t command))))))
|
6675
|
6686
|
|
6676
|
6687
|
(defun %redirected-system-command (command in out err directory) ;; helper for %USE-SYSTEM
|
... |
... |
@@ -7183,7 +7194,7 @@ MORE may contain specifications for a subpath relative to these directories: a |
7183
|
7194
|
subpathname specification and keyword arguments as per RESOLVE-LOCATION \(see
|
7184
|
7195
|
also \"Configuration DSL\"\) in the ASDF manual."
|
7185
|
7196
|
(mapcar #'(lambda (d) (resolve-location `(,d ,more)))
|
7186
|
|
- (or (getenv-absolute-directories "XDG_DATA_DIRS")
|
|
7197
|
+ (or (remove nil (getenv-absolute-directories "XDG_DATA_DIRS"))
|
7187
|
7198
|
(os-cond
|
7188
|
7199
|
((os-windows-p) (mapcar 'get-folder-path '(:appdata :common-appdata)))
|
7189
|
7200
|
(t (mapcar 'parse-unix-namestring '("/usr/local/share/" "/usr/share/")))))))
|
... |
... |
@@ -7195,7 +7206,7 @@ MORE may contain specifications for a subpath relative to these directories: |
7195
|
7206
|
subpathname specification and keyword arguments as per RESOLVE-LOCATION \(see
|
7196
|
7207
|
also \"Configuration DSL\"\) in the ASDF manual."
|
7197
|
7208
|
(mapcar #'(lambda (d) (resolve-location `(,d ,more)))
|
7198
|
|
- (or (getenv-absolute-directories "XDG_CONFIG_DIRS")
|
|
7209
|
+ (or (remove nil (getenv-absolute-directories "XDG_CONFIG_DIRS"))
|
7199
|
7210
|
(os-cond
|
7200
|
7211
|
((os-windows-p) (xdg-data-dirs "config/"))
|
7201
|
7212
|
(t (mapcar 'parse-unix-namestring '("/etc/xdg/")))))))
|
... |
... |
@@ -7292,7 +7303,7 @@ objects. Side-effects for cached file location computation." |
7292
|
7303
|
(in-package :uiop/backward-driver)
|
7293
|
7304
|
|
7294
|
7305
|
(eval-when (:compile-toplevel :load-toplevel :execute)
|
7295
|
|
-(with-deprecation ((version-deprecation *uiop-version* :style-warning "3.2.0" :warning "3.2.1"))
|
|
7306
|
+(with-deprecation ((version-deprecation *uiop-version* :style-warning "3.2"))
|
7296
|
7307
|
;; Backward compatibility with ASDF 2.000 to 2.26
|
7297
|
7308
|
|
7298
|
7309
|
;; For backward-compatibility only, for people using internals
|
... |
... |
@@ -7411,9 +7422,10 @@ You can compare this string with e.g.: (ASDF:VERSION-SATISFIES (ASDF:ASDF-VERSIO |
7411
|
7422
|
;; This public variable will be bound shortly to the currently loaded version of ASDF.
|
7412
|
7423
|
(defvar *asdf-version* nil)
|
7413
|
7424
|
;; We need to clear systems from versions older than the one in this (private) parameter.
|
7414
|
|
- ;; The latest incompatible defclass is 2.32.13 renaming a slot in component;
|
|
7425
|
+ ;; The latest incompatible defclass is 2.32.13 renaming a slot in component,
|
|
7426
|
+ ;; or 3.2.0.2 for CCL (incompatibly changing some superclasses).
|
7415
|
7427
|
;; the latest incompatible gf change is in 3.1.7.20 (see redefined-functions below).
|
7416
|
|
- (defparameter *oldest-forward-compatible-asdf-version* "3.1.7.20")
|
|
7428
|
+ (defparameter *oldest-forward-compatible-asdf-version* "3.2.0.2")
|
7417
|
7429
|
;; Semi-private variable: a designator for a stream on which to output ASDF progress messages
|
7418
|
7430
|
(defvar *verbose-out* nil)
|
7419
|
7431
|
;; Private function by which ASDF outputs progress messages and warning messages:
|
... |
... |
@@ -7458,7 +7470,7 @@ previously-loaded version of ASDF." |
7458
|
7470
|
;; "3.4.5.67" would be a development version in the official branch, on top of 3.4.5.
|
7459
|
7471
|
;; "3.4.5.0.8" would be your eighth local modification of official release 3.4.5
|
7460
|
7472
|
;; "3.4.5.67.8" would be your eighth local modification of development version 3.4.5.67
|
7461
|
|
- (asdf-version "3.2.0")
|
|
7473
|
+ (asdf-version "3.2.1")
|
7462
|
7474
|
(existing-version (asdf-version)))
|
7463
|
7475
|
(setf *asdf-version* asdf-version)
|
7464
|
7476
|
(when (and existing-version (not (equal asdf-version existing-version)))
|
... |
... |
@@ -7487,7 +7499,15 @@ previously-loaded version of ASDF." |
7487
|
7499
|
(redefined-classes
|
7488
|
7500
|
;; redefining the classes causes interim circularities
|
7489
|
7501
|
;; with the old ASDF during upgrade, and many implementations bork
|
7490
|
|
- '((#:compile-concatenated-source-op (#:operation) ()))))
|
|
7502
|
+ #-clozure ()
|
|
7503
|
+ #+clozure
|
|
7504
|
+ '((#:compile-concatenated-source-op (#:operation) ())
|
|
7505
|
+ (#:compile-bundle-op (#:operation) ())
|
|
7506
|
+ (#:concatenate-source-op (#:operation) ())
|
|
7507
|
+ (#:dll-op (#:operation) ())
|
|
7508
|
+ (#:lib-op (#:operation) ())
|
|
7509
|
+ (#:monolithic-compile-bundle-op (#:operation) ())
|
|
7510
|
+ (#:monolithic-concatenate-source-op (#:operation) ()))))
|
7491
|
7511
|
(loop :for name :in redefined-functions
|
7492
|
7512
|
:for sym = (find-symbol* name :asdf nil)
|
7493
|
7513
|
:do (when sym (fmakunbound sym)))
|
... |
... |
@@ -8917,6 +8937,7 @@ Use of INITARGS is not supported at this time." |
8917
|
8937
|
(:use :uiop/common-lisp :uiop :asdf/upgrade
|
8918
|
8938
|
:asdf/component :asdf/system #:asdf/cache :asdf/find-system :asdf/find-component :asdf/operation)
|
8919
|
8939
|
(:import-from :asdf/operation #:check-operation-constructor)
|
|
8940
|
+ #-clisp (:unintern #:required-components #:traverse-action #:traverse-sub-actions)
|
8920
|
8941
|
(:export
|
8921
|
8942
|
#:action #:define-convenience-action-methods
|
8922
|
8943
|
#:action-description
|
... |
... |
@@ -8998,15 +9019,18 @@ and a class-name or class designates the canonical instance of the designated cl |
8998
|
9019
|
`(,function ,@prefix ,o ,c ,@suffix))))
|
8999
|
9020
|
`(progn
|
9000
|
9021
|
(defmethod ,function (,@prefix (,operation string) ,component ,@suffix ,@more-args)
|
|
9022
|
+ (declare (notinline ,function))
|
9001
|
9023
|
(let ((,component (find-component () ,component))) ;; do it first, for defsystem-depends-on
|
9002
|
9024
|
,(next-method `(safe-read-from-string ,operation :package :asdf/interface) component)))
|
9003
|
9025
|
(defmethod ,function (,@prefix (,operation symbol) ,component ,@suffix ,@more-args)
|
|
9026
|
+ (declare (notinline ,function))
|
9004
|
9027
|
(if ,operation
|
9005
|
9028
|
,(next-method
|
9006
|
9029
|
`(make-operation ,operation)
|
9007
|
9030
|
`(or (find-component () ,component) ,if-no-component))
|
9008
|
9031
|
,if-no-operation))
|
9009
|
9032
|
(defmethod ,function (,@prefix (,operation operation) ,component ,@suffix ,@more-args)
|
|
9033
|
+ (declare (notinline ,function))
|
9010
|
9034
|
(if (typep ,component 'component)
|
9011
|
9035
|
(error "No defined method for ~S on ~/asdf-action:format-action/"
|
9012
|
9036
|
',function (make-action ,operation ,component))
|
... |
... |
@@ -9621,6 +9645,8 @@ an OPERATION and a COMPONENT." |
9621
|
9645
|
;;;; Plan
|
9622
|
9646
|
|
9623
|
9647
|
(uiop/package:define-package :asdf/plan
|
|
9648
|
+ ;; asdf/action below is needed for required-components, traverse-action and traverse-sub-actions
|
|
9649
|
+ ;; that used to live there before 3.2.0.
|
9624
|
9650
|
(:recycle :asdf/plan :asdf)
|
9625
|
9651
|
(:use :uiop/common-lisp :uiop :asdf/upgrade
|
9626
|
9652
|
:asdf/component :asdf/operation :asdf/system
|
... |
... |
@@ -10174,7 +10200,7 @@ return a list of the components involved in building the desired action." |
10174
|
10200
|
#:build-op #:make
|
10175
|
10201
|
#:load-system #:load-systems #:load-systems*
|
10176
|
10202
|
#:compile-system #:test-system #:require-system
|
10177
|
|
- #:*load-system-operation* #:module-provide-asdf
|
|
10203
|
+ #:module-provide-asdf
|
10178
|
10204
|
#:component-loaded-p #:already-loaded-systems))
|
10179
|
10205
|
(in-package :asdf/operate)
|
10180
|
10206
|
|
... |
... |
@@ -10266,45 +10292,34 @@ But do NOT depend on it, for this is deprecated behavior.")) |
10266
|
10292
|
|
10267
|
10293
|
|
10268
|
10294
|
;;;; Common operations
|
10269
|
|
-(with-upgradability ()
|
10270
|
|
- (defvar *load-system-operation* 'load-op
|
10271
|
|
- "Operation used by ASDF:LOAD-SYSTEM. By default, ASDF:LOAD-OP.
|
10272
|
|
-You may override it with e.g. ASDF:LOAD-BUNDLE-OP from asdf/bundle
|
10273
|
|
-or ASDF:LOAD-SOURCE-OP if your fasl loading is somehow broken.
|
10274
|
|
-
|
10275
|
|
-The default operation may change in the future if we implement a
|
10276
|
|
-component-directed strategy for how to load or compile systems.")
|
10277
|
|
-
|
10278
|
|
- ;; In prepare-op for a system, propagate *load-system-operation* rather than load-op
|
|
10295
|
+(when-upgrading ()
|
10279
|
10296
|
(defmethod component-depends-on ((o prepare-op) (s system))
|
10280
|
|
- (loop :for (do . dc) :in (call-next-method)
|
10281
|
|
- :collect (cons (if (eq do 'load-op) *load-system-operation* do) dc)))
|
10282
|
|
-
|
|
10297
|
+ (call-next-method)))
|
|
10298
|
+(with-upgradability ()
|
10283
|
10299
|
(defclass build-op (non-propagating-operation) ()
|
10284
|
10300
|
(:documentation "Since ASDF3, BUILD-OP is the recommended 'master' operation,
|
10285
|
10301
|
to operate by default on a system or component, via the function BUILD.
|
10286
|
10302
|
Its meaning is configurable via the :BUILD-OPERATION option of a component.
|
10287
|
10303
|
which typically specifies the name of a specific operation to which to delegate the build,
|
10288
|
10304
|
as a symbol or as a string later read as a symbol (after loading the defsystem-depends-on);
|
10289
|
|
-if NIL is specified (the default), BUILD-OP falls back to the *LOAD-SYSTEM-OPERATION*
|
10290
|
|
-that will load the system in the current image, and its typically LOAD-OP."))
|
|
10305
|
+if NIL is specified (the default), BUILD-OP falls back to LOAD-OP,
|
|
10306
|
+that will load the system in the current image."))
|
10291
|
10307
|
(defmethod component-depends-on ((o build-op) (c component))
|
10292
|
|
- `((,(or (component-build-operation c) *load-system-operation*) ,c)
|
|
10308
|
+ `((,(or (component-build-operation c) 'load-op) ,c)
|
10293
|
10309
|
,@(call-next-method)))
|
10294
|
10310
|
|
10295
|
10311
|
(defun make (system &rest keys)
|
10296
|
10312
|
"The recommended way to interact with ASDF3.1 is via (ASDF:MAKE :FOO).
|
10297
|
10313
|
It will build system FOO using the operation BUILD-OP,
|
10298
|
10314
|
the meaning of which is configurable by the system, and
|
10299
|
|
-defaults to *LOAD-SYSTEM-OPERATION*, usually LOAD-OP,
|
10300
|
|
-to load it in current image."
|
|
10315
|
+defaults to LOAD-OP, to load it in current image."
|
10301
|
10316
|
(apply 'operate 'build-op system keys)
|
10302
|
10317
|
t)
|
10303
|
10318
|
|
10304
|
10319
|
(defun load-system (system &rest keys &key force force-not verbose version &allow-other-keys)
|
10305
|
10320
|
"Shorthand for `(operate 'asdf:load-op system)`. See OPERATE for details."
|
10306
|
10321
|
(declare (ignore force force-not verbose version))
|
10307
|
|
- (apply 'operate *load-system-operation* system keys)
|
|
10322
|
+ (apply 'operate 'load-op system keys)
|
10308
|
10323
|
t)
|
10309
|
10324
|
|
10310
|
10325
|
(defun load-systems* (systems &rest keys)
|
... |
... |
@@ -10366,8 +10381,7 @@ the implementation's REQUIRE rather than by internal ASDF mechanisms.")) |
10366
|
10381
|
(let* ((module (or (required-module s) (coerce-name s)))
|
10367
|
10382
|
(*modules-being-required* (cons module *modules-being-required*)))
|
10368
|
10383
|
(assert (null (component-children s)))
|
10369
|
|
- ;; CMUCL likes its module names to be all upcase.
|
10370
|
|
- (require (nest #+cmucl (string-upcase) module))))
|
|
10384
|
+ (require module)))
|
10371
|
10385
|
|
10372
|
10386
|
(defmethod resolve-dependency-combination (component (combinator (eql :require)) arguments)
|
10373
|
10387
|
(unless (and (length=n-p arguments 1)
|
... |
... |
@@ -10384,9 +10398,11 @@ the implementation's REQUIRE rather than by internal ASDF mechanisms.")) |
10384
|
10398
|
;; cl:require and asdf:operate that could potentially blow up the stack,
|
10385
|
10399
|
;; all the while defeating the consistency of the dependency graph.
|
10386
|
10400
|
(let* ((module (car arguments)) ;; NB: we already checked that it was not null
|
10387
|
|
- (name (string-downcase module))
|
10388
|
|
- (system (find-system name nil)))
|
10389
|
|
- (or system (let ((system (make-instance 'require-system :name name)))
|
|
10401
|
+ ;; CMUCL, MKCL, SBCL like their module names to be all upcase.
|
|
10402
|
+ (module-name (string module))
|
|
10403
|
+ (system-name (string-downcase module))
|
|
10404
|
+ (system (find-system system-name nil)))
|
|
10405
|
+ (or system (let ((system (make-instance 'require-system :name system-name :module module-name)))
|
10390
|
10406
|
(register-system system)
|
10391
|
10407
|
system))))
|
10392
|
10408
|
|
... |
... |
@@ -10396,10 +10412,11 @@ the implementation's REQUIRE rather than by internal ASDF mechanisms.")) |
10396
|
10412
|
;; with a name that is traditionally in lowercase. Case is lost along the way. That's fine.
|
10397
|
10413
|
;; We could make complex, non-portable rules to try to preserve case, and just documenting
|
10398
|
10414
|
;; them would be a hell that it would be a disservice to inflict on users.
|
10399
|
|
- (let ((module (string-downcase name)))
|
10400
|
|
- (unless (member module *modules-being-required* :test 'equal)
|
10401
|
|
- (let ((*modules-being-required* (cons module *modules-being-required*))
|
10402
|
|
- #+sbcl (sb-impl::*requiring* (remove module sb-impl::*requiring* :test 'equal)))
|
|
10415
|
+ (let ((module-name (string name))
|
|
10416
|
+ (system-name (string-downcase name)))
|
|
10417
|
+ (unless (member module-name *modules-being-required* :test 'equal)
|
|
10418
|
+ (let ((*modules-being-required* (cons module-name *modules-being-required*))
|
|
10419
|
+ #+sbcl (sb-impl::*requiring* (remove module-name sb-impl::*requiring* :test 'equal)))
|
10403
|
10420
|
(handler-bind
|
10404
|
10421
|
((style-warning #'muffle-warning)
|
10405
|
10422
|
(missing-component (constantly nil))
|
... |
... |
@@ -10408,9 +10425,9 @@ the implementation's REQUIRE rather than by internal ASDF mechanisms.")) |
10408
|
10425
|
(format *error-output* (compatfmt "~@<ASDF could not load ~(~A~) because ~A.~@:>~%")
|
10409
|
10426
|
name e))))
|
10410
|
10427
|
(let ((*verbose-out* (make-broadcast-stream)))
|
10411
|
|
- (let ((system (find-system module nil)))
|
|
10428
|
+ (let ((system (find-system system-name nil)))
|
10412
|
10429
|
(when system
|
10413
|
|
- (require-system system :verbose nil)
|
|
10430
|
+ (require-system system-name :verbose nil)
|
10414
|
10431
|
t)))))))))
|
10415
|
10432
|
|
10416
|
10433
|
|
... |
... |
@@ -10737,10 +10754,11 @@ system names contained using COERCE-NAME. Return the result." |
10737
|
10754
|
(nest
|
10738
|
10755
|
(with-asdf-cache ())
|
10739
|
10756
|
(let* ((name (coerce-name name))
|
10740
|
|
- (source-file (if sfp source-file (resolve-symlinks* (load-pathname))))
|
10741
|
|
- (asd-name (and source-file
|
10742
|
|
- (equalp "asd" (pathname-type source-file))
|
10743
|
|
- (pathname-name source-file)))
|
|
10757
|
+ (source-file (if sfp source-file (resolve-symlinks* (load-pathname))))))
|
|
10758
|
+ (flet ((fix-case (x) (if (logical-pathname-p source-file) (string-downcase x) x))))
|
|
10759
|
+ (let* ((asd-name (and source-file
|
|
10760
|
+ (equal "asd" (fix-case (pathname-type source-file)))
|
|
10761
|
+ (fix-case (pathname-name source-file))))
|
10744
|
10762
|
(primary-name (primary-system-name name)))
|
10745
|
10763
|
(when (and asd-name (not (equal asd-name primary-name)))
|
10746
|
10764
|
(warn (make-condition 'bad-system-name :source-file source-file :name name))))
|
... |
... |
@@ -10803,7 +10821,7 @@ system names contained using COERCE-NAME. Return the result." |
10803
|
10821
|
(in-package :asdf/bundle)
|
10804
|
10822
|
|
10805
|
10823
|
(with-upgradability ()
|
10806
|
|
- (defclass bundle-op (basic-compile-op)
|
|
10824
|
+ (defclass bundle-op (operation)
|
10807
|
10825
|
;; NB: use of instance-allocated slots for operations is DEPRECATED
|
10808
|
10826
|
;; and only supported in a temporary fashion for backward compatibility.
|
10809
|
10827
|
;; Supported replacement: Define slots on program-system instead.
|
... |
... |
@@ -10882,17 +10900,17 @@ itself.")) |
10882
|
10900
|
;; Using load-op as the goal operation and basic-compile-op as the keep-operation works
|
10883
|
10901
|
;; for our needs of gathering all the files we want to include in a bundle.
|
10884
|
10902
|
;; Note that we use basic-compile-op rather than compile-op so it will still work on
|
10885
|
|
- ;; systems when *load-system-operation* is load-bundle-op.
|
|
10903
|
+ ;; systems that would somehow load dependencies with load-bundle-op.
|
10886
|
10904
|
(required-components
|
10887
|
10905
|
s :other-systems mono :component-type component-type :keep-component keep-component
|
10888
|
10906
|
:goal-operation 'load-op :keep-operation 'basic-compile-op)))
|
10889
|
10907
|
`((,go ,@deps) ,@(call-next-method))))
|
10890
|
10908
|
|
10891
|
10909
|
;; Create a single fasl for the entire library
|
10892
|
|
- (defclass basic-compile-bundle-op (bundle-op)
|
|
10910
|
+ (defclass basic-compile-bundle-op (bundle-op basic-compile-op)
|
10893
|
10911
|
((gather-type :initform #-(or clasp ecl mkcl) :fasl #+(or clasp ecl mkcl) :object
|
10894
|
10912
|
:allocation :class)
|
10895
|
|
- (bundle-type :initform :fasl :allocation :class))
|
|
10913
|
+ (bundle-type :initform :fasb :allocation :class))
|
10896
|
10914
|
(:documentation "Base class for compiling into a bundle"))
|
10897
|
10915
|
|
10898
|
10916
|
;; Analog to prepare-op, for load-bundle-op and compile-bundle-op
|
... |
... |
@@ -10999,6 +11017,8 @@ for all the linkable object files associated with the system or its dependencies |
10999
|
11017
|
((eql :no-output-file) ;; marker for a bundle-type that has NO output file
|
11000
|
11018
|
(error "No output file, therefore no pathname type"))
|
11001
|
11019
|
((eql :fasl) ;; the type of a fasl
|
|
11020
|
+ (compile-file-type)) ; on image-based platforms, used as input and output
|
|
11021
|
+ ((eql :fasb) ;; the type of a fasl
|
11002
|
11022
|
#-(or clasp ecl mkcl) (compile-file-type) ; on image-based platforms, used as input and output
|
11003
|
11023
|
#+(or clasp ecl mkcl) "fasb") ; on C-linking platforms, only used as output for system bundles
|
11004
|
11024
|
((member :image)
|
... |
... |
@@ -11056,7 +11076,7 @@ e.g. as part of the implementation, of an outer build system that calls into ASD |
11056
|
11076
|
or of opaque libraries shipped along the source code."))
|
11057
|
11077
|
|
11058
|
11078
|
(defclass precompiled-system (system)
|
11059
|
|
- ((build-pathname :initarg :fasl))
|
|
11079
|
+ ((build-pathname :initarg :fasb :initarg :fasl))
|
11060
|
11080
|
(:documentation "Class For a system that is delivered as a precompiled fasl"))
|
11061
|
11081
|
|
11062
|
11082
|
(defclass prebuilt-system (system)
|
... |
... |
@@ -11123,7 +11143,7 @@ or of opaque libraries shipped along the source code.")) |
11123
|
11143
|
(if monolithic 'monolithic-dll-op 'dll-op))
|
11124
|
11144
|
((:lib :static-library)
|
11125
|
11145
|
(if monolithic 'monolithic-lib-op 'lib-op))
|
11126
|
|
- ((:fasl)
|
|
11146
|
+ ((:fasb)
|
11127
|
11147
|
(if monolithic 'monolithic-compile-bundle-op 'compile-bundle-op))
|
11128
|
11148
|
((:image)
|
11129
|
11149
|
'image-op)
|
... |
... |
@@ -11215,7 +11235,7 @@ or of opaque libraries shipped along the source code.")) |
11215
|
11235
|
(dependencies
|
11216
|
11236
|
(if (operation-monolithic-p o)
|
11217
|
11237
|
;; We want only dependencies, and we use basic-load-op rather than load-op so that
|
11218
|
|
- ;; this will keep working on systems when *load-system-operation* is load-bundle-op
|
|
11238
|
+ ;; this will keep working on systems that load dependencies with load-bundle-op
|
11219
|
11239
|
(remove-if-not 'builtin-system-p
|
11220
|
11240
|
(required-components s :component-type 'system
|
11221
|
11241
|
:keep-operation 'basic-load-op))
|
... |
... |
@@ -11286,11 +11306,6 @@ which is probably not what you want; you probably need to tweak your output tran |
11286
|
11306
|
|
11287
|
11307
|
#+(or clasp ecl mkcl)
|
11288
|
11308
|
(with-upgradability ()
|
11289
|
|
-
|
11290
|
|
- #+ecl ;; doesn't work on clasp or mkcl (yet?).
|
11291
|
|
- (unless (use-ecl-byte-compiler-p)
|
11292
|
|
- (setf *load-system-operation* 'load-bundle-op))
|
11293
|
|
-
|
11294
|
11309
|
(defun system-module-pathname (module)
|
11295
|
11310
|
(let ((name (coerce-name module)))
|
11296
|
11311
|
(some
|
... |
... |
@@ -11298,6 +11313,7 @@ which is probably not what you want; you probably need to tweak your output tran |
11298
|
11313
|
(list
|
11299
|
11314
|
#+clasp (compile-file-pathname (make-pathname :name name :defaults "sys:") :output-type :object)
|
11300
|
11315
|
#+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :lib)
|
|
11316
|
+ #+ecl (compile-file-pathname (make-pathname :name (strcat "lib" name) :defaults "sys:") :type :lib)
|
11301
|
11317
|
#+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :object)
|
11302
|
11318
|
#+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:")
|
11303
|
11319
|
#+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:contrib;")))))
|
... |
... |
@@ -11309,22 +11325,30 @@ which is probably not what you want; you probably need to tweak your output tran |
11309
|
11325
|
:name (coerce-name name)
|
11310
|
11326
|
:static-library (resolve-symlinks* pathname))))
|
11311
|
11327
|
|
|
11328
|
+ (defun linkable-system (x)
|
|
11329
|
+ (or (if-let (s (find-system x))
|
|
11330
|
+ (and (system-source-file x) s))
|
|
11331
|
+ (if-let (p (system-module-pathname (coerce-name x)))
|
|
11332
|
+ (make-prebuilt-system x p))))
|
|
11333
|
+
|
11312
|
11334
|
(defmethod component-depends-on :around ((o image-op) (c system))
|
11313
|
|
- (destructuring-bind ((lib-op . deps)) (call-next-method)
|
11314
|
|
- (labels ((has-it-p (x) (find x deps :test 'equal :key 'coerce-name))
|
11315
|
|
- (ensure-linkable-system (x)
|
11316
|
|
- (unless (has-it-p x)
|
11317
|
|
- (or (if-let (s (find-system x))
|
11318
|
|
- (and (system-source-directory x)
|
11319
|
|
- (list s)))
|
11320
|
|
- (if-let (p (system-module-pathname x))
|
11321
|
|
- (list (make-prebuilt-system x p)))))))
|
11322
|
|
- `((,lib-op
|
|
11335
|
+ (let* ((next (call-next-method))
|
|
11336
|
+ (deps (make-hash-table :test 'equal))
|
|
11337
|
+ (linkable (loop* :for (do . dcs) :in next :collect
|
|
11338
|
+ (cons do
|
|
11339
|
+ (loop :for dc :in dcs
|
|
11340
|
+ :for dep = (and dc (resolve-dependency-spec c dc))
|
|
11341
|
+ :when dep
|
|
11342
|
+ :do (setf (gethash (coerce-name (component-system dep)) deps) t)
|
|
11343
|
+ :collect (or (and (typep dep 'system) (linkable-system dep)) dep))))))
|
|
11344
|
+ `((lib-op
|
11323
|
11345
|
,@(unless (no-uiop c)
|
11324
|
|
- (append (ensure-linkable-system "cmp")
|
11325
|
|
- (or (ensure-linkable-system "uiop")
|
11326
|
|
- (ensure-linkable-system "asdf"))))
|
11327
|
|
- ,@deps)))))
|
|
11346
|
+ (list (linkable-system "cmp")
|
|
11347
|
+ (unless (or (gethash "uiop" deps) (gethash "asdf" deps))
|
|
11348
|
+ (or (linkable-system "uiop")
|
|
11349
|
+ (linkable-system "asdf")
|
|
11350
|
+ "asdf")))))
|
|
11351
|
+ ,@linkable)))
|
11328
|
11352
|
|
11329
|
11353
|
(defmethod perform ((o link-op) (c system))
|
11330
|
11354
|
(let* ((object-files (input-files o c))
|
... |
... |
@@ -12096,6 +12120,19 @@ after having found a .asd file? True by default.") |
12096
|
12120
|
(collect (list directory :recurse recurse :exclude exclude))))))
|
12097
|
12121
|
:test 'equal :from-end t))
|
12098
|
12122
|
|
|
12123
|
+ ;; MAYBE: move this utility function to uiop/pathname and export it?
|
|
12124
|
+ (defun pathname-directory-depth (p)
|
|
12125
|
+ (length (normalize-pathname-directory-component (pathname-directory p))))
|
|
12126
|
+
|
|
12127
|
+ (defun preferred-source-path-p (x y)
|
|
12128
|
+ "Return T iff X is to be preferred over Y as a source path"
|
|
12129
|
+ (let ((lx (pathname-directory-depth x))
|
|
12130
|
+ (ly (pathname-directory-depth y)))
|
|
12131
|
+ (or (< lx ly)
|
|
12132
|
+ (and (= lx ly)
|
|
12133
|
+ (string< (namestring x)
|
|
12134
|
+ (namestring y))))))
|
|
12135
|
+
|
12099
|
12136
|
;; Will read the configuration and initialize all internal variables.
|
12100
|
12137
|
(defun compute-source-registry (&optional (parameter *source-registry-parameter*)
|
12101
|
12138
|
(registry *source-registry*))
|
... |
... |
@@ -12114,18 +12151,21 @@ after having found a .asd file? True by default.") |
12114
|
12151
|
;; instead of (load-system 'foo)
|
12115
|
12152
|
(string-downcase name)
|
12116
|
12153
|
name)))
|
12117
|
|
- (cond
|
12118
|
|
- ((gethash name registry) ; already shadowed by something else
|
12119
|
|
- nil)
|
12120
|
|
- ((gethash name h) ; conflict at current level
|
12121
|
|
- (when *verbose-out*
|
12122
|
|
- (warn (compatfmt "~@<In source-registry entry ~A~@[/~*~] ~
|
12123
|
|
- found several entries for ~A - picking ~S over ~S~:>")
|
12124
|
|
- directory recurse name (gethash name h) asd)))
|
12125
|
|
- (t
|
12126
|
|
- (setf (gethash name registry) asd)
|
12127
|
|
- (setf (gethash name h) asd))))))
|
12128
|
|
- h)))
|
|
12154
|
+ (unless (gethash name registry) ; already shadowed by something else
|
|
12155
|
+ (if-let (old (gethash name h))
|
|
12156
|
+ ;; If the name appears multiple times,
|
|
12157
|
+ ;; prefer the one with the shallowest directory,
|
|
12158
|
+ ;; or if they have same depth, compare unix-namestring with string<
|
|
12159
|
+ (multiple-value-bind (better worse)
|
|
12160
|
+ (if (preferred-source-path-p asd old)
|
|
12161
|
+ (progn (setf (gethash name h) asd) (values asd old))
|
|
12162
|
+ (values old asd))
|
|
12163
|
+ (when *verbose-out*
|
|
12164
|
+ (warn (compatfmt "~@<In source-registry entry ~A~@[/~*~] ~
|
|
12165
|
+ found several entries for ~A - picking ~S over ~S~:>")
|
|
12166
|
+ directory recurse name better worse)))
|
|
12167
|
+ (setf (gethash name h) asd))))))
|
|
12168
|
+ (maphash #'(lambda (k v) (setf (gethash k registry) v)) h))))
|
12129
|
12169
|
(values))
|
12130
|
12170
|
|
12131
|
12171
|
(defun initialize-source-registry (&optional (parameter *source-registry-parameter*))
|
... |
... |
@@ -12635,7 +12675,6 @@ DEPRECATED. Use ASDF:ACTION-DESCRIPTION and/or ASDF::FORMAT-ACTION instead.")) |
12635
|
12675
|
#:*compile-file-warnings-behaviour*
|
12636
|
12676
|
#:*compile-file-failure-behaviour*
|
12637
|
12677
|
#:*resolve-symlinks*
|
12638
|
|
- #:*load-system-operation*
|
12639
|
12678
|
#:*asdf-verbose* ;; unused. For backward-compatibility only.
|
12640
|
12679
|
#:*verbose-out*
|
12641
|
12680
|
|