MacにhaskellをインストールしてIntellijで使えるようにする


題名通り、Intellijでhaskellを書けるようにするところまで書いて行きます。

こちらを参考にさせて頂きました。

Haskell + IntelliJ IDEAでゆるくHaskell入門する手始め

結局この手順通りやれば上手く行くのですが、色々適当にやったせいでハマった部分もあるので、その辺りなどを書いて行きます。

必要な物・前提

  • Intellij IDEAインストール済み
  • homebrewインストール済み

GHCインストール

まずはIntellij抜きで普通にhaskellコードをコンパイルする部分まで持って行きます。haskell-platformというものもあるようですが、これは非推奨(廃止?)になったようです。brewで入れようとすると警告が出ました。

brew install ghc cabal-install

テスト用にhaskellコードを用意します。

module Main where
    main = do
        print "Hello, world."

以下のコマンドでビルドしてから実行

ghc hello.hs
./hello

# "Hello, world." が表示されるはず

 

cabalについて色々とIntellij設定

cabal sandbox init
cabal update
cabal install happy
cabal install ghc-mod

これでIntellijに必要なghc-modが入りましたので、いよいよIntellij側に行きます。

まずはIntellij -> Preferences -> Plugins -> Browse RepositoriesでHaskellプラグインをインストールします。2つありますが、日付の新しい方を使います。もう片方はIDEA version 11あたりで止まっていますので。

Browse_Repositories

インストールしたらIntellij再起動して、新しくプロジェクトを作ります。Haskell Moduleというのが選べるのでそれで作るだけです。

この時点ではまだHaskellの設定が行われていないので、設定します。出てきたウィンドウで設定するか、Preferences -> Haskellから設定します。以下のような感じで。

Preferences

上記の手順でインストールしていれば画像の通りのパスになると思います。 ※/Users/tsukabyの部分は皆さんご自身のパスに置き換えてください。

src/Main.hsファイルがあるはずなので、これに先ほどと同じように記述をします。

module Main where
    main = do
        print "Hello, world."

最後にSDK設定をします。

File -> Project Structures -> ProjectでSDKが設定できるので、ここでGHC HOMEを設定します。Newを押してGHCを選んで「/usr/local/Cellar/ghc/7.8.3」あたりを選択します。バージョン部分は人によって違うかもしれません。

Project_Structure

これでOKです。

後は右クリック -> Runとかで動きます。

Main_hs_-haskell-sample-haskell-sample-___IdeaProjects_haskell-sample

以上です。

トラブルシューティング1 ghc-modが入らない

cabal install ghc-modをすると以下のようなエラーが出ます。

cabal install ghc-mod

(中略)

Configuring haskell-src-exts-1.16.0...
Failed to install haskell-src-exts-1.16.0
Build log ( /Users/tsukaby/.cabal-sandbox/logs/haskell-src-exts-1.16.0.log ):
Configuring haskell-src-exts-1.16.0...
setup-Simple-Cabal-1.18.1.4-x86_64-osx-ghc-7.8.3: The program happy version
>=1.17 is required but it could not be found.

(中略)

cabal: Error: some packages failed to install:
ghc-mod-5.1.1.0 depends on haskell-src-exts-1.16.0 which failed to install.
haskell-src-exts-1.16.0 failed during the configure step. The exception was:
ExitFailure 1
hlint-1.9.7 depends on haskell-src-exts-1.16.0 which failed to install.

haskell-src-extsがインストールされない・・・。これはhappyが入っていないせいなので、happyを入れます。

cabal install happy

Resolving dependencies...
Notice: installing into a sandbox located at /Users/tsukaby/.cabal-sandbox
Downloading happy-1.19.4...
Configuring happy-1.19.4...
Building happy-1.19.4...
Installed happy-1.19.4

はいりました!この後で再度cabal install ghc-modすれば良いかと思います。

トラブルシューティング2 ghc [file_name]のコンパイルに失敗する

ghc hello.ts

# 以下出力
ld: warning: ignoring file hello.ts, file was built for unsupported file format ( 0x6D 0x6F 0x64 0x75 0x6C 0x65 0x20 0x4D 0x61 0x69 0x6E 0x20 0x77 0x68 0x65 0x72 ) which is not the architecture being linked (x86_64): hello.ts
Undefined symbols for architecture x86_64:
  "_ZCMain_main_closure", referenced from:
      _main in ghc44055_2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ghcはファイルの拡張子で実行する内容を変えます。最近TypeScriptを書くことが多いので全く気づかず.tsのままファイルを作ってしまいました・・・。

これのせいで4時間近く失いました・・・・。.hsで作り直したら成功しました。

トラブルシューティング3 GNU GCCがいる・・・?

結構色々なサイトにMacにGHCをインストールするときはgccを入れましょうと書いてあります。Macに入っているgccは実はclangです。

gcc -v

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

と、言う訳でbrewでgcc49入れて/usr/bin/gccをmvしてgcc49で入れたバイナリにlnしたり色々した訳ですが、多分不要かもしれないです。

brewでghcをインストールすると「/usr/local/Cellar/ghc/7.8.3/lib/ghc-7.8.3/settings」に設定ファイルができます。

cat /usr/local/Cellar/ghc/7.8.3/lib/ghc-7.8.3/settings

[("GCC extra via C opts", " -fwrapv"),
 ("C compiler command", "clang"),
 ("C compiler flags", " -m64 -fno-stack-protector"),
 ("C compiler link flags", " -m64"),
 ("Haskell CPP command","clang"),
 ("Haskell CPP flags","-E -undef -traditional -Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs "),
 ("ld command", "/usr/local/Library/ENV/4.3/ld"),
 ("ld flags", " -arch x86_64"),
 ("ld supports compact unwind", "YES"),
 ("ld supports build-id", "NO"),
 ("ld supports filelist", "YES"),
 ("ld is GNU ld", "NO"),
 ("ar command", "/usr/bin/ar"),
 ("ar flags", "clqs"),
 ("ar supports at file", "NO"),
 ("touch command", "touch"),
 ("dllwrap command", "/bin/false"),
 ("windres command", "/bin/false"),
 ("libtool command", "libtool"),
 ("perl command", "/usr/bin/perl"),
 ("target os", "OSDarwin"),
 ("target arch", "ArchX86_64"),
 ("target word size", "8"),
 ("target has GNU nonexec stack", "False"),
 ("target has .ident directive", "True"),
 ("target has subsections via symbols", "True"),
 ("Unregisterised", "NO"),
 ("LLVM llc command", "llc"),
 ("LLVM opt command", "opt")
 ]

これを見る限りclang使うようになってますし、LLVM用のオプションもあるので対応したのかな?という訳で何かにコケたときはgcc云々は少し違うようです。もしかしたらということもあるので、試す価値はありますが・・・!

他にもlifted-baseがなぜかインストールできなかったり色々あったのですが、brewで何度かアンインストールして初めからやり直したら奇麗に行きました。何だったんだろう・・・。

何はともあれ無事にインストールできました。