Haskell:检测当前的操作系统

时间:2014-04-20 14:08:19

标签: haskell

我正在编写一个Haskell包。我希望它在Windows和Unix上表现不同。什么是最“正确”的方法来检测正在编译我的代码的操作系统?

我确实尝试过使用CPP和#ifdef _WIN32,但这似乎根本不起作用。

还有另一个宏吗?我可以让Cabal告诉我吗?我需要完全尝试别的吗?

4 个答案:

答案 0 :(得分:29)

您可以使用System.Info

> :m + System.Info
> [os, arch]
["darwin","i386"]

答案 1 :(得分:14)

引用GHC manual

  

GHC定义的符号如下所列。

     

[...]

     

os_HOST_OS=1 - 此定义允许基于操作系统的条件编译,其中os是当前操作系统的名称(例如linuxmingw32用于Windows ,solaris等。)。

因此,要检测您的代码是否在Windows上编译,您应该使用

#ifdef mingw32_HOST_OS

显然,您需要启用CPP才能正常工作。

对于那些想知道的人 - mingw32_HOST_OS也是在64位Windows上定义的:

C:\ghc-7.8.2\bin>ghc --info
...
,("Build platform","x86_64-unknown-mingw32")
,("Host platform","x86_64-unknown-mingw32")
,("Target platform","x86_64-unknown-mingw32")
...

C:\ghc-7.8.2\bin>ghc -E -optP-dM -cpp foo.hs

C:\ghc-7.8.2\bin>cat foo.hspp
{-# LINE 1 "foo.hs" #-}
#define __ASSEMBLER__ 1
#define mingw32_HOST_OS 1    
#define __GLASGOW_HASKELL__ 708    
#define __STDC_HOSTED__ 1    
#define TABLES_NEXT_TO_CODE 1    
#define x86_64_HOST_ARCH 1    
#define x86_64_BUILD_ARCH 1    
#define mingw32_BUILD_OS 1    
#define __SSE2__ 1    
#define __SSE__ 1

令人困惑的是,mingw64_HOST_OS不是 - 使用x86_64_HOST_ARCH专门检测64位Windows。

答案 2 :(得分:4)

这些都是很好的答案。为了完整起见,似乎Cabal还有一个钩子:

http://www.haskell.org/ghc/docs/7.0.3/html/Cabal/authors.html#conditions

特别是,#34; Windows"被识别为" mingw32"。我不想想如果我去安装64位GHC会发生什么! (那么那就是" mingw64"?)如果有一天GHC是用其他编译器构建的呢?或者,我们敢于梦想,存在不是GHC的Haskell编译器吗? (好吧,这听起来相当牵强,但它可能会发生......)

似乎Cabal有特殊情况逻辑来处理这个问题,因此os(windows)应该始终有效。在我看来,通过让Cabal完成工作,如果将来发生Wild Things,那么Cabal的工作就是解决这个问题,而不是我的工作。

答案 3 :(得分:0)

Cabal的Distribution.System模块具有一个OS data type和一个Arch data type,因此您可以针对命名的构造函数而不是字符串数据进行模式匹配。