Помимо очень полезных флагов, определенных GHC (ОС, архитектура и т. Д.), При использовании cabal определяются другие флаги и макросы.
Проверка версий пакета
Вот пример использования crypto-api , который проверяет версию используемого пакета tagged
:
#if MIN_VERSION_tagged(0,2,0)
import Data.Proxy
#endif
Пользовательские CPP определяются на основе флагов Cabal
Вы можете определять символы CPP в зависимости от флагов клики.Вот (излишне сложный) пример из pureMD5 (из файла .cabal):
if arch(i386) || arch(x86_64)
cpp-options: -DFastWordExtract
Внутри модуля .hs
вы можете использовать #ifdef
, например:
#ifdef FastWordExtract
getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))
#else
... other code ...
#endif
Более подробную информацию вы можете найти в руководстве пользователя Cabal. Эта страница содержит информацию об условной компиляции, которую вы, вероятно, ищете.