在cabal上使用extra-lib-dirs的相对路径

时间:2014-06-27 05:40:34

标签: haskell cabal

我有一个C库" myboo"哪个有Makefile。我想制作一个这个库的包装器。 我不想将它安装到/ usr / local中,因为" myboo"不是一个主要模块。 此外,我建议我建立" myboo"不是一个动态的库 但作为静态库。

我自定义Setup.py来构建" myboo";

main :: IO ()
main = defaultMainWithHooks simpleUserHooks {
           preBuild = \a b -> makeLib a b >> preBuild simpleUserHooks a b
           }

makeLib :: Args -> BuildFlags -> IO ()
makeLib _ flags = do
  let verbosity = fromFlag $ buildVerbosity flags
  cflags <- lookupEnv "CFLAGS" >>= return . maybe "" id
  setEnv "CFLAGS" $ "-fPIC" ++ (' ' : cflags)
  rawSystemExit verbosity "env" ["make", "--directory=myboo", "libmyboo.a"]

我安排myboo.cabal将我的haskell代码链接到C库;

library
  exposed-modules:     MyBoo
  build-depends:       base >=4.7 && <4.8
  hs-source-dirs:      src
  default-language:    Haskell2010
  include-dirs: myboo
  extra-libraries: myboo
  extra-lib-dirs: myboo

当我运行&#34; cabal build&#34;时,我收到了以下消息。

myboo-0.1.0.0: library-dirs: myboo is a relative path which makes no sense (as
there is nothing for it to be relative to). You can make paths relative to the
package database itself by using ${pkgroot}. (use --force to override)

如果我写&#34; extra-lib-dirs:/ absolute / path / to / working / dir / myboo&#34;,它似乎运作良好。 但这不是一个好方法,因为/ absolute / ...只是一个工作目录。

我应该如何修复上述错误消息?我的环境在这里;

% ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.2
% cabal --version
cabal-install version 1.20.0.2
using version 1.20.0.0 of the Cabal library
% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

2 个答案:

答案 0 :(得分:7)

您可以编写自己的Setup.hs并设置Distribution.Simple.confHook。在钩子函数中,修改Distribution.PackageDescription.extraLibDirs以包含目录。

请注意,您还需要将cabal文件中的build-type更改为Custom

以下是Setup.hs的链接,其中我做了我写的内容。

答案 1 :(得分:1)

有点晚了,但是......

现在,您可以使用相对路径在extra-include-dirs中设置extra-lib-dirsstack.yaml选项。例如,对于某个包A,它看起来像这样:

extra-include-dirs:
- ../my-c-lib/src

extra-lib-dirs:
- ../my-c-lib/build

假设Amy-c-lib都存储在同一文件夹中。

那就是它。它并不要求您设置LD_LIBRARY_PATH变量(直到您运行可执行文件)。但是,如果您有一个使用B的广告资源A,则必须将A&#39; extra-..-dirs添加到B&#39} stack.yaml。否则,您将收到Missing C library错误。此外,必须在此设置LD_LIBRARY_PATH,以防止在can't load .so/.DLL建设期间出现B错误。

基本上它是构建本地软件包的一种解决方法。我不会将它用于公共包,因为它会强制用户修改stack.yaml或将dependend包存储在同一个文件夹中。