MacにF#をビルド&インストールする
MacでF# 3.1をビルドしたときのメモ。
0. 前提環境
1. 事前準備
(1) autoconf, automake, libtool
MacPortsやHomebrewあたりで、autoconf, automake, libtoolを用意しておきます。\ 今回使ったバージョンは以下のとおりです。
- autoconf @2.69_2 (active)
- automake @1.14.1_2 (active)
- libtool @2.4.2_3+universal (active)
(2) stow
自前でビルドしたパッケージを管理するためにstowを用意しておきます。 MacPortsの場合:
$ sudo port selfupdate $ sudo port install stow
(3) ディレクトリの準備
ソースコードを格納するディレクトリ(src)と、ビルドしたパッケージを格納するディレクトリ(stow)を作成します。
$ sudo mkdir -p /usr/local/{src, stow}
※ビルド時にいちいちsudoするのが面倒な場合はsrcディレクトリをchownしておいてください
2. Mono
(1) ビルド
F#を実行するための環境として、monoランタイムをビルドします。
$ cd /usr/local/src $ sudo git clone https://github.com/mono/mono $ cd mono $ sudo ./autogen.sh --prefix=/usr/local/stow/mono --enable-nls=no --disable-bcl-opt $ sudo make get-monolite-latest $ sudo make $ sudo make install
--disable-bcl-opt
は、BCL(基本クラスライブラリ)を最適化なしでコンパイルしてデバッグを有効にするものです。パフォーマンスが気になるなら外しておいたほうがよいでしょう。
またmake get-monolite-latest
をしておかないと、以下のようなエラーが出ます。
File `DoesNotExist' referenced in TOC but it doesn't exist.
(2) インストール(リンク)
前述の作業で/usr/local/stow/mono
にmonoランタイムがインストールされたので、stowを使ってこれを/usr/local/{bin,lib,share,...}
ディレクトリにリンクさせます。
$ cd /usr/local/stow $ sudo stow mono
/usr/local/bin
にパスが通っていれば、これでmonoランタイムが使えるようになります。
$ mono -V Mono JIT compiler version 3.4.1 (master/adcc774 2014年 5月30日 金曜日 23時19分09秒 JST) Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com TLS: normal SIGSEGV: altstack Notification: kqueue Architecture: amd64 Disabled: none Misc: softdebug LLVM: supported, not enabled. GC: sgen
3. F#
(1) ビルド
$ sudo git clone https://github.com/fsharp/fsharp $ sudo ./autogen.sh --prefix=/usr/local/stow/fsharp $ sudo make $ sudo make install
(2) インストール(リンク)
$ cd /usr/local/stow $ sudo stow fsharp
(3) ライブラリパスの設定
DYLD_FALLBACK_LIBRARY_PATHを.bashrcあたりに設定しておきます。
設定値はご自身の環境に合わせて変更してください。
(特にここでは、/usr/local/lib, /usr/libが必須になります)
$ export DYLD_FALLBACK_LIBRARY_PATH=${HOME}/lib:/usr/local/lib:/opt/local/lib:/lib:/usr/lib:${DYLD_FALLBACK_LIBRARY_PATH}$
ここでライブラリのパスが正しく設定されていないと、以下のようなエラーが出ます。
Failed to install ctrl-c handler - Ctrl-C handling will not be available. Error was: Exception has been thrown by the target of an invocation.
上記の場合、実行中のF#コードをインタラクティブから中断する事はできません。(止まらない計算を中断できなくなります)
使ってみる
インタラクティブを使う
Windowsではfsi
コマンドでF# Interactiveを立ち上げますが、Macではfsharpi
コマンドを使います。
fsharpi
はただのラッパーシェルで、実際はmono fsi.exe
を実行しています。
monoは、exe形式のMSILコードを実行時にコンパイルします。
$ fsharpi F# Interactive for F# 3.1 (Open Source Edition) Freely distributed under the Apache 2.0 Open Source License For help type #help;; > 1+1;; val it : int = 2 > printfn "Hello, World";; Hello, World val it : unit = ()
インタラクティブの終了は、Ctrl+ZかCtrl+Dです。
実行中のF#コードを中断したい場合は、Ctrl-Cを実行します。
> while true do printfn "Hello, F Sharp" done;; Hello, F Sharp Hello, F Sharp Hello, F Sharp Hello, F Sharp Hello, F Sharp .... (Ctrl + C を押す) - Interrupt
コンパイラを使う
適当なコードを作成します。 fact.fs:
let rec fact n = if n=0 then 1 else n * fact (n-1) [<EntryPoint>] let main (args:string[]) = printfn "%d" (fact (int args.[0])) 0
※上記ではint32の値で計算しているため、nの値が大きいと正しく計算されません。
F#のソースコードをコンパイルするときはfsharpc
コマンドを使います。
$ fsharpc fact.fs
すると、fact.exe
ファイルが作成されますが、exe形式のためmonoコマンドを経由して実行します。
$ mono fact.exe 5 120
おまけ. fsharp-vim
VimでF#のシンタックスハイライトをさせたかったので、NeoBundleでfsharp-vimを入れました。
NeoBundle 'kongo2002/fsharp-vim'