2012-12-10 28 views
19

Istnieje kilka bibliotek specyficznych dla platformy w Hackage, z których chciałbym skorzystać (np. Inotify, kqueue). Jednak dokumentacja, jak przełączać się między platformami za pomocą kompilacji warunkowej, wydaje się nieco skąpa. Mam problem ze znalezieniem odpowiednich dokumentów ...Jak napisać kod niezależny od platformy w Haskell (ghc)?

  1. Które definicje preprocesora można użyć do przełączania między platformami?

  2. Jak mogę skonfigurować plik cabal, aby uwzględnić/wykluczyć inotify/kqueue na linux/osx?

Mam nadzieję, że udokumentowanie tego tutaj może być przydatne również dla innych osób, warto więc wspomnieć o innych typowych platformach. Głupio jest szukać tych rzeczy w każdym miejscu.

Odpowiedz

12
  1. Spójrz na os_HOST_OS flagi w połączeniu z opcją C preprocesora -cpp (lub za pomocą {-# LANGUAGE CPP #-}), jak podano w GHC documentation

  2. Dodaj extensions: CPP do opisu pakietu, jak pokazano na Cabal documentation i zdefiniować zwyczaj flag tak:

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

Możesz następnie użyć #ifdef w swoim źródle.

+7

Preferowane jest użycie os_HOST_OS do włączenia różnych pakietów, a nie korzystania z CPP, jeśli to możliwe. –

+4

Możesz także użyć bloków 'os' cabal do wyboru między całymi źródłami drzew, jeśli istnieją całe moduły, które muszą być napisane inaczej dla różnych systemów operacyjnych. Zamiast wstawiania bloku 'cpp-options' wewnątrz, ale wewnątrz bloku' hs-source-dirs'. –

+0

Dziękuję, dobra odpowiedź –

Powiązane problemy