2011-09-17 48 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

這兩種方式都適合我。謝謝! –

相關問題