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

20

有一些Hackage中特定于平台的库我想要使用(例如inotify、kqueue)。然而,关于如何使用条件编译在不同平台之间切换的文档似乎有点稀少。我在寻找相关文档时遇到了一些困难...

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

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

我希望这里记录的内容对其他人也有用,因此可能值得提及其他常见平台。在各个地方搜索这些东西是很傻的。

1个回答

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

  2. 根据Cabal文档,在您的软件包描述中添加extensions: CPP并定义自定义标志,例如:

  3. if os(linux)
         cpp-options: -DINOTIFY
    if os(darwin)
         cpp-options: -DKQUEUE
    
    你可以在源代码中使用#ifdef

7
如果可能的话,最好使用 os_HOST_OS 来包含不同的软件包,而不是使用 CPP。 - Don Stewart
4
您还可以使用cabal的os块来选择整个源代码树,如果有整个模块需要针对不同操作系统进行不同的编写。而不是将cpp-options块放在内部,而是将hs-source-dirs块放在内部。 - Daniel Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接