Подтвердить что ты не робот

Как создать и использовать исполняемый файл bootstrap в пакете Cabal

Я хотел бы Каббализировать проект Haskell, чтобы загрузить его в Hackage. Он состоит из одного стандартного файла .hs, который создает исполняемый файл bootstrap и восемь нестандартных файлов .lhs, которые обрабатываются исполняемым файлом bootstrap, чтобы получить файлы .hs, которые создают исполняемый файл.

Другими словами, мой проект представляет собой персонализированный препроцессор (с разметкой HTML, оформление кода, здесь документы), который написан сам по себе. Это зависит от версии bootstrap, которая может переводить грамотный код для производственной версии, но не подходит для общего использования. Поэтому я не хочу, чтобы версия bootstrap была отдельным пакетом; он предназначен для использования только один раз.

Я использую Makefile, который возможен в Cabal, но не в духе Cabal. Каков чистый способ сделать это, который использует максимальную пользу общности Cabal? Я не видел никаких предложений для этого в онлайн-документации, кроме как переписывания дистрибутива. Просто или с помощью Makefile.

4b9b3361

Ответ 1

Я думаю, что освобождение исполняемого файла bootstrap как отдельного пакета является самым простым решением, и есть инструкции по интеграции вашего пользовательского препроцессора с 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"