Ch.21 SML#コンパイラの起動

§ 21.7. 起動例

§ 21.7.1. 対話環境

対話環境を起動する最も簡単な方法は,ただsmlsharpコマンドを 実行することである.

    $ smlsharp

SML#の対話環境からあるCライブラリの関数を対話的に利用したい 場合,そのライブラリの名前を-lオプションで指定する. 例えば,対話環境からzlibライブラリを呼び出したいときは 以下のコマンドを実行する.

    $ smlsharp -lz

C標準ライブラリやPOSIXスレッドライブラリなど, SML#コンパイラがデフォルトで リンクするライブラリは-lで指定しなくても利用できる.

§ 21.7.2. バッチコンパイル

ファイルに書かれたSML#プログラムをコンパイルする場合, もしただひとつの.smlファイル(および対応する.smiファイル)のみ から成るプログラムならば,その.smlファイルをただ指定するだけで実行 形式ファイルを得ることができる.

    $ smlsharp foo.sml

実行形式ファイルの名前をa.outから変えたいときは-oオプ ションを指定する.

    $ smlsharp -o foo foo.sml

§ 21.7.3. 分割コンパイルとリンク

複数のファイルから成るSML#プログラムをコンパイルおよび リンクする標準的な手順は以下の通りである.

    $ smlsharp -c -O2 foo.sml
    $ smlsharp -c -O2 bar.sml
    $ smlsharp -c -O2 baz.sml
    $ smlsharp foo.smi

まず,SML#プログラムを構成する各.smlファイルを -cを付けたsmlsharpコマンドでそれぞれ独立かつ順不同に コンパイルする. foo.smlのコンパイルに成功すると, オブジェクトファイルfoo.oが生成される. 全ての.smlファイルのコンパイルが完了した後, プログラム全体のエントリとなるコードを持つ.smlファイルのインターフェース ファイル(ここではfoo.smi)をsmlsharpコマンドに指定し, プログラム全体をリンクする. このときsmlsharpコマンドは,foo.smiから_require宣言 で辿れる.smiファイルを全て列挙し,拡張子を.oに変え,リンク対象の オブジェクトファイルのリストを得る. ソースツリーの管理の都合などにより.smiファイルから.oファ イルへの対応を制御したい場合は,以下の例のように, ファイル名の対応表を持つファイルを作り-filemapオプションで指定する.

    $ smlsharp -c -O2 -o obj/foo.o foo.sml
    $ smlsharp -c -O2 -o obj/bar.o bar.sml
    $ smlsharp -c -O2 -o obj/baz.o baz.sml
    $ smlsharp -filemap=objmap foo.smi

このとき,objmapの内容は以下の通りである.

    foo.sml obj/foo.o
    bar.sml obj/bar.o
    baz.sml obj/baz.o

SML#プログラムは任意のC/C++プログラムやライブラリとリンクする ことができる. SML#プログラムをC/C++プログラムとリンクする場合は, リンク時のsmlsharpコマンドラインにリンクするC/C++のオブジェクト ファイルやライブラリファイルを列挙する. 例えば,独自のCプログラムutil.cとOpenGLを利用するSML#プ ログラムfoo.smlをコンパイル・リンクする場合は以下のようにする.

    $ smlsharp -c -O2 foo.sml
    $ cc -c -O2 util.c
    $ smlsharp foo.smi util.o -lgl -lglu

§ 21.7.4. Makefileの雛形の生成

-MMおよび-Mlオプションを用いて,複数のファイルから なるプログラムのコンパイルのためのMakefileの雛形を生成することができる. 以下の例は, 前掲したfoo.smlbar.smlbaz.smlを コンパイル・リンクするMakefileの雛形を生成する例である.

    $ smlsharp -MMl foo.smi > Makefile
    $ smlsharp -MM foo.sml bar.sml baz.sml >> Makefile

生成されたMakefileには依存関係しか書かれていない. コンパイルおよびリンクを行うsmlsharpコマンドラインを 追加することでMakefileが完成する.