2011-09-17 14 views
3

私は、OSに依存するいくつかのアプリケーションを構築する必要があります。たとえば、私はディレクトリを検索していますが、いくつかの項目がシンボリックリンク(Linuxの場合)であれば、それらをスキップして行きます。これをチェックするには、 "unix"パッケージで提供されるSystem.Posix.Files.isSymbolicLink関数を使用します。問題は、このパッケージがWindows上に構築されないことです。アプリケーションがWindows上に構築されたときに、この制限を何とか回避する必要があります。
1)追加ファイル:./System/Posix/Files.hsを作成しました。公開された関数は、シンボルが常に、偽を返します。以下で
2)更新.cabalファイル:haskell + cabalでビルド依存関係を設定するには?

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

しかし、私は輸入System.Posix.Filesを持っているので、私の設定にもかかわらず、徒党ビルドはいつも私の/System/Posix/Files.hsを構築私main.hs中:テスト-1.1.1用

前処理の実行...
ビルテスト-1.1.1 ...
[2の1]コンパイルSystem.Posix.Files(システム/ Posix/Files.hs、dist/build/te
[2/2]メイン(main.hs、dist/build/test/test-tmp/Main.o)のコンパイル
dist/build/testのリンク/テスト...

だから、でも私は、Linux上に構築、アプリケーションではなく、「UNIX」パッケージで提供されるもの、私の空白isSymbolicLink機能を取得します。私はcabalにこのファイルを含めないようにするにはどうしたらいいですか?Linuxでビルドするときに "unix"パッケージで提供されるモジュールを使用しますか?あるいは、そのような問題を解決するための別のアプローチがありますか?

答えて

4

これは、CPPプリプロセッサを使用して解決できます。あなたの.cabalファイルで

、その後、条件付きunixパッケージ、またはWindows用のダミー1からisSymbolicLinkをエクスポートしますモジュールを追加

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

を追加します。

{-# LANGUAGE CPP #-} 
module Compatibility (isSymbolicLink) where 

#ifndef WINDOWS 
import System.Posix.Files 
#else 
isSymbolicLink _ = return False 
#endif 

この機能を使用する必要がある場合は、このモジュールをインポートするだけで十分です。


別のオプションは、あなたの最初のアプローチに固執していますが、条件付きでHs-Source-Dirsに追加するサブディレクトリにあなたのSystem/Posix/Files.hsを移動することです。

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

両方の方法が適しています。ありがとうございました! –

関連する問題