Haskell cabal包中的C编译器选择

Haskell cabal包中的C编译器选择,haskell,cabal,Haskell,Cabal,我决定添加一些标志来控制C源文件的编译方式(例如,像UseClang、UseIntel等) C-来源:C_lib/tiger.C 包含目录:c_lib 安装包括:tiger.h 如果标志(调试) GHC选项:-调试-墙-fno警告孤儿 CPP选项:-DDEBUG 抄送选项:-DDEBUG-g 其他的 GHC选项:-墙-fno警告孤儿 问题是:为了更改C编译器,需要修改描述文件中的哪些选项?我只找到了CC选项 -pgmc cmd 使用cmd作为C编译器 这适用于ghc--make,但我不确定如何

我决定添加一些标志来控制C源文件的编译方式(例如,像UseClang、UseIntel等)

C-来源:C_lib/tiger.C 包含目录:c_lib 安装包括:tiger.h 如果标志(调试) GHC选项:-调试-墙-fno警告孤儿 CPP选项:-DDEBUG 抄送选项:-DDEBUG-g 其他的 GHC选项:-墙-fno警告孤儿 问题是:为了更改C编译器,需要修改描述文件中的哪些选项?我只找到了CC选项

-pgmc cmd

使用
cmd
作为C编译器


这适用于ghc--make,但我不确定如何让Cabal将其应用于C文件编译。

在.Cabal文件中似乎真的没有任何方法指定这一点;目前,我们所拥有的唯一有用的东西是
——with-=path


我建议你试着在街上开一张反对阴谋集团的罚单。

没有直截了当的办法,但这是可能的

假设您使用的是Distribution.Simple,您基本上需要在构建阶段添加一个用户钩子

以下所有更改都需要显示在Setup.hs中:

将main更改为使用构建挂钩,类似于:

main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }
x-cc-name: icc
接下来,您需要一个构建挂钩。它可能看起来如下所示:

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
作为指定编译器的一种方法。提取了所有源文件后,您可以使用一个函数映射它们以编译单个文件(注意:在某些情况下,这是次优的,例如,那些可以高效编译多个源文件以生成单个对象输出并从大规模优化中获益的编译器,但我们暂时不谈)

最后,正如我们现在编译的C/C++代码一样,在将所有内容传递到默认构建挂钩之前,请将其从构建结构中删除

很抱歉,这更多的是一个“如何”而不是一个固定的答案,但它应该可以帮助你开始


我应该提到的是,该代码未经测试。我在wxHaskell构建系统上做了一些工作,因此我知道这个想法很有效。阴谋集团的API实际上有很好的文档记录,主要是因为其中一些地区的情况有些不稳定。

trusted-没有任何变化。指定“-fvia-C”会在Haskell文件编译期间出现预期错误,因此不会筛选此选项。看起来阴谋集团正在使用自己的序列来构建“.c”-files.True。有一个例子:)
x-cc-name: icc