select-by-inputs.scm 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. (use-modules (gnu packages)
  2. (guix packages)
  3. (ice-9 match)
  4. (srfi srfi-1)
  5. (srfi srfi-26))
  6. ;;; Taken from common-input.scm.
  7. (define* (package-all-inputs package #:key transitive?)
  8. (filter
  9. package? ;eliminate origin objects
  10. (map (match-lambda
  11. ((name package output ...)
  12. package))
  13. (delete-duplicates
  14. (remove null?
  15. (if transitive?
  16. (append (package-transitive-inputs package)
  17. (package-transitive-native-inputs package)
  18. (package-transitive-propagated-inputs package))
  19. (append (package-inputs package)
  20. (package-native-inputs package)
  21. (package-propagated-inputs package))))))))
  22. (define* (has-input? package input #:key (transitive? #t))
  23. "True if PACKAGE has INPUT among its dependency closure graph."
  24. (member input (package-all-inputs package #:transitive? transitive?)))
  25. (define (run-example)
  26. ;; Find which package depends on fontconfig but not on librsvg.
  27. (let ((librsvg (specification->package "librsvg@2.40.21"))
  28. (fontconfig (specification->package "fontconfig")))
  29. (fold-packages (lambda (package result)
  30. (if (and (has-input? package fontconfig)
  31. (not (has-input? package librsvg)))
  32. (cons package result)
  33. result))
  34. '())))