concatenate-source.lisp 6.03 KB
Newer Older
1 2 3
;;;; -------------------------------------------------------------------------
;;;; Concatenate-source

4 5
(asdf/package:define-package :asdf/concatenate-source
  (:recycle :asdf/concatenate-source :asdf)
6 7
  (:use :common-lisp :asdf/driver :asdf/upgrade
   :asdf/component :asdf/operation
8 9
   :asdf/system :asdf/find-system :asdf/defsystem
   :asdf/action :asdf/lisp-action :asdf/bundle)
10 11 12 13 14 15 16 17 18 19
  (:export
   #:concatenate-source-op
   #:load-concatenated-source-op
   #:compile-concatenated-source-op
   #:load-compiled-concatenated-source-op
   #:monolithic-concatenate-source-op
   #:monolithic-load-concatenated-source-op
   #:monolithic-compile-concatenated-source-op
   #:monolithic-load-compiled-concatenated-source-op
   #:concatenated-source-system
20 21
   #:component-concatenated-source-file
   #:concatenated-source-file))
22 23 24 25 26
(in-package :asdf/concatenate-source)

;;;
;;; Concatenate sources
;;;
27 28 29 30 31 32 33 34 35
(defclass concatenate-source-op (bundle-op)
  ((bundle-type :initform "lisp")))
(defclass load-concatenated-source-op (basic-load-op operation)
  ((bundle-type :initform :no-output-file)))
(defclass compile-concatenated-source-op (basic-compile-op bundle-op)
  ((bundle-type :initform :fasl)))
(defclass load-compiled-concatenated-source-op (basic-load-op operation)
  ((bundle-type :initform :no-output-file)))

36 37 38 39 40
(defclass monolithic-concatenate-source-op (concatenate-source-op monolithic-op) ())
(defclass monolithic-load-concatenated-source-op (load-concatenated-source-op monolithic-op) ())
(defclass monolithic-compile-concatenated-source-op (compile-concatenated-source-op monolithic-op) ())
(defclass monolithic-load-compiled-concatenated-source-op (load-compiled-concatenated-source-op monolithic-op) ())

41 42 43
(defclass concatenated-source-system (bundle-system)
  ((bundle-pathname :initarg :concatenated-source-file)
   (bundle-operation :initform :load-compiled-concatenated-source-op)))
44

45 46
(defmethod input-files ((operation concatenate-source-op) (s system))
  (loop :with encoding = (or (component-encoding s) *default-encoding*)
47 48 49
        :with other-encodings = '()
        :with around-compile = (around-compile-hook s)
        :with other-around-compile = '()
50 51 52 53 54 55 56 57 58 59 60 61 62 63
        :for c :in (gather-components s
                                      :goal-operation 'compile-op
                                      :keep-operation 'compile-op
                                      :component-type 'component
                                      :other-systems (operation-monolithic-p operation))
        :append
        (when (typep c 'cl-source-file)
          (let ((e (component-encoding c)))
            (unless (equal e encoding)
              (pushnew e other-encodings :test 'equal)))
          (let ((a (around-compile-hook c)))
            (unless (equal a around-compile)
              (pushnew a other-around-compile :test 'equal)))
          (input-files (make-operation 'compile-op) c)) :into inputs
64 65 66
        :finally
           (when other-encodings
             (warn "~S uses encoding ~A but has sources that use these encodings: ~A"
67
                   operation encoding other-encodings))
68 69
           (when other-around-compile
             (warn "~S uses around-compile hook ~A but has sources that use these hooks: ~A"
70
                   operation around-compile other-around-compile))
71 72 73 74 75 76 77 78 79 80 81 82
           (return inputs)))

(defmethod input-files ((o load-concatenated-source-op) (s system))
  (output-files (find-operation o 'concatenate-source-op) s))
(defmethod input-files ((o compile-concatenated-source-op) (s system))
  (output-files (find-operation o 'concatenate-source-op) s))
(defmethod output-files ((o compile-concatenated-source-op) (s system))
  (let ((input (first (input-files o s))))
    (list (compile-file-pathname input))))
(defmethod input-files ((o load-compiled-concatenated-source-op) (s system))
  (output-files (find-operation o 'compile-concatenated-source-op) s))

83 84 85 86 87 88 89 90 91 92
(defmethod input-files ((o monolithic-load-concatenated-source-op) (s system))
  (output-files (find-operation o 'monolithic-concatenate-source-op) s))
(defmethod input-files ((o monolithic-compile-concatenated-source-op) (s system))
  (output-files (find-operation o 'monolithic-concatenate-source-op) s))
(defmethod output-files ((o monolithic-compile-concatenated-source-op) (s system))
  (let ((input (first (input-files o s))))
    (list (compile-file-pathname input))))
(defmethod input-files ((o monolithic-load-compiled-concatenated-source-op) (s system))
  (output-files (find-operation o 'monolithic-compile-concatenated-source-op) s))

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
(defmethod perform ((o concatenate-source-op) (s system))
  (let ((inputs (input-files o s))
        (output (output-file o s)))
    (concatenate-files inputs output)))
(defmethod perform ((o load-concatenated-source-op) (s system))
  (perform-lisp-load-source o s))
(defmethod perform ((o compile-concatenated-source-op) (s system))
  (perform-lisp-compilation o s))
(defmethod perform ((o load-compiled-concatenated-source-op) (s system))
  (perform-lisp-load-fasl o s))

(defmethod component-depends-on ((o concatenate-source-op) (s system))
  (declare (ignorable o s)) nil)
(defmethod component-depends-on ((o load-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((prepare-op ,s) (concatenate-source-op ,s)))
(defmethod component-depends-on ((o compile-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((concatenate-source-op ,s)))
(defmethod component-depends-on ((o load-compiled-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((compile-concatenated-source-op ,s)))

(defmethod component-depends-on ((o monolithic-concatenate-source-op) (s system))
  (declare (ignorable o s)) nil)
(defmethod component-depends-on ((o monolithic-load-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((monolithic-concatenate-source-op ,s)))
(defmethod component-depends-on ((o monolithic-compile-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((monolithic-concatenate-source-op ,s)))
(defmethod component-depends-on ((o monolithic-load-compiled-concatenated-source-op) (s system))
  (declare (ignorable o s)) `((monolithic-compile-concatenated-source-op ,s)))