Haskell &引用;“自举”;与阴谋集团

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 以下是问题: 我怎样才能完全在阴谋集团内部完成上述工作?我只能用钩子做这个吗? (喜欢

想象一个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

以下是问题:

  • 我怎样才能完全在阴谋集团内部完成上述工作?我只能用钩子做这个吗? (喜欢或不喜欢。) 如果钩子必须依赖于要构建的包中的另一个程序,该怎么办
  • 如果Setup.hs变得足够复杂,需要自己的 依赖关系管理
  • 有没有类似的Cabized软件包?如果Happy包含一个依赖于Happy调用的cablized测试程序,那将是一个完美的例子
    在这种情况下,阴谋集团是很狡猾的

    正如您所说,如果您可以将所有内容压缩到
    Setup.hs
    ,您将把遇到的头痛问题减到最少

    如果您有非常复杂的预处理器,我建议您这样做:

  • 为每个预处理器制作一个cabal包,包含其自身的依赖项等。因此,对于
    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
    
    这应该在最近的阴谋集团版本中起作用;否则,您可能必须添加一个
    构建依赖项:
    依赖项

  • 每次进行级联更改时,您都需要依次重建每个包(这是必要的,因为cabal不管理跨项目依赖项更改),因此您需要一个脚本,该脚本在mypackage-stage0 mypackage-stage1中为项目执行
    ;do(cd$项目;阴谋集团安装);完成
    或类似操作


  • 阴谋集团从来不是为这种项目而建立的,所以如果你想做这样的事情,它将是棘手的。如果您想以更连贯的方式生成代码,您应该考虑使用模板Haskell。

    对于Happy和Alex,Cabal已经知道如何处理这些问题,因此,您只需在
    公开模块
    其他模块
    中列出模块,Cabal将生成
    .hs
    文件并自动编译。这是正确的。也许我应该提一下。非常感谢你的快速回复,很抱歉我迟到了。这个阴谋集团从来就不是为这种项目而建立的,这确实是我所怀疑的。仅供参考,我的临时解决方案是为每个可执行文件添加一个标志,并使用master Makefile.am来驱动编译。你的建议似乎有所改进,但也会出现其他问题。如果我不想在用户系统中安装stage0怎么办?是否可以在生成系统中本地注册临时包?模板Haskell是否支持多阶段代码生成?最后,如果我自己找到答案,我是否应该在这里写评论?或者发布另一个答案来回答我自己的问题?谢谢遗憾的是,您无法生成临时可执行文件。Haskell模板可分多个阶段使用;您可以使用TH生成生成Haskell代码的TH代码。如果你认为你的答案会帮助别人,你应该发布你自己的答案。