如何在haskell+cabal中配置构建依赖



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

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

但是,尽管我的配置,cabal build总是构建我的/System/Posix/Files。这是因为我有导入System.Posix。文件在我的main.hs:

预处理test-1.1.1的可执行文件
建筑test-1.1.1…
[1 of 2]编译System.Posix.Files (System/Posix/Files. Files)海关,dist/构建/测试/test-tmp/系统/Posix文件。o)
[2 of 2]编译Main(主)海关,dist/构建/测试/test-tmp/主要。o)
链接dist/build/test/test…

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

这可以使用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: .

最新更新