fancy-build/example/fancy.build

64 lines
2.8 KiB
Plaintext

(defun runp (cmd)
(assert (zerop (uiop:wait-process (uiop:launch-program cmd :output *standard-output* :error-output *error-output*)))))
(defclass c-source-buildable (rebuilt-on-file-change)
((source-file :initarg :source-file)
(obj-file :initarg :obj-file)))
(defclass c-binary-buildable (rebuilt-on-file-change)
((target-binary :initarg :target-binary)
(obj-files)))
(defmethod initialize-instance :after ((b c-binary-buildable) &key)
(setf (slot-value b 'obj-files) (mapcar #'(lambda (x) (slot-value x 'obj-file)) (remove-if-not #'(lambda (x) (typep x 'c-source-buildable)) (slot-value b 'dependencies))))
(setf (slot-value b 'input-files) (slot-value b 'obj-files))
(setf (slot-value b 'output-files) (list (slot-value b 'target-binary)))
(setf (slot-value b 'pretty-name) (slot-value b 'target-binary))
(setf (slot-value b 'unique-key) (cons 'c-binary-buildable (cons (slot-value b 'target-binary) (slot-value b 'obj-files)))))
(defmethod do-build ((b c-binary-buildable))
(runp (format nil "cc -o ~a ~{~a~^ ~}" (slot-value b 'target-binary) (slot-value b 'obj-files))))
(defmethod initialize-instance :after ((b c-source-buildable) &key)
(setf (slot-value b 'input-files) (list (slot-value b 'source-file)))
(setf (slot-value b 'output-files) (list (slot-value b 'obj-file)))
(setf (slot-value b 'pretty-name) (slot-value b 'source-file))
(setf (slot-value b 'unique-key) (list 'c-source-buildable (slot-value b 'obj-file) (slot-value b 'source-file))))
(defmethod do-build ((b c-source-buildable))
(ensure-directories-exist (directory-namestring (slot-value b 'obj-file)))
(runp (format nil "cc -c -o ~a ~a" (slot-value b 'obj-file) (slot-value b 'source-file))))
(defun c-source (file)
(make-instance 'c-source-buildable
:source-file file
:obj-file (format nil "build/~a.o" file)))
(defun c-sourcelist (srclist)
(mapcar #'c-source srclist))
;(c-sourcelist srclist)
(defun c-binary (bin deps)
(make-instance 'c-binary-buildable
:target-binary (format nil "build/~a" bin)
:dependencies deps))
(defparameter *t1*
(c-binary "test"
(c-sourcelist '("src/add.c" "src/test.c"))))
(defparameter *t2*
(c-binary "test2"
(c-sourcelist '("src/add.c" "src/test2.c"))))
;(defparameter x (make-instance 'c-source-buildable
; :source-file "test/test.c"
; :obj-file "build/test/test.o"))
;(defparameter y (make-instance 'c-source-buildable
; :source-file "test/add.c"
; :obj-file "build/test/add.o"))
;(defparameter z (make-instance 'c-binary-buildable
; :target-binary "build/test/test"
; :dependencies (list x y)))
(target "default" *t1*)
(target "other" *t2*)