roswell.roswell/lisp/install-abcl-bin.lisp
SANO Masatoshi dae5e63c7b fix #534
2022-11-27 01:56:35 +09:00

78 lines
3 KiB
Common Lisp

(roswell:include "util-install-quicklisp")
(defpackage :roswell.install.abcl-bin
(:use :cl :roswell.install :roswell.util :roswell.locations))
(in-package :roswell.install.abcl-bin)
(defvar *abcl-bin-get-version-cache* nil)
(defun abcl-bin-get-version ()
(or *abcl-bin-get-version-cache*
(setf *abcl-bin-get-version-cache*
(let ((file (merge-pathnames "tmp/abcl-bin.html" (homedir))))
(format *error-output* "Checking version to install....~%")
(download (abcl-bin-uri) file)
(loop for a in (get-elements-by-tag-name
(plump:parse file) "a")
for x = (string-right-trim "/" (plump:get-attribute a "href"))
when (ignore-errors (digit-char-p (aref x 0)))
collect x)))))
(defun abcl-bin-impl ()
(merge-pathnames (format nil "impls/~A/~A/abcl-bin/" (uname-m) (uname)) (homedir)))
(defun abcl-bin-argv-parse (argv)
(when (position "--without-install" (getf argv :argv) :test 'equal)
(set-opt "without-install" t))
(set-opt "prefix" (abcl-bin-impl))
(cons t argv))
(defun abcl-bin-download (argv)
(set-opt "as" (version argv))
(set-opt "download.uri" (format nil "~@{~A~}" (abcl-bin-uri)
(version argv) "/abcl-bin-" (version argv)".tar.gz"))
(set-opt "download.archive"
(let ((pos (position #\/ (opt "download.uri") :from-end t)))
(when pos
(merge-pathnames (format nil "archives/~A" (subseq (opt "download.uri") (1+ pos))) (homedir)))))
`((,(opt "download.archive") ,(opt "download.uri"))))
(defun abcl-bin-expand (argv)
(format t "~%Extracting archive:~A~%" (opt "download.archive"))
(expand
(opt "download.archive")
(ensure-directories-exist (abcl-bin-impl)))
(let ((path (merge-pathnames (format nil "~A/" (opt "as")) (abcl-bin-impl))))
(and (probe-file path)
(uiop/filesystem:delete-directory-tree
path :validate t)))
(ql-impl-util:rename-directory
(merge-pathnames (format nil "abcl-bin-~A/" (version argv)) (abcl-bin-impl))
(merge-pathnames (format nil "~A/" (opt "as")) (abcl-bin-impl)))
(cons t argv))
(defun abcl-bin-script (argv)
(let ((java (which "java"))
(dir (merge-pathnames (format nil "~A/" (opt "as")) (abcl-bin-impl))))
(unless java
(format *error-output* "Error: JAVA wasn't found in the path. 'ros use abcl' will fail.~%")
(format *error-output* "Installation incomplete.")
(roswell:quit 1))
(install-script
(merge-pathnames "abcl" dir)
(format
nil
"exec ~A -Xmx4g -cp \"~Aabcl-contrib.jar\" -jar \"~:*~Aabcl.jar\" \"\$@\""
java dir))
(cons t argv)))
(defun abcl-bin (type)
(case type
#+nil(:help '(abcl-bin-help))
(:install `(,(decide-version 'abcl-bin-get-version)
abcl-bin-argv-parse
,(decide-download 'abcl-bin-download)
abcl-bin-expand
abcl-bin-script
setup))
#+nil(:list 'abcl-bin-get-version)))