2010-03-27 48 views
11

我決定添加一些標誌來控制C源文件的編譯方式(即use-clang,use-intel等)。cabal包中的C編譯器選擇

 
     C-Sources: c_lib/tiger.c 
     Include-Dirs: c_lib 
     Install-Includes: tiger.h 

     if flag(debug) 
      GHC-Options: -debug -Wall -fno-warn-orphans 
      CPP-Options: -DDEBUG 
      CC-Options: -DDEBUG -g 
     else 
      GHC-Options: -Wall -fno-warn-orphans

問題是:需要修改descritpion文件中的哪些選項來更改C編譯器?我確實找到了CC-Options。

回答

1

確實似乎沒有任何方法可以在.cabal文件中指定此項;我們目前似乎只有在這方面纔有用的唯一東西是--with-<prog>=path

我建議你試試在trac上反對Cabal的票。

+1

是的。有一個[github上的#1325問題](https://github.com/haskell/cabal/issues/1325):) – ony 2015-01-09 12:00:43

0

4.10.1. Replacing the program for one or more phases

-pgmc cmd
             使用cmd與C編譯器。

這適用於ghc --make,但我不確定如何讓Cabal將它應用於C文件編譯。

+0

試過 - 沒有任何改變。指定「-fvia-C」會在Haskell文件編譯過程中給出預期的錯誤,所以這個選項不會被過濾。看起來Cabal正在使用它自己的序列來構建「.c」文件。 – ony 2010-03-27 22:39:48

7

有沒有簡單的方法,但它是可能的。

假設您使用的是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實際上有很好的文檔記錄 - 主要受這些區域的某些不穩定性影響。