一歩前進

プログラミングに関する雑多なメモ

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'

fsharp-vim
https://github.com/kongo2002/fsharp-vim