Cabal で作ってみよう
基本(Cabal パッケージのインストール)
$ runhaskell Setup.hs configure --user $ runhaskell Setup.hs build $ runhaskell Setup.hs install $ ghc-pkg list
準備
ドキュメント(haddock)
(略)
テスト
(略)
ということで作ってみる
$ 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 使えよ的な話もあるけど,それはそれで.
参考