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

4
5
(asdf/package:define-package :asdf/concatenate-source
  (:recycle :asdf/concatenate-source :asdf)
6
  (:use :asdf/common-lisp :asdf/driver :asdf/upgrade
7
   :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
  (: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
19
20
   #:component-concatenated-source-file
   #:concatenated-source-file))
21
22
23
24
25
(in-package :asdf/concatenate-source)

;;;
;;; Concatenate sources
;;;
26
27
28
29
30
31
32
33
34
(with-upgradability ()
  (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)))
35

36
37
38
39
  (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) ())
40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  (defmethod input-files ((operation concatenate-source-op) (s system))
    (loop :with encoding = (or (component-encoding s) *default-encoding*)
          :with other-encodings = '()
          :with around-compile = (around-compile-hook s)
          :with other-around-compile = '()
          :for c :in (required-components
                      s :goal-operation 'compile-op
                        :keep-operation 'compile-op
                        :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
          :finally
             (when other-encodings
               (warn "~S uses encoding ~A but has sources that use these encodings: ~A"
                     operation encoding other-encodings))
             (when other-around-compile
               (warn "~S uses around-compile hook ~A but has sources that use these hooks: ~A"
                     operation around-compile other-around-compile))
             (return inputs)))
67

68
69
70
71
72
73
74
75
76
  (defmethod input-files ((o load-concatenated-source-op) (s system))
    (direct-dependency-files o s))
  (defmethod input-files ((o compile-concatenated-source-op) (s system))
    (direct-dependency-files o 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))
    (direct-dependency-files o s))
77

78
79
80
81
82
83
84
85
86
87
  (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))
88

89
90
91
92
93
94
95
96
  (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)))
97

98
99
100
101
102
103
104
105
  (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))))
106