|
33 | 33 | (and (<= 3 (length name)) |
34 | 34 | (string= name "sb-" :end1 3))) |
35 | 35 |
|
| 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 | + |
36 | 55 | (defun dependency-list-dependency (list) |
37 | 56 | (ecase (first list) |
38 | 57 | ((:version :require) (second list)) |
39 | | - (:feature (normalize-dependency (third list))))) |
| 58 | + (:feature |
| 59 | + (when (evaluate-feature-expression (second list)) |
| 60 | + (normalize-dependency (third list)))))) |
40 | 61 |
|
41 | 62 | (defun normalize-dependency (name) |
42 | 63 | (cond ((and (consp name) |
43 | 64 | (keywordp (first name))) |
44 | | - (string-downcase (dependency-list-dependency name))) |
| 65 | + (let ((dependency (dependency-list-dependency name))) |
| 66 | + (when dependency |
| 67 | + (string-downcase dependency)))) |
45 | 68 | ((or (symbolp name) (stringp name)) |
46 | 69 | (string-downcase name)) |
47 | 70 | (t (error "Don't know how to normalize ~S" name)))) |
|
55 | 78 | (prereqs (getf (cddr form) :defsystem-depends-on)) |
56 | 79 | (weak (getf (cddr form) :weakly-depends-on))) |
57 | 80 | (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))))) |
59 | 83 | (funcall old-hook fun form env))) |
60 | 84 |
|
61 | 85 | (defvar *in-find-system* nil) |
|
0 commit comments