2012-09-24 14 views
12

Me gustaría Cabalize un proyecto Haskell para subirlo a Hackage. Consiste en un archivo .hs estándar que crea un ejecutable de arranque y ocho archivos .lhs no estándar procesados ​​por el archivo ejecutable de arranque para generar los archivos .hs que crean el ejecutable de producción.Cómo construir y usar un ejecutable de arranque en un paquete Cabal

En otras palabras, mi proyecto es un preprocesador alfabetizado personalizado (con marcado HTML, preparación de código, aquí documentos) que está escrito en sí mismo. Depende de una versión de arranque que puede traducir el código alfabetizado para la versión de producción, pero que no es adecuado para uso general. Entonces no deseo que quiera que la versión de arranque sea un paquete separado; está destinado a ser usado solo una vez, aquí.

He estado usando un Makefile, que es posible en Cabal pero no en el espíritu de Cabal. ¿Cuál es una forma limpia de hacer esto, que aprovecha al máximo la generalidad de Cabal? No he visto ninguna sugerencia para esto en la documentación en línea, salvo la reescritura de Distribution.Simple o el uso de un Makefile.

Respuesta

7

Creo que la liberación de su archivo ejecutable de arranque como un paquete separado es la solución más fácil, y hay instructions available on how to integrate your custom preprocessor with Cabal.

Si no quiere hacer eso, intente hacer que su preprocesador sea parte de Setup.hs (¡no olvide establecer el tipo de compilación en Custom!). Puede ejecutar su preprocesador durante el paso de configuración. Mira cómo wxcore hace esto.

Aquí está un ejemplo de trabajo (modelado después 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

¡Agradable! Estoy experimentando con esto ahora. Mi código de preprocesador de arranque es bastante corto; ¡Una opción sería simplemente incluirla en Setup.hs! – Syzygies

Cuestiones relacionadas