2014-04-20 12 views
6

Obecnie piszę pakiet Haskell. Chcę, aby zachowywał się inaczej w systemach Windows i Unix. Jaki jest najbardziej "poprawny" sposób wykrywania systemu operacyjnego, na którym mój kod jest kompilowany?Haskell: Wykryj bieżący OS

Próbowałem użyć CPP i #ifdef _WIN32, ale to nie wydaje się działać w ogóle.

Czy jest inne makro? Czy mogę powiedzieć, żeby Cabal mi powiedział? Czy muszę spróbować czegoś zupełnie innego?

+1

'#ifdef mingw32_HOST_OS'. –

Odpowiedz

13

Cytowanie GHC manual:

Symbole zdefiniowane GHC są wymienione poniżej.

[...]

os_HOST_OS=1 - To pozwala określić kompilacja warunkowa w oparciu o system operacyjny, gdzie os jest nazwą bieżącego systemu operacyjnego (. Np linux, mingw32 dla Windows, solaris, itd.) .

Tak, aby wykryć, czy kod jest kompilowany w systemie Windows należy użyć

#ifdef mingw32_HOST_OS 

Oczywiście, musisz mieć włączony CPP za to do pracy.

Dla tych, którzy zastanawiają się - mingw32_HOST_OS jest również określona na 64-bitowym systemie Windows:

C:\ghc-7.8.2\bin>ghc --info 
... 
,("Build platform","x86_64-unknown-mingw32") 
,("Host platform","x86_64-unknown-mingw32") 
,("Target platform","x86_64-unknown-mingw32") 
... 

C:\ghc-7.8.2\bin>ghc -E -optP-dM -cpp foo.hs 

C:\ghc-7.8.2\bin>cat foo.hspp 
{-# LINE 1 "foo.hs" #-} 
#define __ASSEMBLER__ 1 
#define mingw32_HOST_OS 1  
#define __GLASGOW_HASKELL__ 708  
#define __STDC_HOSTED__ 1  
#define TABLES_NEXT_TO_CODE 1  
#define x86_64_HOST_ARCH 1  
#define x86_64_BUILD_ARCH 1  
#define mingw32_BUILD_OS 1  
#define __SSE2__ 1  
#define __SSE__ 1 

Confusingly, mingw64_HOST_OS nie jest - używać x86_64_HOST_ARCH wykryć 64-bitowego systemu Windows specjalnie.

+0

Podoba mi się to, ponieważ pozwala mi wybrać, co robić, ale bez nakładu pracy runtime. To trochę smutne, że jest specyficzne dla MinGW chociaż ... – MathematicalOrchid

+1

Co masz na myśli przez "specyficzne dla MinGW"? Jak mówi instrukcja, możesz również użyć 'linux_HOST_OS',' solaris_HOST_OS', itd. –

19

Można użyć System.Info:

> :m + System.Info 
> [os, arch] 
["darwin","i386"] 
+3

Podoba mi się to, ponieważ jest to zwykły zwykły kod Haskella, patrząc na zwykłą stałą. Miły! – MathematicalOrchid

+0

Fantastyczne! Zawsze opowiadam się za rozwiązaniami, które nie wymagają bezpośredniego użycia 'CPP';) –

4

To są dobre odpowiedzi. Dla kompletności, wydaje Cabal posiada również hak do tego:

http://www.haskell.org/ghc/docs/7.0.3/html/Cabal/authors.html#conditions

W szczególności, jest to nieco smutne, że „Windows” jest oznaczony jako „mingw32”. Nienawidzę myśleć, co by się stało, gdybym poszedł i zainstalował 64-bitowy GHC! (Czy to byłoby wtedy "mingw64"?) A co jeśli pewnego dnia GHC zostanie zbudowany z innym kompilatorem? Lub, ośmielajmy się marzyć, istnieją kompilatory Haskell, które nie są GHC? (OK, to brzmi dosyć daleko idące, ale może się to wydarzyć ...)

Wygląda na to, że Cabal ma specjalną logikę, aby poradzić sobie z tym, tak, że os(windows) ma działać cały czas. Wydaje mi się, że gdy Cabal wykona pracę, jeśli w przyszłości wydarzy się Dzikich Przedmiotów, zadaniem Cabala będzie uporządkowanie tego, nie mojego.

+2

'mingw32_HOST_OS' jest również zdefiniowany w 64-bitowym systemie Windows. Zobacz moją zaktualizowaną odpowiedź. –