2013年6月22日 星期六

安裝第二個GHC在系統中

「新的 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 帶來的無限樂趣吧!!

沒有留言:

張貼留言