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.
Es cierto. Hay un [issue # 1325 en github] (https://github.com/haskell/cabal/issues/1325) :) – ony