HomebrewでClojureとか入れてみた。

 Homebrewさんを導入してさらに調子に乗ってしまったので、今度はClojureさんをインストールして環境を作ってみますよ。
 ちなみに、Clojureさんを使って何かを作ったりしているわけではありませんが、コンソール的に某Java系Frameworkのクラスを確認するために使いたいのです。

 まずはHomebrewさんがclojure関連を扱っているのかを調べます。まぁ、事前にインストール可能である事を確認してからHomebrewの方を導入したのですけどね、リアルな話だと。MacPortsと同様にsearchオプションを使います。


bash-3.2$ brew search clojure
clojure          clojure-contrib

 おおぅ、ばっちりあるやないですか! まぁ、リアルな話だと(ry ですけども。ちゃんとcontribの方も用意されてますね、この二つはもはや一体だと言ってもいいくらいです。
 てわけで、両方ともインストールしますよ。


bash-3.2$ brew install clojure
==> Downloading https://github.com/downloads/clojure/clojure/clojure-1.2.0.zip
######################################################################## 100.0%
==> Caveats
If you `brew install repl` then you may find this wrapper script from
MacPorts useful:
  http://trac.macports.org/browser/trunk/dports/lang/clojure/files/clj-rlwrap.sh?format=txt
==> Summary
/usr/local/Cellar/clojure/1.2.0: 3 files, 3.1M, built in 2 seconds
bash-3.2$ brew install clojure-contrib
==> Downloading https://github.com/downloads/clojure/clojure-contrib/clojure-contrib-1.2.0.zip
######################################################################## 100.0%
==> mv target/clojure-contrib-*.jar clojure-contrib.jar
==> Caveats
For Clojure to detect the contrib libs, the following path must be in your
CLASSPATH ENV variable:

    /usr/local/Cellar/clojure-contrib/1.2.0/clojure-contrib.jar

To do this with bash, add the following to your ~/.profile file:

    export CLASSPATH=$CLASSPATH:/usr/local/Cellar/clojure-contrib/1.2.0/clojure-contrib.jar
==> Summary
/usr/local/Cellar/clojure-contrib/1.2.0: 2 files, 472K, built in 2 seconds

 メッセージから読み解きますと、「replも用意されていて、MacPortsの便利なラッパースクリプトもある」、「contribはCLASSPATHを通してから使いなさい」とあるみたいですね。
 replは見逃せない、これはインストールせねば。


bash-3.2$ brew install repl
==> Downloading ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz
######################################################################## 100.0%
==> Downloading patches
######################################################################## 100.0%
######################################################################## 100.0%
==> Patching
patching file complete.c
patching file patchlevel
patching file readline.h
patching file patchlevel
==> ./configure --prefix=/usr/local/Cellar/readline/6.1 --mandir=/usr/local/Cellar/readline/6.1/shar
==> make install
==> Caveats
This formula is keg-only, so it is not symlinked into Homebrew's prefix.
The formula provides the following rationale:
OS X provides the BSD Readline library. In order to prevent conflicts when
programs look for libreadline we are defaulting this GNU Readline installation
to keg-only.

Generally there are no consequences of this for you, however if you build
your own software and it requires this formula, you may want to run this
command to link it into the Homebrew prefix:
    $ brew link readline
==> Summary
/usr/local/Cellar/readline/6.1: 32 files, 2.0M, built in 42 seconds
==> Downloading http://utopia.knoware.nl/~hlub/rlwrap/rlwrap-0.37.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/rlwrap/0.37 --disable-debug --disable-dependency-tracking
==> make install
/usr/local/Cellar/rlwrap/0.37: 26 files, 284K, built in 15 seconds
==> Downloading https://github.com/defunkt/repl/tarball/v0.2.1
######################################################################## 100.0%

/usr/local/Cellar/repl/0.2.1: 4 files, 16K, built in 2 seconds

 うんうんうん、当たり前ですが依存関係を解消しつつインストールされているようでございますね、素晴らしい有り難い大好き。

 この時点でMacPortsでClojureをインストールしたときと同じようにcljコマンドが使えるようになります。


bash-3.2$ which clj
/usr/local/bin/clj
bash-3.2$ ls -al /usr/local/bin/ | grep clj
lrwxr-xr-x   1 tac   staff     31  2 15 11:32 clj -> ../Cellar/clojure/1.2.0/bin/clj

 実体は/usr/local/Cellar/clojure/以下に設置されているようです。どうやらHomebrewさんでインストールしたソフトウェアはすべて/usr/local/Cellar/以下に設置されるみたいですよ。気を使ってくれてらっしゃる。

 しかし、この標準で組み込まれるcljコマンド、若干不便です。MacPorts版のそれと比べて何もしなくても環境変数CLASSPATHを参照してくれるのはいい感じですが、それ以外がちょっといけてません。コマンドヒストリーもありませんし、^hとか^dとかのショートカットも利きません。最初からこの仕様で使い始めていれば我慢できたのでしょうけど、残念ながらMacPorts版では可能な事を知っていますから置き換える事にしました。
 最初にインストールした時点のメッセージで「便利なのはあっち」とか教えてくれているので気がつきましたよ。そうでなければそんな事をしようと思いつきもしなかったかも。

 /trunk/dports/lang/clojure/files/ – MacPorts

 MacPortsさんから該当ファイルを頂いてきます。clj-rlwrap.shを動かすのに.clj_completionsも必要になるので一緒に頂いておきましょう。
 頂いてきたclj-rlwrap.shをどこに置いておくかは迷ったのですけど、とりあえずHomebrewさんの流儀にあわせる事に。.clj_completionsはスクリプトから呼ばれる感じにあわせて設置してみました。


/usr/local/Cellar/clojure/1.2.0/bin/clj-rlwrap.sh
/usr/local/Cellar/clojure/1.2.0/.clj_completions

 そして、元のcljスクリプト同様にリンクを張っておきます。


sudo rm /usr/local/bin/clj
sudo ln -s /usr/local/Cellar/clojure/1.2.0/bin/clj-rlwrap.sh /usr/local/bin/clj

 このままでは上手く動きませんから中身を少し変更します。この際ですので、CLASSPATHも参照するようにしておきましょう。


yui:1.2.0 tac$ diff bin/clj-rlwrap.sh /Users/tac/Downloads/clj-rlwrap.sh
7c7
< cljjar="clojure.jar"
---
> cljjar='lib/clojure.jar'
35,38d34
< if [ -n "$CLASSPATH" ]; then
<   cp=$cp:$CLASSPATH
< fi
< 

 編集済みのファイルとオリジナルのdiffを取ったらこんな感じでしたよ。
 これでCLASSPATHを参照し、かつ実行時ディレクトリ直下の.clojureを参照し、rlwrapを活用した感じのcljコマンドになります! 素晴らしいありがとう。


bash-3.2$ clj
Clojure 1.2.0
user=>