题
我决定添加一些标志来控制C源文件的编译方式(例如用clang,use-intel等)。
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
问题是:需要修改描述文件中的哪些选项以更改C编译器?我确实发现了CC选项。
解决方案
似乎没有任何方法可以在.cabal文件中指定这一点。目前,我们唯一在这里唯一有用的是 --with-<prog>=path
.
我建议您尝试在 trac.
其他提示
没有直接的方式,但这是可能的。
假设您正在使用Distribution。简单,您基本上需要在构建阶段添加用户钩。
以下所有更改都需要出现在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
作为指定编译器的手段。提取了所有源文件后,您可以使用函数编译单个文件对它们进行映射(NB:在某些情况下这是最佳的,例如那些可以有效地编译多个源文件以产生单个对象输出并受益的编译器从大规模的优化开始,但我们现在将其抛在一边)。
最后,正如我们现在已经编译了C/C ++代码的那样,请在将所有内容传递到默认的构建挂钩之前将其从构建结构中删除。
抱歉,这比罐头答案更像是“ howto”,但它应该帮助您开始。
我应该提到该代码未经测试。我已经根据我在WXHASKELL构建系统上所做的一些工作进行了调整,因此我知道这个想法很好。 Cabal API实际上已经有足够的文献记载 - 它主要遭受了其中一些区域的不稳定。
-pgmc CMD
利用CMD
作为C编译器。
这适用于 ghc --make
, ,但我不确定如何使Cabal将其应用于C文件汇编。