C Seleção do compilador no pacote de cabala
Pergunta
Decidi adicionar alguns sinalizadores para controlar a maneira como o arquivo de origem C é compilado (ou seja, algo como clang de uso, utilidade etc.).
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
A pergunta é: quais opções no arquivo de descritos precisam ser modificadas para alterar o compilador C? Eu encontrei apenas as opções de CC.
Solução
Realmente não parece haver nenhuma maneira de especificar isso em um arquivo .cabal; A única coisa que parecemos ter no momento que seria até remotamente útil aqui é --with-<prog>=path
.
Eu sugiro que você tente registrar uma passagem contra Cabal no Trac.
Outras dicas
Não existe uma maneira direta, mas é possível.
Supondo que você esteja usando a distribuição.
Todas as seguintes mudanças precisam aparecer no setup.hs:
Mudar Main para usar um gancho de construção, algo como:
main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }
Em seguida, você precisa de um gancho de construção. Provavelmente se parecerá com o seguinte:
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
O código acima provavelmente precisa de descompactar um pouco. As cláusulas LET são basicamente sobre descompactar os campos de dados necessários das estruturas passadas para o gancho de construção. Observe que você pode criar estrofias personalizadas em seu foo.cabal. Eu forneci o código para apoiar uma estrofe algo como:
x-cc-name: icc
Como um meio de especificar seu compilador. Depois de extrair todos os arquivos de origem, você mapeia sobre eles usando uma função para compilar um único arquivo (NB: isso é subótimo em alguns casos, por exemplo, os compiladores que podem compilar vários arquivos de origem para produzir uma única saída de objeto e beneficiar De otimizações em larga escala, mas deixaremos isso de lado por enquanto).
Por último, como agora compilamos o código C/C ++, remova -o das estruturas de construção antes de passar tudo para o gancho de construção padrão.
Lamento que isso seja mais um 'Howto' do que uma resposta enlatada, mas deve ajudá -lo a continuar.
Devo mencionar que o código não foi testado. Eu o adaptei de algum trabalho que tenho feito no sistema Wxhaskell Build, então sei que a ideia funciona bem. A API da Cabal é realmente muito bem documentada - ela sofre principalmente de ser um pouco instável em algumas dessas áreas.
4.10.1. Substituindo o programa por uma ou mais fases
-pgmc cmd
Usarcmd
como o compilador C.
Isso funciona para ghc --make
, mas não tenho certeza de como fazer com que a Cabal aplique isso à compilação de arquivos C.