GHC版本检入代码

我为Alex做出了贡献,显然它依赖于很多库,并且应该为许多版本编译。

我需要使用GHC 7.6.1中提供的函数来更好地处理错误。 所以我想用#if ...来导入这个函数,否则,我会以不同的方式处理这个错误。

我见过一些:

#if __GLASGOW_HASKELL__ >= 610
import Control.Exception ( bracketOnError )
#endif

所以我做了:

#if __GLASGOW_HASKELL__ >= 761
import Text.Read ( readMaybe )
#endif

认为761是GHC 7.6.1版的别名,当我构建cabal包并试用时,即使使用The Glorious Glasgow Haskell编译系统7.8.4版 ,该函数也不会被导入。

因此,在使用程序进行试用后,我发现7.8.1__GLASGOW_HASKELL__标识为708

{-# LANGUAGE CPP #-}
module Main where

#if __GLASGOW_HASKELL__ == 708
ver = "==708"
#else
ver = "/=708"
#endif

main = putStrLn $ ver

并运行它:

$ runhaskell if.hs
==708

我如何知道7.6.1应该使用什么值,还是有更好的方法来处理这个问题?


这在GHC用户指南的第6.11.3.1节中有描述:

对于GHC版本xyz__GLASGOW_HASKELL__的值是整数⟨xyy⟩(如果⟨y⟩是单个数字,则添加前导零,例如在GHC的版本6.2中,例如__GLASGOW_HASKELL__==602 )。 GHC版本编号政策的更多信息。

因此,对于7.6.1 ,您可以检查__GLASGOW_HASKELL__ >= 706 。 原因是7.10.x这样的版本。


阅读精美的文档:

对于GHC的版本xyz, __GLASGOW_HASKELL__的值是整数xyy(如果y是单个数字,则添加前导零,例如在GHC的版本6.2中,例如__GLASGOW_HASKELL__ == 602)。 更多信息请参见第1.4节“GHC版本编号策略”。

幸运的是,在支持C风格预处理的所有其他实现中, __GLASGOW_HASKELL__将是未定义的。

(供参考:其他系统的可比符号是: __HUGS__表示拥抱, __NHC__表示nhc98,而__HBC__表示hbc。)

NB。 预处理Haskell源代码和C源代码(包括从Haskell模块生成的C源代码(即.hs,.lhs,.c和.hc文件))时,会设置此宏。


正如Daniel Wagner指出的那样,检查软件包版本的最正确方法通常是使用Cabal MIN_VERSION宏。 例如,你可以使用

#if MIN_VERSION_base(4,6,0)

以确定base包是否至少为版本4.6.0,这是您寻求的功能的最早版本。

base包有点奇怪。 它由GHC和现在已经不存在的拥抱和NHC实现使用。 然后使用Cabal宏可以更方便地检查base版本。 现在,GHC是唯一使用base ,所以可移植性的论点有点不太清楚,但是这种方法也有检查主版本号和次版本号的优点。

由于base版本与GHC版本紧密相关,因此您可以定义MIN_VERSION_base的合理回退形式, MIN_VERSION_base在没有Cabal的情况下编译,使用__GLASGOW_HASKELL__估计base版本。 目前的containers头有条件地定义了这样的回退。

更新

从GHC 8开始,编译器本身已经接管了定义MIN_VERSION宏的工作。 这很棒,因为无论您是否使用Cabal构建,您现在都可以使用这些宏。 没有更多丑陋的近似值!

链接地址: http://www.djcxy.com/p/43405.html

上一篇: GHC version check in code

下一篇: EclipseFP is searching for GHC and cannot find it