2014-04-20 20 views
6

Attualmente sto scrivendo un pacchetto Haskell. Voglio che si comporti diversamente su Windows e Unix. Qual è il modo più "corretto" per rilevare quale sistema operativo viene compilato il mio codice?Haskell: Rileva l'attuale sistema operativo

Ho provato a utilizzare CPP e #ifdef _WIN32, ma non sembra funzionare affatto.

C'è un'altra macro? Posso convincere Cabal a dirmelo? Devo provare qualcos'altro interamente?

+1

'#ifdef mingw32_HOST_OS'. –

risposta

13

Citando il GHC manual:

i simboli definiti dai GHC sono elencati di seguito.

[...]

os_HOST_OS=1 - Questo permette di definire la compilazione condizionale in base al sistema operativo, dove os è il nome del sistema operativo corrente (es. linux, mingw32 per Windows, solaris, etc.) .

Quindi, per rilevare se il codice è stato compilato su Windows è necessario utilizzare

#ifdef mingw32_HOST_OS 

Ovviamente, è necessario disporre di CPP abilitato per questo al lavoro.

Per coloro che si stanno chiedendo - mingw32_HOST_OS è definita, inoltre su Windows a 64 bit:

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 

Confusamente, mingw64_HOST_OS non è - utilizzare x86_64_HOST_ARCH per rilevare a 64 bit di Windows specifico.

+0

Mi piace perché mi consente di scegliere cosa fare, ma senza sovraccarico di runtime. È un po 'triste che sia specifico per MinGW ... – MathematicalOrchid

+1

Cosa intendi per "specifico per MinGW"? Come dice il manuale, puoi anche usare 'linux_HOST_OS',' solaris_HOST_OS', ecc. –

19

Si potrebbe utilizzare System.Info:

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

Mi piace perché è semplicemente un normale codice Haskell che guarda una costante ordinaria. Bello! – MathematicalOrchid

+0

Fantastico! Sono sempre a favore di soluzioni che non prevedono l'uso diretto di 'CPP';) –

4

Queste sono tutte buone risposte. Per completezza, sembra Cabal ha anche un gancio per questo:

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

In particolare, è un po 'triste che "Windows" è identificata come "mingw32". Detesto pensare a cosa succederebbe se fossi andato a installare il sistema GHC a 64 bit! (Sarebbe allora "mingw64"?) E se un giorno GHC fosse costruito con qualche altro compilatore? O, osiamo sognare, esistono compilatori Haskell che non sono GHC? (OK, sembra abbastanza inverosimile in questo momento, ma potrebbe accadere plausibilmente ...)

Sembra che Cabal abbia una logica caso-caso per gestire questo, tale che os(windows) dovrebbe funzionare sempre. Mi sembra che convincendo Cabal a fare il lavoro, se Wild Things succederà in futuro, sarà compito di Cabal risolverlo, non il mio.

+2

'mingw32_HOST_OS' è anche definito su Windows a 64 bit. Vedi la mia risposta aggiornata. –

Problemi correlati