如何在Haskell(ghc)中编写与平台无关的代码

Reh*_*que 19 haskell platform-specific platform-independent

我想在Hackage中使用一些特定于平台的库(例如inotify,kqueue).但是,有关如何使用条件编译在平台之间切换的文档似乎有点稀疏.我在查找相关文档时遇到了一些麻烦......

  1. 我可以使用哪些预处理器定义在平台之间切换?

  2. 如何设置我的cabal文件分别在linux/osx上包含/排除inotify/kqueue?

我希望在此处记录它可能对其他人也有用,所以提及其他常见平台可能是值得的.到处寻找这些东西真是太傻了.

Sec*_*coe 12

  1. 根据GHC文档中的说明,os_HOST_OS结合C预处理器选项-cpp(或使用{-# LANGUAGE CPP #-})查看标志

  2. 添加extensions: CPP到您的包描述中,如Cabal文档中所示,并定义如下自定义标志:

    if os(linux)
         cpp-options: -DINOTIFY
    if os(darwin)
         cpp-options: -DKQUEUE
    
    Run Code Online (Sandbox Code Playgroud)

然后#ifdef,您可以在源中使用.

  • 如果可能,最好使用os_HOST_OS来包含不同的包,而不是使用CPP. (7认同)
  • 如果整个模块需要针对不同的操作系统进行不同的编写,您还可以使用cabal的`os`块来在整个源树之间进行选择.而不是在里面放置一个`cpp-options`块,而是放入一个`hs-source-dirs`块. (4认同)