一部の C++ ソースに対して、FFI を使用して Haskell 実行可能ファイルをビルドしようとしています。
次のような C ヘッダー (cstuff/foo.h) があります。
#ifndef _FOO_H_
#define _FOO_H_
#include <somecppheader.c> // Some header outside of my control with C++ constructs
void foo();
#endif
foo の実装は重要ではありません。何かを実行し、途中で somecppheader.h で宣言されたものを使用します。
Cabal ファイルの実行可能セクションは次のようになります。
executable botprog
main-is: Main.hsc
other-extensions: ForeignFunctionInterface
build-depends: base >=4.7 && <4.8
build-tools: hsc2hs
default-language: Haskell2010
include-dirs: cstuff
c-sources: cstuff/foo.cpp
pkgconfig-depends: somelib -- The one that contains somecppheader.h
Main.hsc は次のようになります。
{-# LANGUAGE ForeignFunctionInterface #-}
#include <foo.h>
foreign import ccall "foo.h foo" :: IO ()
main = foo >> putStrLn "Called foo."
この例では hsc2hs は実際には必要ありません。説明しようとしているエラーをトリガーするために使用されているだけです。
問題は、somecppheader.h が C++ 固有の構造を持つ C++ ヘッダーであり、foo.h のインクルードが C ヘッダーとしてコンパイルされているように見えることです。これは、クラス定義などの C++ 構造のために失敗します。
foo.h を gcc ではなく g++ でコンパイルする必要があることを hsc2hs または Cabal に伝えるにはどうすればよいですか?