12

Haskell プロジェクトを Hackage にアップロードするために Cabalize したいと考えています。これは、ブートストラップ実行可能ファイルをビルドする 1 つの標準 .hs ファイルと、ブートストラップ実行可能ファイルによって処理されて実稼働実行可能ファイルをビルドする .hs ファイルを生成する 8 つの非標準 .lhs ファイルで構成されます。

言い換えれば、私のプロジェクトは、それ自体で書かれたカスタムのリテラシー プリプロセッサ (HTML マークアップ、コード グルーミング、ヒア ドキュメントを使用) です。これは、製品バージョンのリテラル コードを変換できるブートストラップ バージョンに依存しますが、一般的な使用には適していません。したがって、ブートストラップ バージョンを別のパッケージにしたくありません。ここでは、一度だけ使用することを意図しています。

私は Makefile を使用しています。これは、Cabal では可能ですが、Cabal の精神ではできません。カバルの一般性を最大限に活用する、これを行うためのクリーンな方法は何ですか? Distribution.Simple を書き直すか、Makefile を使用する以外に、オンライン ドキュメントでこれに関する提案を見たことがありません。

4

1 に答える 1

7

ブートストラップ実行可能ファイルを別のパッケージとしてリリースするのが最も簡単な解決策だと思います。カスタム プリプロセッサを Cabal と統合する方法については、利用可能な指示があります。

そうしたくない場合は、プリプロセッサを の一部にしてみてくださいSetup.hs(ビルド タイプを ! に設定することを忘れないでくださいCustom)。構成ステップ中にプリプロセッサーを実行できます。これがどのように行われるかを見てくださいwxcore

これが実際の例です(の後にパターン化されていますwxcore):

Setup.hs:

import Distribution.Simple
import Distribution.Simple.LocalBuildInfo
import Distribution.Simple.Setup
import Distribution.PackageDescription

import Control.Monad (forM_)
import System.Directory (copyFile)
import System.FilePath (replaceExtension)

main :: IO ()
main = defaultMainWithHooks simpleUserHooks { confHook = myConfHook }

-- Replace 'copyFile' with more complicated logic.
runMyPreprocessor :: FilePath -> IO ()
runMyPreprocessor abcFile = copyFile abcFile (replaceExtension abcFile ".hs")

myConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags
              -> IO LocalBuildInfo
myConfHook (pkgDesc, hbi) flags = do
  let extraSrc = extraSrcFiles . packageDescription $ pkgDesc
  forM_ extraSrc runMyPreprocessor

  confHook simpleUserHooks (pkgDesc, hbi) flags

my-preprocessor.cabal:

name:                my-preprocessor
version:             0.1.0.0
build-type:          Custom
cabal-version:       >=1.8
extra-source-files:  Main.abc

executable my-preprocessor
  main-is: Main.hs
  build-depends:       base < 5

Main.abc:

module Main
       where

main :: IO ()
main = putStrLn "Hello"
于 2012-09-24T23:02:06.057 に答える