2012-09-24 11 views
12

Vorrei cabalizzare un progetto Haskell per caricarlo su Hackage. Consiste in un file .hs standard che crea un eseguibile bootstrap e otto file .lhs non standard che vengono elaborati dall'eseguibile bootstrap per ottenere i file .hs che creano l'eseguibile di produzione.Come creare e utilizzare un eseguibile bootstrap in un pacchetto Cabal

In altre parole, il mio progetto è un preprocessore alfabetico personalizzato (con markup HTML, code grooming, here document) che è scritto in sé. Dipende da una versione di bootstrap che può tradurre il codice alfabetico per la versione di produzione, ma che non è adatto per l'uso generale. Quindi io non voglio che la versione di bootstrap sia un pacchetto separato; è pensato per essere usato solo una volta, qui.

Ho utilizzato un Makefile, che è possibile in Cabal ma non nello spirito di Cabal. Qual è un modo pulito per farlo, che sfrutta al massimo il vantaggio della generalità di Cabal? Non ho visto alcun suggerimento per questo nella documentazione online, a meno di riscrivere Distribution.Simple o utilizzare un Makefile.

risposta

7

Penso che il rilascio del file eseguibile di bootstrap come pacchetto separato sia la soluzione più semplice, e ci sono instructions available on how to integrate your custom preprocessor with Cabal.

Se non si desidera fare ciò, provare a fare la parte preprocessore di Setup.hs (non dimenticare di impostare il tipo di build su Custom!). È possibile eseguire il preprocessore durante la fase di configurazione. Guarda come lo fa wxcore.

Ecco un esempio di lavoro (modellato dopo 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" 
+0

Bello! Sto sperimentando con questo ora. Il mio codice di preprocessore bootstrap è piuttosto breve; una opzione sarebbe per me semplicemente includerla in Setup.hs! – Syzygies

Problemi correlati