roswell から Clasp を install
LispClasp
2023-2-21 15:46 JST

roswell で Clasp をうまく install できなかったので修正してみた。

roswell は sbcl が中心

roswell のメンテナンスは sbcl が中心のようだ。実用的という意味では、それでいいのかも。Clasp は立ち上げがとにかく遅いからね。

とはいえ、Clasp でもちょっと動いてほしい。とりあえず roswell の install が出来るところまではこぎつけた。

まず、install-clasp.lisp を修正。なかで、install+externals-clasp.lisp を読んでいるのだが、もはや必要なさそう。install+externals-clasp の依存バージョンが書いてあったのでまずそれを nil にする。

install-clasp.lisp
(defparameter *clasp-version*
  ;; alias commit external-clasp-version
  '(("2.1.0" "0e6728bf5187c44e49350a431c7894aad6295abb" nil)
    ("2.0.0" "413757e24a5fbf84195434ec545602db0a8840a0" nil)
    ("1.0.0" "9c61b10dd5eebdbc03404e7faa0ceaf1fec5f30d" nil)
    ...
    ))

nil にしたら install+externals-clasp を install するのをスキップするように変更。

install-clasp.lisp
(defun clasp-lib (argv)
  (let ((externals-clasp-version (clasp-get-externals-clasp-version argv)))
    (when externals-clasp-version
      (roswell:roswell (list (format nil "install externals-clasp+/~a" externals-clasp-version)) :interactive nil)))
  (cons t argv))

download と extract まではうまく行くが、なぜかディレクトリ構成がうまくいっていない。Clasp はどういうわけか、ディレクトリ構成が違うと動かないので手で修正。ホントは extract を変えないといけないのだと思う。

install に sbcl を必要とする。そして、/usr/bin/sbcl と roswell の sbcl が競合してうまく動かなかったので、roswell の sbcl を使うように修正。

build のツールが ninja に変わったのでそれも修正。

install-clasp.lisp
(defun clasp-make-1.0.0 (argv)
  (let ((h (homedir))
        (v (getf argv :version))
        (sbcl-base (merge-pathnames (format nil "impls/~A/~A/sbcl-bin/~A/"
                                            (uname-m) (uname)
                                            (config "sbcl-bin.version"))
                                    (homedir))))

    (setenv "SBCL_HOME" (namestring (merge-pathnames "lib/sbcl" sbcl-base)))
    (format t "with sbcl-bin(~A) build clasp" sbcl-base)

  (with-open-file (out (ensure-directories-exist
                        (merge-pathnames (format nil "log/clasp/~A/make.log"
                                                 (getf argv :version))
                                         (homedir)))
                       :direction :output :if-exists :append :if-does-not-exist
:create)
    (format out "~&--~&~A~%" (date))
    (let* ((src (opt "src"))
           (cmd "./koga;cd build;ninja")
           (sbcl-path (format nil "~abin" sbcl-base))
               (*standard-output* (make-broadcast-stream out #+sbcl(make-instance 'count-line-stream))))
      (chdir src)
      (format t "~&~S~%" cmd)
      (uiop/run-program:run-program
       (list (sh) "-lc" (format nil "PATH=~A:$PATH; cd ~S;~A"
                                sbcl-path
                                (#+win32 mingw-namestring #-win32 princ-to-string src)
                                cmd))
       :output *error-output* :ignore-error-status nil
       :error-output *error-output*)
      (format *error-output* "done.~%")))
  (cons t argv)))

build 後、iclasp が出来るが、場所が違ったので(GC によって違うみたい)ハードコーディングされているところ (src/cmd-run-clasp.c) を無理やりハードコーディングで修正。

なぜか起動時に image を読み込まないモードになっていた(src/cmd-run-clasp.c)ので、そこを削除。

とりあえず、動くようにはなった。でも Clasp 立ち上がりが遅すぎ。結局普段使うのは sbcl という。時間があれば他の lisp もインストールしてみよう。