2012-09-24 32 views
12

Tôi muốn Cabalize một dự án Haskell để tải nó lên Hackage. Nó bao gồm một tệp .hs chuẩn để xây dựng tệp thực thi khởi động và tám tệp .lhs không chuẩn được xử lý bởi tệp thực thi bootstrap để mang lại các tệp .hs tạo tệp thực thi sản xuất.Làm thế nào để xây dựng và sử dụng một bootstrap thực thi trong một gói Cabal

Nói cách khác, dự án của tôi là một bộ tiền xử lý văn bản tùy chỉnh (với đánh dấu HTML, viết mã, tài liệu tại đây) được viết bằng chính nó. Nó phụ thuộc vào một phiên bản bootstrap có thể dịch mã ngôn ngữ cho phiên bản sản xuất, nhưng không thích hợp cho việc sử dụng chung. Vì vậy, tôi không muốn phiên bản bootstrap là một gói riêng biệt; nó chỉ được sử dụng một lần, ở đây.

Tôi đã sử dụng Makefile, có thể có trong Cabal nhưng không theo tinh thần của Cabal. Một cách sạch sẽ để làm điều này, mà tận dụng tối đa lợi thế của tính tổng quát của Cabal là gì? Tôi đã không nhìn thấy bất kỳ đề xuất cho điều này trong tài liệu trực tuyến, viết tắt của một trong hai viết lại Distribution.Simple hoặc sử dụng một Makefile.

Trả lời

7

Tôi nghĩ rằng việc phát hành tệp khởi động của bạn dưới dạng gói riêng biệt là giải pháp dễ nhất và có instructions available on how to integrate your custom preprocessor with Cabal.

Nếu bạn không muốn làm điều đó, hãy thử làm cho phần tiền xử lý của bạn là Setup.hs (đừng quên đặt loại xây dựng thành Custom!). Bạn có thể chạy bộ tiền xử lý của bạn trong bước cấu hình. Hãy xem cách wxcore thực hiện việc này.

Dưới đây là một ví dụ làm việc (theo khuôn mẫu sau 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

Rất tuyệt! Tôi đang thử nghiệm với điều này ngay bây giờ. Mã tiền xử lý bootstrap của tôi khá ngắn; một lựa chọn sẽ cho tôi để chỉ đơn giản là bao gồm nó trong Setup.hs! – Syzygies

Các vấn đề liên quan