【发布时间】:2014-10-07 03:26:42
【问题描述】:
我有一个名为commands 的包。我想将它安装到它自己的沙箱中,例如.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d/commands-0.0.0-f3f84f48f42ac74a69ee5fd73512bfd0.conf。目前,一个模块Commands只有一个.hi接口文件,我不知道它是怎么到那里的。
我尝试了cabal install commands,按照“我认为其他包是如何到达那里的”的逻辑,但它因未知包而失败。
我也尝试过使用ghc-pkg 的东西,比如ghc-pkg update commands -f .cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d,但我没有正确使用它们。理想情况下,我想用 cabal 来做这件事。
我尝试的最后一件事是ghc -idist/build/,但它抱怨接口文件中的包名称不同,命令与主文件不同(“...与接口文件中找到的名称不同...”)。如果我用ghc -package-name commands-0.0.0 伪造了可执行文件的包,链接器会抱怨它找不到符号_ZCMain_main_closure,因为每个可执行文件都需要Main 包Main 模块中的函数main。
我确信有更好的方法来做到这一点。
我为我的 cabal 文件遵循了在线示例:
$ cat commands.cabal
name: commands
library
exposed-modules: Commands.Types, Commands.Bits
...
最小的失败代码示例只是:
$ cat Main.hs
import Commands.Types
main = return ()
在根项目目录中。
上下文:我需要使用make(不是cabal)构建我的可执行文件,因为它链接到外部代码(Objective-C 通过语言-c-inline)。我的生成文件:https://github.com/sboosali/Haskell-DragonNaturallySpeaking/blob/master/Makefile)。因此,我必须明确编译一个脚本。我不知道如何用 cabal 编译 executable,但我希望 cabal 构建、测试和管理我的 library。
通过将我的包放入沙箱,我将能够通过使用cabal exec -- ghc 编译从脚本中导入它的模块。我也至少可以将脚本包含在extra-source-files 中,并且知道它会起作用。
【问题讨论】: