Как написать независимый от платформы код на Haskell (ghc)

В Hackage есть несколько специфичных для платформы библиотек, которые я хотел бы использовать (например, inotify, kqueue). Однако документация о том, как переключаться между платформами с помощью условной компиляции, кажется немного скудной. У меня возникли проблемы с поиском соответствующих документов...

  1. Какие определения препроцессора я могу использовать для переключения между платформами?

  2. Как мне настроить мой файл cabal для включения / исключения inotify/kqueue в linux/osx соответственно?

Я надеюсь, что документирование здесь может быть полезным и для других, поэтому стоит упомянуть другие распространенные платформы. Глупо искать это повсюду.

1 ответ

Решение
  1. Посмотрите на os_HOST_OS флаги в сочетании с опцией препроцессора C -cpp (или используя {-# LANGUAGE CPP #-}) как указано в документации GHC

  2. добавлять extensions: CPP к описанию вашего пакета, как показано в документации Cabal, и определите пользовательский флаг следующим образом:

    if os(linux)
         cpp-options: -DINOTIFY
    if os(darwin)
         cpp-options: -DKQUEUE
    

Вы можете использовать #ifdef в вашем источнике.

Другие вопросы по тегам