Clasp をビルドする
LispCommon Lisp
2023-2-15 1:48 JST

Common lisp の言語実装の一つの Clasp をビルドした。roswell からの install は苦労した。

Building Clasp


Building Claspというそのまんまのウェブページがある。ので、そのままいけばすぐにインストールできる、、、はず。ひっかかったのは fmt。私の環境 Ubuntu 20.04.5 LTS では古い libfmt-dev だったのでfmtlib/fmtから clone してコンパイルしてインストールした。

Ninja Build

ビルドするのに Ninja を使うが、その前に、koga というプログラムを走らせる。Clasp についてくるプログラムなのでそのまま実行すればよい。きっと甲賀から連想したに違いない。その後、ninja -C buildとしてsudo ninja -C build installで、/usr/local にインストールされる。

roswell

roswell からのインストールにはClaspをビルドする2020-05が詳しい。が、どうも LLVM のウェブサイトが移動してしまい、それに私のroswell が追従していないのでエラーになるみたい。

roswell install clasp-bin

roswell は最新にしても clasp の install は出来なかった。github のソースを見ると 2019 あたりで更新が止まっている。ただし、clasp-bin というのがあるみたいなのでインストールしてみた。

autoconf

コンパイルに先立ち最新の autoconf が必要になった。まずココからかよ。autoconfから clone してくるも、コンパイル出来ない。Building autotools from gitを参考にしてみる。

$ git clean -f -X
$ aclocal -I m4 
$ automake --add-missing 
$ autoconf
$ configuire
$ make

あら不思議コンパイルできちゃった。

libffi.so.8

libffiから clone して autogeh.sh を走らせる。その後、多分 configuire そして make したのだと思う。/usr/local に install した。

llvm-13

なぜ、ubuntu には llvm-13 がない?セキュリティ問題の気もするのでちょっと調べるが見つからず。ということで、気にせず、liborg-13.0.1 の tar.gz (つまりソース)をダウンロードして、コンパイル。

$ mkdir build
$ cd build
$ cmake -G Ninja .. 

しかし、so 出来ず。「LLVM/Clang 14をビルドする」を参考に -DBUILD_SHARED_LIBS=Onも追加してコンパイル。あれ?so は出来たけど、肝心の libLLVM-14.so が出来ない。

$ cmake -DLLVM_LINK_LLVM_DYLIB=On -G Ninja ..

結局 LLVM_LINK_LLVM_DYLIB を On にする必要があるみたいだ。途中 BUILD_SHARED_LIBS も On したので明示的に off にしてもだめだったので、build を空にして再挑戦。lib/libLLVM-13.soができた。

sudo ninja installでインストール。ninja に uninstall がないのが気になる。

GLIBC_2.32

結局、GLIBC がないのなんのといわれて、実行できず。

roswell install clasp-bin/2021-05-26

よく見ると、list でインストール可能な version を表示できる。

$ ros list versions clasp-bin
Installable versions for clasp-bin:
Checking version to install...
2022-01-28
2021-05-26
2021-04-13a
2021-04-13
2021-03-26

ということで、最新より一つ前の 2021-05-26 をまずは wget でdownload して単体で実行してみる。どういうわけか clasp は存在せずiclasp-boehm という実行可能オブジェクトがある。

$ clasp-2021-05-26-x86-64-linux/build/boehm/iclasp-boehm
Starting cclasp-boehm-0.4.2-3888-g0995ef76f-cst ... loading image...
Top level in: #.
COMMON-LISP-USER>

(quit) はない。実行するとエラーになるので、:r1 とかタイプして抜ける。最終的には Ctrl-D で終了。とりあえず動くみたいなので ros で install

$ ros use clasp
clasp/system does not exist.stop.
Error: unable to use 'clasp'
$ ros list installed
Installed implementations:

Installed versions of clasp-bin:
clasp-bin/2021-05-26

Installed versions of clisp:
clisp/2.49

Installed versions of sbcl-bin:
sbcl-bin/2.2.3
$ ros use clasp-bin/2021-05-26
$ ros run --version
roswell 22.12.14.113(4eec08c)
$ ros run -- --version
clasp-boehm-0.4.2-3888-g0995ef76f
$ ros run
Starting cclasp-boehm-0.4.2-3888-g0995ef76f-cst ... loading image...
; caught STYLE-WARNING:
;   Undefined function ROS-OPTS
;     at unknown location
;
;
; compilation unit finished
;   caught 1 STYLE-WARNING condition
; caught STYLE-WARNING:
;   STYLE-WARNING during compiler-macro-expansion:
;     Undefined type COMPILER-NOTE
;     at /home/ryos/.roswell/lisp/quicklisp/quicklisp/impl-util.lisp 20:18
;
;;; Warning: Lisp compilation had style-warnings while
             compiling #
;
; compilation unit finished
;   caught 1 STYLE-WARNING condition
Top level in: #.
COMMON-LISP-USER>

ros use claspじゃエラーになる。ros list installedで一覧を見れる。ros use clasp-bin/2021-05-26正確にバージョンを入れると use 出来るようになる。ros run --versionでは ros のバージョンが表示される。ros run -- --versionでは clasp のバージョンが表示される。ros runで clasp が立ち上がった。(quit) はないのでCtrl-D で抜ける。

COMMON-LISP-USER> (quit)
; caught STYLE-WARNING:
;   Undefined function QUIT
;     at unknown location
;
;
; compilation unit finished
;   caught 1 STYLE-WARNING condition

Condition of type: UNDEFINED-FUNCTION
The function QUIT is undefined.
Available restarts:
(use :r1 to invoke restart 1, etc.)

1. (RESTART-TOPLEVEL) Go back to Top-Level REPL.


CORE:REPL
COMMON-LISP-USER>> :r1

COMMON-LISP-USER>

他の ros に影響が出る

clasp 遅いよ(sbcl に比べて)。そもそもの起動が遅いみたい。そして、use で変えたら他の ros 実行ファイルに影響が出た。当たり前?

[1/1] ../bin/web-factory.ros site.props
Starting cclasp-boehm-0.4.2-3888-g0995ef76f-cst ... loading image...
; caught STYLE-WARNING:
;   Undefined function ROS-OPTS
;     at unknown location
;
;
; compilation unit finished
;   caught 1 STYLE-WARNING condition

Condition of type: PACKAGE-DOES-NOT-EXIST
Package named "SB-EXT" does not exist.
No restarts available.

Top level in: #.
COMMON-LISP-USER>

SB-EXT と sbcl に依存したところがあったみたい。とりあえず、ros ファイルの先頭で sbcl-bin を指定するようにする。

exec ros -Q -L sbcl-bin -- $0 "$@"

リンク集