Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

  • Взгляните на флаги os_HOST_OS в сочетании с опцией препроцессора C -cpp (или с помощью {-# LANGUAGE CPP #-}), как указано в документации GHC

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

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

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