Кабала сложна, когда дело доходит до таких ситуаций.
Как вы сказали, если вы можете втиснуть все в Setup.hs
, вы будете держать число головных болей до минимума.
Если у вас есть действительно сложные препроцессор, я бы предложил сделать это:
сделать пакет один междусобойчик для каждого препроцессора, со своими зависимостями и т.д. Таким образом, для stage0
, вы бы междусобойчик файл, как это:
Name:
mypackage-stage0
Version:
0.1
-- ...
Executable mpk-stage0
Default-language:
Haskell2010
Main-is:
Stage0.hs
-- ...
для stage1
, вам необходимо сгенерировать исходный код, так что добавьте preBuild
крюк в вашем Setup.hs
для mypackage-stage1
, который запускает исполняемый mpk-stage0
:
main =
defaultMainWithHooks simpleUserHooks
{ preBuild =
-- ... something involving `system "mpk-stage1 Stage1.hs"`
-- Note that shell redirection `> bla.hs` doesn't necessarily work
-- on all platforms, so make your `mpk-stage1` executable take an
-- output file argument
}
Вы бы затем добавить зависимость сборки-инструмента на предыдущем этапе:
Executable mpk-stage1
-- ...
Main-is:
Stage1.hs
Build-tools:
mypackage-stage0
Это должно работать в последних версиях Кабал; в противном случае, возможно, вам придется добавить зависимость Build-depends:
.
Вы будет необходимо восстановить каждый пакет в свою очередь, каждый раз, когда вы делаете изменения каскадный (Это необходимо потому, что заговорщики не управлять изменениями зависимостей кросс-проекта), так что вам нужен скрипт, который делает for project in mypackage-stage0 mypackage-stage1; do (cd $project; cabal install); done
или что-то аналогичный.
Cabal никогда не был построен для такого рода проектов, поэтому будет быть сложно, если вы хотите сделать что-то вроде этого. Вы должны изучить использование шаблона Haskell вместо этого, если вы хотите сгенерировать код более согласованным образом.
В случае с Happy и Alex Cabal уже знает, как с ними бороться, поэтому вам просто нужно перечислить модули в «Exposed-Modules» или «Other-Modules», а Cabal будет генерировать '.hs' и автоматически их компилировать. – hammar
Это правда. Возможно, я должен упомянуть [препроцессорные инструменты] (http://hackage.haskell.org/package/preprocessor-tools). – mnish