【问题标题】:How to configure build-dependencies in haskell+cabal?如何在 haskell+cabal 中配置构建依赖项?
【发布时间】:2011-09-17 18:38:59
【问题描述】:

我必须构建一些依赖于操作系统的应用程序。例如,我正在搜索目录,如果我看到某些项目是符号链接(在 linux 中),我会跳过它们并继续。为了检查这一点,我使用了“unix”包附带的函数 System.Posix.Files.isSymbolicLink。问题是这个包不能在 Windows 上构建,当应用程序在 Windows 上构建时,我必须以某种方式绕过这个限制。我试过这个技巧:
1) 创建了附加文件:./System/Posix/Files.hs,其中公开了函数 isSymbolicLink,它总是返回 False
2) 更新 .cabal 文件如下:

if os(windows)
    other-modules: System.Posix.Files
else
    build-depends: unix

但是,尽管我的配置,cabal build 总是构建我的 /System/Posix/Files.hs,因为我的 main.hs 中有 import System.Posix.Files

为 test-1.1.1 预处理可执行文件...
构建 test-1.1.1...
[1 of 2] 编译 System.Posix.Files ( System/Posix/Files.hs, dist/build/test/test-tmp/System/Posix/Files.o )
[2 of 2] 编译 Main (main.hs, dist/build/test/test-tmp/Main.o)
链接 dist/build/test/test ...

所以即使我在 linux 上构建,应用程序也会得到我的空白 isSymbolicLink 函数,而不是“unix”包提供的函数。当我在 linux 上构建时,如何告诉 cabal 不包含此文件,并使用“unix”包提供的模块?或者也许有其他方法可以解决这些问题?

【问题讨论】:

    标签: haskell cabal


    【解决方案1】:

    这可以使用CPP 预处理器解决。

    在您的 .cabal 文件中,添加

    if os(windows)
      Cpp-options: -DWINDOWS
    else
      Build-depends: unix
    

    然后添加一个模块,该模块将有条件地从unix 包中导出isSymbolicLink,或者为Windows 提供一个虚拟模块。

    {-# LANGUAGE CPP #-}
    module Compatibility (isSymbolicLink) where
    
    #ifndef WINDOWS
    import System.Posix.Files
    #else
    isSymbolicLink _ = return False
    #endif
    

    现在只需在需要使用此功能的任何地方导入此模块即可。


    另一种选择是坚持您的初始方法,但将您的 System/Posix/Files.hs 移动到您有条件地添加到 Hs-Source-Dirs 的子目录中。

    if os(windows)
      Other-modules: System.Posix.Files
      -- Assuming you moved it to windows/System/Posix/Files.hs
      Hs-source-dirs: .,windows    
    else
      Build-depends: unix
      Hs-Source-Dirs: .
    

    【讨论】:

    • 两种方式都适合我。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多