Il n'y a pas de méthode simple, mais c'est possible.
En supposant que vous utilisez Distribution.Simple, vous devez essentiellement ajouter un hook utilisateur à l'étape de construction.
Toutes les modifications suivantes doivent apparaître dans le fichier Setup.hs :
Changez main pour utiliser un crochet de construction, quelque chose comme :
main :: IO ()
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook }
Ensuite, vous avez besoin d'un crochet de construction. Il ressemblera probablement à quelque chose comme ce qui suit :
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
Le code ci-dessus doit probablement être décomposé un peu. Les clauses let servent essentiellement à décompresser les champs de données requis des structures passées au crochet de construction. Notez que vous pouvez créer des stances personnalisées dans votre foo.cabal. J'ai fourni le code pour supporter une strophe comme celle-ci :
x-cc-name: icc
Comme moyen de spécifier votre compilateur. Après avoir extrait tous les fichiers sources, vous les mappez en utilisant une fonction pour compiler un seul fichier (NB : ceci est sous-optimal dans certains cas, par exemple pour les compilateurs qui peuvent compiler efficacement plusieurs fichiers sources pour produire une sortie objet unique et bénéficier d'optimisations à grande échelle, mais nous laisserons cela de côté pour le moment).
Enfin, comme nous avons maintenant compilé le code C/C++, supprimez-le des structures de construction avant de tout transmettre au crochet de construction par défaut.
Désolé, il s'agit plus d'un "HOWTO" que d'une réponse toute faite, mais cela devrait vous aider à démarrer.
Je dois mentionner que le code n'a pas été testé. Je l'ai adapté à partir d'un travail que j'ai effectué sur le système de construction wxHaskell, donc je sais que l'idée fonctionne bien. L'API de Cabal est en fait assez bien documentée - elle souffre principalement d'être quelque peu instable dans certains de ces domaines.