2012-12-10 12 views
19

Có một vài thư viện nền tảng cụ thể trong Hackage mà tôi muốn sử dụng (ví dụ: inotify, kqueue). Tuy nhiên, tài liệu về cách chuyển đổi giữa các nền tảng bằng cách sử dụng trình biên dịch có điều kiện có vẻ hơi thưa thớt. Tôi gặp sự cố khi tìm tài liệu liên quan ...Cách viết mã độc lập nền tảng trong Haskell (ghc)

  1. Tôi có thể sử dụng định nghĩa tiền xử lý nào để chuyển đổi giữa các nền tảng?

  2. Làm cách nào để thiết lập tệp cabal để bao gồm/loại trừ inotify/kqueue trên linux/osx tương ứng?

Tôi hy vọng rằng tài liệu ở đây cũng có thể hữu ích cho người khác, vì vậy có thể đáng nói đến các nền tảng phổ biến khác. Thật ngớ ngẩn khi tìm kiếm thứ này khắp nơi.

Trả lời

12
  1. Hãy nhìn vào các os_HOST_OS cờ trong sự kết hợp với các tùy chọn C Preprocessor -cpp (hoặc sử dụng {-# LANGUAGE CPP #-}) như đã nêu trong GHC documentation

  2. Thêm extensions: CPP để mô tả gói của bạn như trong Cabal documentation và xác định một lá cờ tùy chỉnh như thế này:

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

Sau đó, bạn có thể sử dụng #ifdef trong nguồn của mình.

+7

Được ưu tiên sử dụng os_HOST_OS để bao gồm các gói khác nhau, thay vì sử dụng CPP, nếu có thể. –

+4

Bạn cũng có thể sử dụng các khối 'os' của cabal để chọn giữa toàn bộ cây nguồn nếu có toàn bộ mô-đun cần phải được viết khác nhau cho các hệ điều hành khác nhau. Thay vì đặt một khối 'cpp-options' bên trong, nhưng một khối' hs-source-dirs' bên trong. –

+0

Cảm ơn bạn, câu trả lời hay –