Cabal将当前软件包安装到自己的.cabal-sandbox / * - packages.conf.d中

时间:2014-10-07 03:26:43

标签: haskell cabal

我有一个名为commands的包。我想将它安装到自己的沙盒中,例如.cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d/commands-0.0.0-f3f84f48f42ac74a69ee5fd73512bfd0.conf。目前,一个模块.hi只有一个Commands接口文件,我不知道它是如何实现的。

我尝试cabal install commands,按照“我认为其他软件包是如何到达那里的”的逻辑,但它以未知软件包失败。

我也试过ghc-pkg ghc-pkg update commands -f .cabal-sandbox/x86_64-osx-ghc-7.8.3-packages.conf.d之类的内容,但我没有正确使用它们。理想情况下,我想用阴谋来做这件事。

我尝试的最后一件事是ghc -idist/build/,但它抱怨接口文件中的软件包名称不同,命令与main(“...与接口文件中找到的名称不同......”) 。如果我伪造了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通过language-c-inline)。我的makefile:https://github.com/sboosali/Haskell-DragonNaturallySpeaking/blob/master/Makefile)。因此,我必须明确编译脚本。我不知道如何使用cabal编译executable,但我希望cabal构建并测试和管理我的library

通过将我的包放入沙箱,我将能够通过编译cabal exec -- ghc从脚本中导入其模块。我至少也可以将脚本包含在extra-source-files中,并且知道它会起作用。

2 个答案:

答案 0 :(得分:2)

以下是我的尝试:

  1. 首先取消注册任何以前的命令库。尝试 ghc-pkg --global unregister commands
  2. 在沙盒中安装新命令。 从您的沙盒目录中,尝试以下操作: cabal --enable-shared --disable-documentation --prefix=./ install /path/to/your/library/source
  3. 注意前缀规范。

答案 1 :(得分:0)

我核了它(rm -fr .cabal-sandbox/),重新安装了所有内容(cabal install --only-dependencies),将其自身添加为源(cabal sandbox add-source .),安装它(cabal install command)。然后make工作了。 IDK的...