2012-09-24 3 views
12

Ich möchte ein Haskell-Projekt verkabeln, um es auf Hackage hochzuladen. Es besteht aus einer Standard-.hs-Datei, die eine ausführbare Bootstrap-Datei erstellt, und acht Nicht-Standard-.lhs-Dateien, die von der Bootstrap-Programmdatei verarbeitet werden, um die .hs-Dateien zu erzeugen, die die ausführbare Produktionsdatei bilden.Wie man eine Bootstrap-Datei in einem Cabal-Paket erstellt und verwendet

Mit anderen Worten, mein Projekt ist ein benutzerdefinierter kompilierter Präprozessor (mit HTML Markup, Code Grooming, hier Dokumente), der in sich selbst geschrieben ist. Es hängt von einer Bootstrap-Version ab, die den Literate-Code für die Produktionsversion übersetzen kann, aber nicht für den allgemeinen Gebrauch geeignet ist. Also ich nicht möchte die Bootstrap-Version ein separates Paket sein; es soll nur einmal hier verwendet werden.

Ich habe ein Makefile benutzt, was in Cabal möglich ist, aber nicht im Sinne von Cabal. Was ist ein sauberer Weg, dies zu tun, der die Allgemeinheit von Cabal maximal ausnutzt? Ich habe keine Vorschläge dafür in der Online-Dokumentation gesehen, kurz, um entweder Distribution.Simple neu zu schreiben oder ein Makefile zu verwenden.

Antwort

7

Ich denke, dass die Freigabe Ihrer Bootstrap ausführbare als separates Paket die einfachste Lösung ist, und es gibt instructions available on how to integrate your custom preprocessor with Cabal.

Wenn Sie das nicht möchten, versuchen Sie, Ihren Preprozessor Teil von Setup.hs zu machen (vergessen Sie nicht, den Build-Typ auf Custom zu setzen!). Sie können Ihren Präprozessor während des Konfigurationsschritts ausführen. Schau dir an, wie wxcore dies tut.

Hier ist ein funktionierendes Beispiel (strukturiert nach 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

Schön! Ich experimentiere jetzt damit. Mein Bootstrap-Preprozessor-Code ist ziemlich kurz; Eine Option wäre, dass ich sie einfach in Setup.hs einfüge! – Syzygies