July 13, 2008
Collecting ASDF system dependencies
Here’s a snippet that will recursively collect all dependencies of one or more ASDF systems:
(asdf:oos 'asdf:load-op 'asdf) (asdf:oos 'asdf:load-op 'metatilities) (defun direct-dependencies (component) (cdadr (asdf:component-depends-on 'asdf:load-op (asdf:find-component nil component)))) (defun normalize-system-id (id) (intern (symbol-name id) "KEYWORD")) (defun %effective-dependencies (components) "Helper function." (when components (remove-duplicates (append components (%effective-dependencies (mapcar #'normalize-system-id (remove-if #'null (metatilities:flatten (mapcar #'direct-dependencies components)))))) :test #'eq))) (defun effective-dependencies (components) "Find all dependencies needed for the list of COMPONENTS (which may be an atom, too)." (let ((components (metatilities:ensure-list components))) (set-difference (%effective-dependencies components) components :key #'normalize-system-id))) ;; usage (effective-dependencies :weblocks) (:LW-COMPAT :CLOSER-MOP :MOPTILITIES :METATILITIES-BASE :TRIVIAL-GRAY-STREAMS :ASDF-SYSTEM-CONNECTIONS :METABANG-DYNAMIC-CLASSES :FLEXI-STREAMS :CFFI :SB-GROVEL :CL-CONTAINERS :METABANG-BIND :CHUNGA :CL-BASE64 :CL-FAD :CL-PPCRE :CL+SSL :MD5 :RFC2388 :SB-BSD-SOCKETS :SB-POSIX :URL-REWRITE :PARENSCRIPT :FARE-UTILS :METATILITIES :HUNCHENTOOT :CL-WHO :CL-JSON :PURI :FARE-MATCHER :CL-CONT :ITERATE)
Comments(11)