2011-09-17 45 views
3

我必须建立一些取决于操作系统的应用程序。例如,我正在搜索目录,如果我看到一些项目是符号链接(在Linux中),我只是跳过它们并继续。为了检查这一点,我使用了“unix”包装下的函数System.Posix.Files.isSymbolicLink。问题是这个软件包不能在Windows上构建,当应用程序在Windows上构建时,我不得不绕过这个限制。我试过这个技巧:
1)创建附加文件:./System/Posix/Files.hs,其中暴露功能isSymbolicLink总是返回
2)更新.cabal文件有以下几点:如何在haskell + cabal中配置构建依赖关系?

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

但是,尽管我的配置,阴谋建立总是建立我/System/Posix/Files.hs因为我有进口System.Posix.Files在我main.hs:

预处理可执行文件进行测试1.1.1 ...
大厦测试1.1.1 ...
[2 1]编译System.Posix.Files(系统/ Posix/Files.hs,dist/build/te编译主(main.hs,dist/build/test/test-tmp/Main.o)
链接dist/build/test /测试...

所以,即使我在Linux上构建,应用程序获取我的空白isSymbolicLink函数,而不是那些“UNIX”封装。我怎样才能告诉cabal不包含这个文件,并且在linux上构建时使用“unix”包提供的模块?或者也许有另一种方法来解决这些问题?

回答

4

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

在你.cabal文件,添加

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

然后加入将有条件地从unix包,或虚设一个用于Windows出口isSymbolicLink的模块。

{-# 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: . 
+0

这两种方式都适合我。谢谢! –

相关问题