Haskell:检测当前操作系统

Haskell:检测当前操作系统,haskell,Haskell,我目前正在写一个Haskell软件包。我希望它在Windows和Unix上的行为有所不同。检测我的代码正在编译的操作系统的最“正确”的方法是什么 我确实尝试过使用CPP和#ifdef\u WIN32,但这似乎根本不起作用 还有其他宏吗?我能让阴谋集团告诉我吗?我需要完全尝试其他东西吗?您可以使用System.Info: > :m + System.Info > [os, arch] ["darwin","i386"] 引述: GHC定义的符号如下所示 [……] os\u HOST\

我目前正在写一个Haskell软件包。我希望它在Windows和Unix上的行为有所不同。检测我的代码正在编译的操作系统的最“正确”的方法是什么

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


还有其他宏吗?我能让阴谋集团告诉我吗?我需要完全尝试其他东西吗?

您可以使用
System.Info

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

GHC定义的符号如下所示

[……]

os\u HOST\u os=1
-此定义允许基于操作系统进行条件编译,其中
os
是当前操作系统的名称(例如
linux
mingw32
for Windows,
solaris
等)

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

#ifdef mingw32_HOST_OS
显然,您需要启用CPP才能正常工作


对于那些想知道-
mingw32\u主机\u操作系统
也在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\u-HOST\u-OS
不是-使用
x86\u-HOST\u-ARCH
专门检测64位窗口。

这些都是很好的答案。为了完整起见,似乎阴谋集团也有一个钩子:

特别值得一提的是,“Windows”被标识为“mingw32”,这有点令人伤心。我讨厌去想如果我去安装64位GHC会发生什么!(那会是“mingw64”吗?)如果有一天GHC是用其他编译器构建的呢?或者,我们敢说,存在着不是GHC的Haskell编译器吗?(好吧,这听起来很牵强,但它可能会发生…)


似乎阴谋集团有特殊的案例逻辑来处理这个问题,因此
os(windows)
应该一直工作。在我看来,通过让阴谋集团来做这项工作,如果未来发生了不寻常的事情,这将是阴谋集团的工作,而不是我的。

阴谋集团的分布。系统模块有一个和一个,因此您可以根据命名的构造函数而不是严格的数据进行模式匹配

例如,您可以使用:


#ifdef mingw32_HOST_OS
。我喜欢这个,因为它只是一个普通的Haskell代码,看一个普通常量。美好的好极了我始终支持不直接使用
CPP
;)的解决方案我很惊讶,所有的答案,所有的人都使用一些Cabal CPP插件或Cabal模块来确定平台,而从2001年开始(至少)在
基础中有
System.Info
。并且有
System.Environment
从环境中确定操作系统。还有一个
posix
包添加了另一组选项。我喜欢它,因为它允许我选择要做什么,但没有运行时开销。有点悲哀,这是明哥特有的……你说的“明哥特有”是什么意思?正如手册所述,您还可以使用
linux\u HOST\u OS
solaris\u HOST\u OS
,等等。
mingw32\u HOST\u OS
也定义在64位Windows上。请参阅我的更新答案。这个答案可以从使用示例中受益匪浅。
case buildOS of
  Windows -> -- do something
  _ -> -- do something else