2012-12-10 9 views
19

Hackageには、使用したいプラットフォーム固有のライブラリがいくつかあります(inotify、kqueueなど)。しかし、条件付きコンパイルを使用してプラットフォーム間を切り替える方法に関するドキュメントは少しばかり見えます。関連するドキュメントを見つける際に問題が発生しています...Haskellでプラットフォームに依存しないコードを書く方法(ghc)

  • どのプリプロセッサ定義を使ってプラットフォームを切り替えることができますか?

  • inotify/kqueueをそれぞれlinux/osxに組み込む/除外するようにカバールファイルを設定するにはどうすればよいですか?

  • ここに記載されていることが他の人にとっても役立つことが期待されますので、他の共通プラットフォームについて言及する価値があります。場所のいたるところでこのようなものを探すのはばかげている。

    答えて

    12
    1. GHC documentation

    2. に述べたようにCabal documentationに示すように、パッケージの説明にextensions: CPPを追加して定義するCプリプロセッサオプション-cpp(または{-# LANGUAGE CPP #-}を使用して)との組み合わせでos_HOST_OS旗を見てみましょうこのようなカスタムフラグ:

      if os(linux) 
          cpp-options: -DINOTIFY 
      if os(darwin) 
          cpp-options: -DKQUEUE 
      

    あなたのソースに#ifdefを使用することができます。

    +7

    可能であれば、CPPを使用するのではなく、異なるパッケージを組み込むためにos_HOST_OSを使用することをお勧めします。 –

    +4

    異なるオペレーティングシステムで異なる書き方が必要なモジュール全体がある場合、カバールの 'os'ブロックを使用してソースツリー全体を選択することもできます。 'cpp-options'ブロックを内部に置くのではなく、' hs-source-dirs'ブロックを内部に置きます。 –

    +0

    ありがとう、良い答え –

    関連する問題