【问题标题】:How to write platform-independent code in Haskell (ghc)如何在 Haskell (ghc) 中编写与平台无关的代码
【发布时间】:2012-11-27 18:18:43
【问题描述】:

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

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

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

我希望将其记录在此处对其他人也可能有用,因此可能值得提及其他常见平台。到处寻找这些东西是愚蠢的。

【问题讨论】:

    标签: haskell platform-independent platform-specific


    【解决方案1】:
    1. 结合GHC documentation 中所述的 C 预处理器选项 -cpp(或使用 {-# LANGUAGE CPP #-})查看 os_HOST_OS 标志

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

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

    然后您可以在源代码中使用#ifdef

    【讨论】:

    • 如果可能,最好使用 os_HOST_OS 来包含不同的包,而不是使用 CPP。
    • 如果有需要针对不同操作系统以不同方式编写的整个模块,您还可以使用 cabal 的 os 块在整个源代码树之间进行选择。而不是在里面放一个cpp-options 块,而是在里面放一个hs-source-dirs 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多