簡単な方法はありませんが、可能です。
Distribution.Simpleを使用していると仮定すると、基本的にビルドステージにユーザーフックを追加する必要があります。
次のすべての変更をSetup.hsに表示する必要があります。
mainを変更して、次のようなビルドフックを使用します。
main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }
次に、ビルドフックが必要です。次のようになります。
myBuildHook pkg_descr local_bld_info user_hooks bld_flags =
do
let lib = fromJust (library pkg_descr)
lib_bi = libBuildInfo lib
custom_bi = customFieldsBI lib_bi
cpp_name = fromJust (lookup "x-cc-name" custom_bi)
c_srcs = cSources lib_bi
cc_opts = ccOptions lib_bi
inc_dirs = includeDirs lib_bi
lib_dirs = extraLibDirs lib_bi
bld_dir = buildDir local_bld_info
-- Compile C/C++ sources
putStrLn "invoking my compile phase"
objs <- mapM (compileCxx cpp_name cc_opts inc_dirs bld_dir) c_srcs
-- Remove C/C++ source code from the hooked build (don't change libs)
let lib_bi' = lib_bi { cSources = [] }
lib' = lib { libBuildInfo = lib_bi' }
pkg_descr' = pkg_descr { library = Just lib' }
-- The following line invokes the standard build behaviour
putStrLn "Invoke default build hook"
bh <- buildHook simpleUserHooks pkg_descr' local_bld_info user_hooks bld_flags
return bh
上記のコードは、おそらく少し解凍する必要があります。let句は基本的に、ビルドフックに渡された構造から必要なデータフィールドを解凍することに関するものです。foo.cabalでカスタムスタンザを作成できることに注意してください。次のようなスタンザをサポートするコードを提供しました。
x-cc-name: icc
コンパイラを指定する手段として。すべてのソースファイルを抽出したら、関数を使用してそれらをマッピングし、単一のファイルをコンパイルします(注:これは、複数のソースファイルを効率的にコンパイルして単一のオブジェクト出力を生成できるコンパイラなど、場合によっては最適ではありません。大規模な最適化からですが、今はそれを脇に置いておきます)。
最後に、C / C ++コードをコンパイルしたので、すべてをデフォルトのビルドフックに渡す前に、ビルド構造からコードを削除します。
申し訳ありませんが、これは定型の回答というよりも「HOWTO」のようなものですが、それはあなたが始めるのに役立つはずです。
コードはテストされていません。私はwxHaskellビルドシステムで行ってきたいくつかの作業からそれを適応させたので、アイデアがうまく機能することを知っています。Cabal APIは、実際にはかなりよく文書化されています。主に、これらの領域の一部で不安定になるという問題があります。