「新的 GHC 支援我想要的那個XX功能了!」但是系統裡面已經有一個 GHC了?「反正人家就是要最新版的 GHC 啦」?這時候你除了等待你的 Linux distribution 提供更新以外,也可以自力更生,把自己想要的 ghc 及所對應的 haskell-platform 打造出來!
我們先下載 ghc 以及 haskell platform。GHC 的話,去這裡找到最新版的,或你想要版本的 ghc,進入後,可以選擇 source distribution(卷到最底下!) 或 binary distribution。如果是 source distribution 的話,解開後直接做
./configure --prefix=your/desired/location make -j6 # 量力而為,不要虐待你的 CPU # 這一步會有點久,如果是夏天請記得開冷氣, # 不然用j1,順便看個電影 make install就完成了。如果是 binary distribution,則解開後:
./configure --prefix=your/desired/position make install
安裝完 ghc 之後,若你安裝 ghc 的位置不能被系統找到,那就利用 ln -s
來建立軟式連結(soft link)。
建議把連結的名字建立成 ghc-your-version 的形式(7.6.3 版的就建立成 ghc-7.6.3)。建立完後進行測試:
$ ghc-7.6.3 --version The Glorious Glasgow Haskell Compilation System, version 7.6.3除了 ghc 外,haddock, ghc-pkg, hsc2hs 均要做相似的軟式連結。
接著才是重頭戲。沒有 haskell platform 的 ghc 會少掉許多多采多姿的功能喔!所以我們來好好的設定它吧!一樣下載完後解開:
$ ./configure --prefix=your/desired/location\ --enable-shared --with-ghc-pkg=ghc-pkg-7.6.3 --with-ghc=ghc-7.6.3先別急著 make。以我使用的 haskell platform 2013.2 來說,建置程式有些小問題,所以我們要來修改。看到
scripts/build.sh
,把它打開,然後改掉
# 原本 GHC_PACKAGE_PATH="${ORIG_GHC_PACKAGE_PATH}" \ # 改成 #GHC_PACKAGE_PATH="${ORIG_GHC_PACKAGE_PATH}" \接著,如果你想要建置文件的話,再修改
# 原本 ./Setup haddock ${VERBOSE} ${HADDOCK_FLAG} \ # 改成 ./Setup haddock ${VERBOSE} ${HADDOCK_FLAG} --with-haddock=haddock-7.6.3\好了後
make && make install
如果你希望建立一個隔離的 cabal 儲存區(而非~/.cabal),那就繼續看下去。如果你的 ~/.cabal/config 檔案不存在,則要
# 呼叫舊的 cabal cabal update取得~/.cabal/config後,建立一個新的 cabal 預定儲存區,並且把 ~/.cabal/config 複製到那裡:
mkdir ~/.cabal-2013-2/ cp ~/.cabal/config ~/.cabal-2013-2/然後用文字編輯器打開它。一定要改:
remote-repo-cache world-file with-compiler with-hc-pkg build-summary install-dirs user下的第一個項目(prefix) (你可以加入with-haddock, with-happy, with-alex等選項,看看cabal認得出來沒有)建議修改(讓我們和 haskell 的生活更為方便)
shared documentation改好後,先試著替 cabal 建立軟式連結,然後跑跑看 cabal 有沒有認得設定檔中的 with-haddock 等選項。如果沒有的話,建立:
#!/bin/bash CABAL_COMMAND="path/to/haskell/platform/bin/cabal\ --config-file $HOME/.cabal-2013-2/config" ADDITIONAL="-with-haddock=haddock-7.6.3 --with-hsc2hs=hsc2hs-7.6.3 --with-alex=alex-2013_2 --with-happy=happy-2013_2" if [[ $* == install* ]] || [[ $* == build* ]] then $CABAL_COMMAND $* $ADDITIONAL else $CABAL_COMMAND $* fi這樣應該就沒問題了,開始享受 haskell 帶來的無限樂趣吧!!
沒有留言:
張貼留言