Haskell &引用;“自举”;与阴谋集团
想象一个Makefile,如下所示:Haskell &引用;“自举”;与阴谋集团,haskell,cabal,Haskell,Cabal,想象一个Makefile,如下所示: stage1 : Stage1.hs ghc -o stage1 Stage1.hs Stage1.hs : stage0 stage0 > Stage1.hs stage0 : Stage0.hs ghc -o stage0 Stage0.hs 当前目录首先将包含Makefile和Stage0.hs,并生成stage1 以下是问题: 我怎样才能完全在阴谋集团内部完成上述工作?我只能用钩子做这个吗? (喜欢
stage1 : Stage1.hs
ghc -o stage1 Stage1.hs
Stage1.hs : stage0
stage0 > Stage1.hs
stage0 : Stage0.hs
ghc -o stage0 Stage0.hs
当前目录首先将包含Makefile和Stage0.hs,并生成stage1
以下是问题:
在这种情况下,阴谋集团是很狡猾的 正如您所说,如果您可以将所有内容压缩到
Setup.hs
,您将把遇到的头痛问题减到最少
如果您有非常复杂的预处理器,我建议您这样做:
stage0
,您将拥有如下cabal文件:
Name:
mypackage-stage0
Version:
0.1
-- ...
Executable mpk-stage0
Default-language:
Haskell2010
Main-is:
Stage0.hs
-- ...
stage1
,您需要生成源代码,因此在运行mpk-stage0
可执行文件的mypackage-stage1
的Setup.hs
中添加一个preBuild
钩子:
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
这应该在最近的阴谋集团版本中起作用;否则,您可能必须添加一个构建依赖项:
依赖项;do(cd$项目;阴谋集团安装);完成
或类似操作阴谋集团从来不是为这种项目而建立的,所以如果你想做这样的事情,它将是棘手的。如果您想以更连贯的方式生成代码,您应该考虑使用模板Haskell。对于Happy和Alex,Cabal已经知道如何处理这些问题,因此,您只需在
公开模块
或其他模块
中列出模块,Cabal将生成.hs
文件并自动编译。这是正确的。也许我应该提一下。非常感谢你的快速回复,很抱歉我迟到了。这个阴谋集团从来就不是为这种项目而建立的,这确实是我所怀疑的。仅供参考,我的临时解决方案是为每个可执行文件添加一个标志,并使用master Makefile.am来驱动编译。你的建议似乎有所改进,但也会出现其他问题。如果我不想在用户系统中安装stage0怎么办?是否可以在生成系统中本地注册临时包?模板Haskell是否支持多阶段代码生成?最后,如果我自己找到答案,我是否应该在这里写评论?或者发布另一个答案来回答我自己的问题?谢谢遗憾的是,您无法生成临时可执行文件。Haskell模板可分多个阶段使用;您可以使用TH生成生成Haskell代码的TH代码。如果你认为你的答案会帮助别人,你应该发布你自己的答案。