我正在编写一个Haskell包。我希望它在Windows和Unix上表现不同。什么是最“正确”的方法来检测正在编译我的代码的操作系统?
我确实尝试过使用CPP和#ifdef _WIN32
,但这似乎根本不起作用。
还有另一个宏吗?我可以让Cabal告诉我吗?我需要完全尝试别的吗?
答案 0 :(得分:29)
您可以使用System.Info
:
> :m + System.Info
> [os, arch]
["darwin","i386"]
答案 1 :(得分:14)
引用GHC manual:
GHC定义的符号如下所列。
[...]
os_HOST_OS=1
- 此定义允许基于操作系统的条件编译,其中os
是当前操作系统的名称(例如linux
,mingw32
用于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,因此您可以针对命名的构造函数而不是字符串数据进行模式匹配。