White Box技術部

WEB開発のあれこれ(と何か)

CLISPのインストールで盛大に詰まった話

LISPのコードを書きたくてCLISPMacに入れようとしたら盛大に詰まったのでその話を。

結論:うまくいかなかったらcleanしてやり直そう

正直長いので結論を先に書きます。
以下のサイトで書かれているように、一度cleanしてから実行したところ、MacPortsCLISPをインストールすることができました。

lisp threads united of 2 channel. - MacOSXへのインストール

確かに自分のMacclispを入れるまではscalaぐらいしか入れてなかったので、 ずいぶん関連プログラムがインストールされてからclispのインストールが始まっていましたし、 まずはcleanすべきだったかと思います。途中でMacフリーズしてましたし・・・

MacPortsでのインストール

ちなみに起動までのコマンドリストは以下のようになります。

sudo port install clisp
sudo port clean clisp
sudo port install clisp
clisp

clispの停止

まさかclispのREPLを止めることができないとは思いもしませんでした。

基本は(quit)でREPLを停止することができるのですが、Breakに入ってしまうと(quit)では終了しません。 Ctrl+Dをネストした分入力するとREPLから抜けることができます。

  • 停止コマンド
    • (quit)
    • Ctrl + D

詰まらなければ簡単に導入できるので、LISPを始める際の参考になれば幸いです。


では盛大に折った無駄骨を拾っていこうと思います。

MacPortsclispのインストールに失敗する

一応実行環境は以下になります。

port install clispを実行してしばらく待つと関連プログラムがインストールされ、(clispのインストール中にフリーズし、再起動後に再開し、)clispのインストールの段でエラーが発生しました。

--->  Configuring clisp
Error: org.macports.configure for port clisp returned: configure failure: command execution failed
Please see the log file for port clisp for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_clisp/clisp/main.log
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
Error: Processing of port clisp failed

言われた通りにmain.logを見る

main.log見るように言われたのでその通りにログを見ます。vimかlessで開いて、Gで末尾まで移動すると以下の用なメッセージが出ていました。

:info:configure configure: error: in `/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_clisp/clisp/work/clisp-2.49/src':
:info:configure configure: error: C compiler cannot create executables
:info:configure See `config.log' for more details.
:info:configure Command failed:  cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_releas
e_tarballs_ports_lang_clisp/clisp/work/clisp-2.49" && ./configure --prefix=/opt/local --with-libreadline-prefix=/opt/local --with-libsigsegv-prefix=/opt/local --with-libiconv-prefix=/opt/local
:info:configure Exit code: 77
:error:configure org.macports.configure for port clisp returned: configure failure: command execution failed:debug:configure Error code: NONE
:debug:configure Backtrace: configure failure: command execution failed
    while executing
"$procedure $targetname"
:info:configure Warning: targets not executed for clisp: org.macports.activate org.macports.configure org.macports.build org.macports.destroot org.macports.install
:notice:configure Please see the log file for port clisp for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_clisp/clisp/main.log

とりあえず言われたコマンドを叩く

configureでうまくいってないみたいなことを言われているので、ログにある通りの確認コマンドを打ってみます。

cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_clisp/clisp/work/clisp-2.49" && ./configure --prefix=/opt/local --with-libreadline-prefix=/opt/local --with-libsigsegv-prefix=/opt/local --with-libiconv-prefix=/opt/local

結果

./configure: line 508: conftest.x: Permission denied

は?

どういうことなの?とconfigureの中身を見る

configureファイルは、先ほどのコマンドにあるclisp-2.49ディレクトリにあるので、vimで開いて見てみます。

ちなみに508Gで該当箇所に飛びます。

# checking how to copy files
echo "blabla" > conftest.x        ←ここが問題の箇所

え、ただ書き込みできないだけ?

一度vimを閉じて、パーミッション確認

$ ll
total 184
drwxr-xr-x   18 macports  admin    612  4 19 08:09 .
drwxr-xr-x    8 macports  admin    272  4 19 07:08 ..
-rw-r--r--    1 macports  admin   3293  1 10  2008 ANNOUNCE
-rw-r--r--    1 macports  admin   3960  7  7  2010 COPYRIGHT
-rw-r--r--    1 macports  admin  18159  1 10  2008 GNU-GPL
-rw-r--r--    1 macports  admin   3098 10 18  2007 INSTALL
-rw-r--r--    1 macports  admin  23080  7  8  2010 Makefile.devel
-rw-r--r--    1 macports  admin   1395  7 14  2008 SUMMARY
-rw-r--r--    1 macports  admin   3864  5  8  2008 clisp.spec
-rwxr-xr-x    1 macports  admin  27324 12 14  2009 configure
drwxr-xr-x   59 macports  admin   2006  7  8  2010 doc
drwxr-xr-x   11 macports  admin    374  4 29  2010 emacs
drwxr-xr-x   25 macports  admin    850  7  8  2010 modules
drwxr-xr-x  344 macports  admin  11696  4 19 07:59 src
drwxr-xr-x   72 macports  admin   2448  7  6  2010 tests
drwxr-xr-x    8 macports  admin    272  6 22  2010 unix
drwxr-xr-x   19 macports  admin    646  7  8  2010 utils
drwxr-xr-x    9 macports  admin    306  7  8  2010 win32msvc
$ ll ../
total 24
drwxr-xr-x   8 macports  admin   272  4 19 07:08 .
drwxr-xr-x   3 macports  admin   102  4 19 07:00 ..
-rw-r--r--   1 macports  admin  5256  4 19 07:59 .CC_PRINT_OPTIONS
drwxr-xr-x   2 macports  admin    68  4 19 07:00 .home
-rw-r--r--   1 macports  admin   233  4 19 07:08 .macports.clisp.state
drwxr-xr-x   2 macports  admin    68  4 19 07:59 .tmp
drwxr-xr-x  18 macports  admin   612  4 19 08:09 clisp-2.49
drwxr-xr-x   2 macports  admin    68  4 19 07:08 home

グループに権限ないのが原因?

drwxr-xr-x  18 macports  admin   612  4 19 08:09 clisp-2.49

どうもディレクトリの書き込みがmacportsユーザのみなのがダメみたいです。

疑問:実行はmacportsユーザで行われているのではないのか?

MacPortsの2系からコンパイルは一般ユーザのmacportsで行われるよー、という記事がsourceforgeにはありましたが、 公式のDocumentsを検索しても特にそんな内容はなく、macportsユーザでコンパイルされているかはちょっと不明。

一応バージョンを確認したりしてました。

$ port version
Version: 2.2.1

そこでいくつか対策を考えてみるわけですが・・・

対策1

Q.macportsユーザになれないか?

A.パスワードわかんなかった(´・ω・`)

対策2

Q.macportsユーザをadminにしたらどうか?

A.なんかそれはせっかく一般ユーザになってるのに微妙かなー

対策3

Q.clisp-2.49の書き込み権限をadminグループに持たせる。

A.まあこれかな

というわけで権限を付与します。

$ sudo chmod g+w ../clisp-2.49/
drwxrwxr-x  18 macports  admin   612  4 19 08:09 clisp-2.49

そしてもう一度port install clispを実行して・・・

まだエラるですけど!?

内容は変わってもまたエラーになります。
エラーを見てみると

configure: line 2529: config.log: Permission denied
configure: line 2539: config.log: Permission denied

またか・・・ lineが2529とかなってるのでsrcディレクトリ配下のconfigureでこけてそうですがもうそこはどうでもいいのでconfig.logの権限を変えます。

$ ll config.log
-rw-r--r--  1 macports  admin  16770  4 19 09:03 config.log
$ sudo chmod g+w config.log
Password:
$ ll config.log
-rw-rw-r--  1 macports  admin  16770  4 19 09:03 config.log

・・・結果

まだまだ出ます。。もう面倒なので全部変えます。

$ sudo chmod -R g+w clisp-2.49/

それでもまだエラーになるので、いったんディレクトリごと消してみたりしました。

$ rm -rf /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_lang_clisp/

2度目のトライ

いったん全部消して、やり直したところ、権限変更したところで出力されるエラーの内容が変わりました。

Configure findings:
  FFI:        no (user requested: default)
  readline:   yes (user requested: default)
  libsigsegv: yes
./makemake  --prefix=/opt/local --with-libreadline-prefix=/opt/local --with-libsigsegv-prefix=/opt/local --with-libiconv-prefix=/opt/local    > Makefile
cp -p cfgunix.lisp config.lisp
chmod +w config.lisp
echo '(setq *clhs-root-default* "http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/")' >> config.lisp

To continue building CLISP, the following commands are recommended
  (cf. unix/INSTALL step 4 ff):
    cd src
    vi config.lisp
# The default stack size on your platform is insufficient
# and must be increased to at least 16384.  You must do either
# 'ulimit -s 16384' (for Bourne shell derivatives, e.g., bash and zsh)
# or 'limit stacksize 16384' (for C shell derivarives, e.g., tcsh)
    make
    make check

お?これはいけるんじゃないかとテンションが上がりました。srcディレクトリでmakeを叩いてみます。

memo:⌘+Tで新規タブが開いた

gccでこける

test -r libgnu_cl.a || ln -s gllib/libgnu.a libgnu_cl.a
gcc -g -O2 -W -Wswitch -Wcomment -Wpointer-arith -Wimplicit -Wreturn-type -Wmissing-declarations -O -DUNIX_BINARY_DISTRIB -DENABLE_UNICODE -DDYNAMIC_MODULES -I.   spvw.o spvwtabf.o spvwtabs.o spvwtabo.o eval.o control.o encoding.o pathname.o stream.o socket.o io.o funarg.o array.o hashtabl.o list.o package.o record.o weak.o sequence.o charstrg.o debug.o error.o misc.o time.o predtype.o symbol.o lisparit.o i18n.o unixaux.o built.o modules.o -L/opt/local/lib -lintl -Wl,-framework -Wl,CoreFoundation -L/opt/local/lib -lreadline -lncurses  -L/opt/local/lib -liconv -L/opt/local/lib -lsigsegv -R/opt/local/lib libgnu_cl.a -o lisp.run
clang: error: unknown argument: '-R/opt/local/lib' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [lisp.run] Error 1

まだだ、まだいかんよ・・・

軽く調べてみたところ、Rオプションがgccにはないみたいで、Solaris独自?なのかなとか。
-Lで共有ライブラリにもリンクはれてるっぽいので-Rは消して実行してみました。

ついに!?

でき・・・た?ように見え、なくもないですが、make checkをするとまだエラーを吐いていました。 内容は(プログラムが違いますが)以下のサイトで質問されているようなものでした。

とはいえ、src配下にできたfooやrun.lispを実行するとREPLは起動するようにはなりました。

諦めたらそこで・・・

その後、XCodeコマンドライン拡張とかも入れてみたのですがそれでもダメで、 正直もうfooにパス通して諦めようかと思っていたのですが、 もう少し調べたことでcleanで解決することができた、というのが顛末になります。

結局検証したことは無駄骨でしたが、clispがインストールできて良かったです。