有沒有簡單的方法,但它是可能的。
假設您使用的是Distribution.Simple,您基本上需要將一個用戶掛鉤添加到構建階段。
以下更改都需要出現在Setup.hs:
變化主要使用構建掛鉤,是這樣的:
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實際上有很好的文檔記錄 - 主要受這些區域的某些不穩定性影響。
是的。有一個[github上的#1325問題](https://github.com/haskell/cabal/issues/1325):) – ony 2015-01-09 12:00:43