かっぱえびせんの忘備録

情報系の勉強中に気になったこととか趣味やあれこれ

Linux MintにSML#を導入してみた

 とある用事でSML#を使う必要があったのですが、自分が仮想環境で利用していたLinux MintにSML#を導入するのにかなり苦労してしまいました。というのも現在リリースされているSML#は32bit版なのに対し、SML#のコンパイルと実行に必要なライブラリがデフォルトで64bit向けになっているためapt-getが使えず。あちらこちらから必要なものを直接落としてコンパイルする必要がありました。
 後学のために導入の手順を残しておきます.(冗長な部分があるかもしれないので適宜取捨選択してください)

32bit向けコンパイラの導入

まずは必要なSML#に必要なライブラリの32bit向けコンパイルを行うためにgcc-multilibを導入します。(ついでにg++-multilibも導入しちゃいましょう。)

sudo apt-get install gcc-multilib g++-multilib

(もしかしたら32bit環境のライブラリを用意しておくと幸せになれるかもしれない)

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

GMP,LLVMのダウンロード

続いてSML#のコンパイルと実行に必要なライブラリであるGMPとLLVMを導入します。それぞれ以下のサイトからダウンロードして適当なところ展開してください。

※この時、gmpのバージョンは5.1.2、LLVMのバージョンは3.4を推奨します。gmpに関しては別バージョンでも構いませんが、LLVMはバージョンによって仕様が大きく異なるため、3.4以外を導入すると最悪動きません。

gmp,LLVMの32bit向けコンパイル

gmp,LLVMの32bit向けコンパイルを行うために下準備をします。展開したそれぞれのフォルダの中に移動し、configureを実行します。これはgmpもLLVMも共通です。

./configure ABI=32 --prefix=(コンパイル後のファイルを置いておきたい場所の絶対パス)

もしかしたらLLVMのconfigureの実行時にMakefileが作成されないかもしれません。その場合はパッケージでM4をインストール(sudo apt-get install M4)してから再度configureを実行してみてください。 (ちなみにconfigureはMakefileを生成するスクリプトで、オプションとしてABI=32を付与することで32bit向けコンパイルを行ううためのMakefileを生成することができます。)
続いて、makeを行います。

make
make install

これでgmp,LLVMコンパイルが完了しました。

SML#のダウンロード・コンパイル

最後のステップです。SML#を以下のリンクからダウンロードし展開します。パッケージ種別はsourceで。

展開したら中に入り、configureを実行します。

./configure CC='gcc -m32' LD='ld -m elf_i386' CXX='g++ -m32' CPPFLAGS=-I(コンパイル後のgmpの絶対パス) --prefix=(コンパイル後のsmlsharpを作成したい場所の絶対パス) --with-llvm=(コンパイル後のLLVM絶対パス)

configureが完了したらMakeを行います。

make -j4
make install

※makeをするときに付けるオプション-j4の数字の部分はCPUのコア数にしてください。このオプションを付けることである程度高速にコンパイルできます。
以上がSML#の導入手順になります。

まとめ

結論から言ってしまえばSML#のコンパイル、実行に必要なライブラリを32bit向けにコンパイルすれば良かっただけの話でした。
で、64bit版SML#の公開はまだですか?