Skip to content
sbcl.lisp 2.04 KiB
Newer Older
;;; -*- Mode: Lisp ; Syntax: ANSI-Common-Lisp -*-

#+xcvb (module (:depends-on ("bundle")))

(in-package :asdf)

(declaim (optimize (debug 3) (safety 3) (speed 1)))

(defun concatenate-files (inputs output)
  (let ((infiles (mapcar #'sb-ext:native-namestring inputs))
        (outfile (sb-ext:native-namestring output)))
    (assert
     (= 0 (sb-ext:process-exit-code 
           #+win32
           (sb-ext:run-program
            "copy" `("/b" ,@(loop :for (i . morep) :on infiles
                                  :collect i :when morep :collect "+") ,output)
            :input nil :output nil :error nil :wait t)
           #-win32
           (sb-ext:run-program
            "cat" infiles :output outfile
            :if-output-exists :supersede :external-format :latin1
            :input nil :error nil :search t :wait t))))))

(defun combine-fasls (inputs outputs)
  (assert (length=n-p outputs 1))
  (ensure-directories-exist (first outputs))
  (concatenate-files inputs (first outputs)))

(defmethod perform ((o bundle-op) (c system))
  (let* ((input-files (input-files o c))
         (fasl-files (remove "fasl" input-files :key #'pathname-type :test-not #'string=))
         (non-fasl-files (remove "fasl" input-files :key #'pathname-type :test #'string=))
         (output-files (output-files o c))
         (output-file (first output-files)))
    (when input-files
      (assert output-files)
      (when non-fasl-files
        (error "On SBCL, asdf-bundle can only bundle FASL files, but these were also produced: ~S" non-fasl-files))
      (when (and (typep o 'monolithic-bundle-op)
                 (or (monolithic-op-prologue-code o) (monolithic-op-epilogue-code o)))
        (error "prologue-code and epilogue-code are not supported on SBCL"))
      (ensure-directories-exist output-file)
      (combine-fasls fasl-files output-files))))


;;; On SBCL, everything happens in the lib-op dependency
(defmethod output-files ((o fasl-op) (c component))
  (declare (ignorable o c))
  nil)

(defmethod input-files ((o fasl-op) (c component))
  (declare (ignorable o c))
  nil)