Skip to content

Commit 870c40c

Browse files
committed
Evaluate ASDF feature expressions when computing dependencies.
This fixes how e.g. trivial-file-size relies on "osi" -- but only if the right features are present.
1 parent e145fe7 commit 870c40c

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

depcheck.lisp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,38 @@
3333
(and (<= 3 (length name))
3434
(string= name "sb-" :end1 3)))
3535

36+
(defun evaluate-feature-expression (expression)
37+
(labels ((evaluate-boolean (expression)
38+
(ecase (first expression)
39+
(:and (evaluate-and expression))
40+
(:or (evaluate-or expression))
41+
(:not (evaluate-not expression))))
42+
(evaluate-and (expression)
43+
(every #'evaluate-feature-expression (rest expression)))
44+
(evaluate-or (expression)
45+
(some #'evaluate-feature-expression (rest expression)))
46+
(evaluate-not (expression)
47+
(not (evaluate-feature-expression (second expression)))))
48+
(cond ((keywordp expression)
49+
(not (not (position expression *features*))))
50+
((consp expression)
51+
(evaluate-boolean expression))
52+
(t
53+
(error "Badly formed feature expression - ~S" expression)))))
54+
3655
(defun dependency-list-dependency (list)
3756
(ecase (first list)
3857
((:version :require) (second list))
39-
(:feature (normalize-dependency (third list)))))
58+
(:feature
59+
(when (evaluate-feature-expression (second list))
60+
(normalize-dependency (third list))))))
4061

4162
(defun normalize-dependency (name)
4263
(cond ((and (consp name)
4364
(keywordp (first name)))
44-
(string-downcase (dependency-list-dependency name)))
65+
(let ((dependency (dependency-list-dependency name)))
66+
(when dependency
67+
(string-downcase dependency))))
4568
((or (symbolp name) (stringp name))
4669
(string-downcase name))
4770
(t (error "Don't know how to normalize ~S" name))))
@@ -55,7 +78,8 @@
5578
(prereqs (getf (cddr form) :defsystem-depends-on))
5679
(weak (getf (cddr form) :weakly-depends-on)))
5780
(setf deps (append deps prereqs weak))
58-
(setf *direct-dependencies* (mapcar 'normalize-dependency deps))))
81+
(setf *direct-dependencies* (remove nil
82+
(mapcar 'normalize-dependency deps)))))
5983
(funcall old-hook fun form env)))
6084

6185
(defvar *in-find-system* nil)

0 commit comments

Comments
 (0)