我决定添加一些标志来控制C源文件的编译方式(比如use-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
问题是:descritpion文件中哪些选项需要修改才能更改C编译器?我确实找到了CC-Options。
答案 0 :(得分:8)
没有直截了当的方式,但有可能。
假设您正在使用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实际上已经很好地记录了 - 它主要是因为在这些区域中有些不稳定。
答案 1 :(得分:1)
在.cabal文件中似乎没有任何方法可以指定它;我们现在似乎唯一具有远程用途的东西是--with-<prog>=path
。
我建议您尝试在trac上填写针对Cabal的票。
答案 2 :(得分:0)
4.10.1. Replacing the program for one or more phases
-pgmc cmd
使用cmd
作为C编译器。
这适用于ghc --make
,但我不知道如何让Cabal将其应用于C文件编译。