2010-03-27 16 views
11

Decidí agregar algunos indicadores para controlar la forma en que se compila el archivo fuente C (es decir, algo así como use-clang, use-intel, etc.).Selección del compilador C en el paquete cabal

 
     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

Pregunta: ¿qué opciones en el archivo descritpion deben modificarse para cambiar el compilador de C? Encontré solo CC-Options.

Respuesta

1

Realmente no parece haber ninguna manera de especificar esto en un archivo .cabal; lo único que parece tener en este momento que sería remotamente útil aquí es --with-<prog>=path.

Le sugiero que intente archivar un boleto contra Cabal en el trac.

+1

Es cierto. Hay un [issue # 1325 en github] (https://github.com/haskell/cabal/issues/1325) :) – ony

0

4.10.1. Replacing the program for one or more phases

-pgmc cmd
              Uso cmd como el compilador C.

Esto funciona para ghc --make, pero no estoy seguro de cómo Cabal puede aplicar esto a la compilación de archivos C.

+0

Probado - nada ha cambiado. Al especificar "-fvia-C" se obtienen errores esperados durante la compilación de archivos Haskell, por lo que esta opción no se filtra. Parece que Cabal está usando su propia secuencia para construir archivos ".c". – ony

7

No hay una manera directa, pero es posible.

Suponiendo que está utilizando Distribution.Simple, básicamente necesita agregar un gancho de usuario a la etapa de compilación.

Todos los siguientes cambios deben aparecer en Setup.hs:

principal cambio de usar un gancho de construcción, algo así como:

main :: IO() 
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook } 

A continuación, tiene un gancho de construcción. Es probable que se parezca a lo siguiente:

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 

El código anterior probablemente necesite descomprimir un poco. Las cláusulas de let consisten básicamente en desempaquetar los campos de datos requeridos de las estructuras pasadas al gancho de compilación. Tenga en cuenta que puede crear stanzas personalizadas en su foo.cabal. He proporcionado el código para admitir una estrofa algo así como:

x-cc-name: icc 

Como medio para especificar su compilador. Después de haber extraído todos los archivos fuente, puede mapearlos usando una función para compilar un solo archivo (NB: esto es subóptimo en algunos casos, p. Ej. Los compiladores que pueden compilar múltiples archivos fuente para producir un solo objeto de salida y beneficio de optimizaciones a gran escala, pero lo dejaremos de lado por ahora).

Por último, como hemos compilado ahora el código C/C++, elimínelo de las estructuras de compilación antes de pasar todo al enganche de compilación predeterminado.

Disculpe que se trata más de un 'HOWTO' que de una respuesta enlatada, pero debería ayudarlo a ponerse en marcha.

Debo mencionar que el código no ha sido probado. Lo he adaptado de un trabajo que he estado haciendo en el sistema de construcción wxHaskell, así que sé que la idea funciona bien.La API Cabal está bastante bien documentada, principalmente sufre de inestabilidad en algunas de estas áreas.

Cuestiones relacionadas