Skip to content
self-upgrade.lisp 1.82 KiB
Newer Older
Francois-Rene Rideau's avatar
Francois-Rene Rideau committed
;;; Shell command-line interface for XCVB

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

Francois-Rene Rideau's avatar
Francois-Rene Rideau committed

(declaim (optimize (speed 1) (safety 3) (compilation-speed 0) (debug 3)))

(defun reduce-xcvb-version (version)
  (subseq version 0
	  (position-if-not (lambda (x) (or (digit-char-p x) (eql x #\.))) version)))
Francois-Rene Rideau's avatar
Francois-Rene Rideau committed

(defun ensure-required-xcvb-version (required-xcvb-version)
  (when required-xcvb-version
    (let ((reduced-required-version (reduce-xcvb-version required-xcvb-version))
          (reduced-current-version (reduce-xcvb-version (or *xcvb-version* (get-xcvb-version)))))
Francois-Rene Rideau's avatar
Francois-Rene Rideau committed
      (unless (asdf:version-satisfies reduced-current-version reduced-required-version)
        (log-format 1 "This is XCVB ~A but version ~A was required"
                    *xcvb-version* required-xcvb-version)
Francois-Rene Rideau's avatar
Francois-Rene Rideau committed
        (flet ((abend (fmt &rest args)
                 (errexit 18 "Can't recompile XCVB ~A or newer: ~?."
                          required-xcvb-version fmt args)))
          (unless (get-xcvb-directory)
            (abend "cannot find source directory for XCVB"))
          (log-format 5 "Found XCVB source in ~A" (get-xcvb-directory))
          (let* ((source-version (get-xcvb-version))
                 (reduced-source-version (reduce-xcvb-version source-version)))
            (unless source-version
              (abend "no version found in XCVB source code."))
            (unless (asdf:version-satisfies reduced-source-version reduced-required-version)
              (abend "found insufficient source XCVB version ~A" source-version))
            (unless (build-xcvb *xcvb-program*)
Francois-Rene Rideau's avatar
Francois-Rene Rideau committed
              (abend "failed to build XCVB ~A" source-version))
            (exit
             (nth-value 2
                        (run-program (cons *xcvb-program* *arguments*)
                                     :output :interactive :ignore-error-status t)))))))))