2014-04-20 19 views
6

Tôi hiện đang viết một gói Haskell. Tôi muốn nó hoạt động khác nhau trên Windows và Unix. Cách "chính xác" nhất để phát hiện mã hệ điều hành của tôi đang được biên dịch là gì?Haskell: Phát hiện hệ điều hành hiện tại

Tôi đã thử sử dụng CPP và #ifdef _WIN32, nhưng điều đó dường như không hoạt động.

Có macro khác không? Tôi có thể nhờ Cabal nói cho tôi biết không? Tôi có cần thử cái gì khác hoàn toàn không?

+1

'#ifdef mingw32_HOST_OS'. –

Trả lời

13

Trích dẫn các GHC manual:

Các biểu tượng được xác định bởi GHC được liệt kê dưới đây.

[...]

os_HOST_OS=1 - Đây xác định cho phép biên soạn có điều kiện dựa trên hệ điều hành, nơi os là tên của hệ điều hành hiện tại (. Ví dụ linux, mingw32 cho Windows, solaris, vv) .

Vì vậy, để phát hiện xem mã của bạn đang được biên soạn trên Windows bạn nên sử dụng

#ifdef mingw32_HOST_OS 

Rõ ràng, bạn cần phải có CPP kích hoạt cho rằng để làm việc.

Đối với những người đang tự hỏi - mingw32_HOST_OS cũng được định nghĩa trên Windows 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 

gây nhầm lẫn, mingw64_HOST_OS không phải là - sử dụng để phát hiện x86_64_HOST_ARCH Windows 64-bit đặc biệt.

+0

Tôi thích điều này vì nó cho phép tôi chọn phải làm gì, nhưng không có chi phí thời gian chạy. Đó là một chút buồn đó là cụ thể cho MinGW mặc dù ... – MathematicalOrchid

+1

Bạn có ý nghĩa gì bởi "cụ thể cho MinGW"? Theo hướng dẫn sử dụng, bạn cũng có thể sử dụng 'linux_HOST_OS',' solaris_HOST_OS', v.v. –

19

Bạn có thể sử dụng System.Info:

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

Tôi thích điều này vì nó chỉ đơn giản là mã Haskell bình thường nhìn vào một hằng số bình thường. Tốt đẹp! – MathematicalOrchid

+0

Tuyệt vời! Tôi luôn ủng hộ các giải pháp không liên quan đến việc sử dụng trực tiếp 'CPP';) –

4

Đây là tất cả các câu trả lời hay. Cho đầy đủ, có vẻ như Cabal cũng có một cái móc cho việc này:

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

Đặc biệt, nó hơi buồn rằng "Windows" được xác định là "mingw32". Tôi ghét nghĩ điều gì sẽ xảy ra nếu tôi đến và cài đặt GHC 64 bit! (Liệu đó có phải là "mingw64"?) Và nếu một ngày nào đó GHC được xây dựng với một số trình biên dịch khác? Hay, chúng ta dám mơ, có tồn tại các trình biên dịch Haskell không phải là GHC? (OK, điều đó nghe khá rõ ràng ngay bây giờ, nhưng nó có thể xảy ra một cách đáng kinh ngạc ...)

Có vẻ như Cabal có logic đặc biệt để xử lý vấn đề này, như vậy os(windows) có nghĩa vụ phải làm việc mọi lúc. Dường như với tôi rằng bằng cách bắt Cabal làm công việc, nếu những điều hoang dã xảy ra trong tương lai, đó sẽ là công việc của Cabal để phân loại điều đó, không phải của tôi.

+2

'mingw32_HOST_OS' cũng được xác định trên Windows 64 bit. Xem câu trả lời cập nhật của tôi. –

Các vấn đề liên quan