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.

Foi útil?

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
Usar cmd 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top