Cabal で作ってみよう

基本(Cabal パッケージのインストール)

$ runhaskell Setup.hs configure --user
$ runhaskell Setup.hs build
$ runhaskell Setup.hs install
$ ghc-pkg list

準備

ドキュメント(haddock)

(略)

テスト

  • 本物のプログラマHaskellを使う の 第16回 Haskellでのテストの自動化を考える を読めばいいんじゃないか?
  • ということで,下のSetup.hs は,そのまま連載のものをコピーした

(略)

ということで作ってみる

$ cat <<EOL > aaa.cabal
name:    Hoge
version: 0.0

executable hoge
  main-is:  Hoge.hs
  build-depentds: base

executable Test
  main-is:  Test.hs
  build-depends: base, directory, QuickCheck, HUnit
EOL
$ cat <<EOL > Hoge.hs
main = print hello

hello = "Hello"
EOL
$ cat <<EOL > Setup.hs
module Main (main) where

import Distribution.Simple
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..))

import Data.List (isInfixOf)
import System.Directory (getCurrentDirectory)
import System.Cmd (system)
import System.FilePath ((</>), dropExtension)

main :: IO ()
main = do
  defaultMainWithHooks $ simpleUserHooks {runTests = doTest}
  where doTest _ _ pkgDisc bInfo = do
          curr <- getCurrentDirectory
          let dir = buildDir bInfo
              -- data: を取り出す
              testData = dataFiles pkgDisc
              -- 名前に "Test" がつくもののみ
              filterName = filter (("Test" `isInfixOf`) . exeName)
              -- buildable: が False でないもののみ
              filterBuildable = filter (buildable . buildInfo)
              filterTest = filterName . filterBuildable
              -- executable: の実行可能ファイルの完全パス名を作成
              path exec = curr </> dir
                          </> (dropExtension . exeName) exec
                          </> (dropExtension . exeName) exec
          mapM_ (system . path) $ filterTest $ executables pkgDisc
EOL
$ cat <<EOL > Test.hs
import Test.QuickCheck
import Text.Printf

main = mapM_ (\(s,a) -> printf "%-25s: " s >> a) tests

prop_id s = id (s::Int) == s

tests  = [("id",        test prop_id)]
EOL
$ runhaskell Setup.hs configure --user
$ runhaskell Setup.hs build
$ runhaskell Setup.hs test

これだと,test とbuild の依存関係が表現できないなぁ.
とあいえ,configure -> setup-config みたいな依存関係ってないのかも.
clean が動いてないような気もするなぁ.

mkcabal を使えよ.みたいな話しはあるけど,以下のようにもあるから許してね.と


The new tool mkcabal automates all this for you,
but you should understand all the parts even so.

cabal-install 使えよ的な話もあるけど,それはそれで.

参考