compilateur C dans le paquet sélection cabale
Question
J'ai décidé d'ajouter quelques drapeaux pour contrôler la façon dont le fichier source C est compilé (à savoir quelque chose comme l'utilisation-clang, l'utilisation de processeurs Intel, 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
La question est: quelles options dans le fichier descritpion doivent être modifiés pour changer le compilateur C? Je ne trouvais que des options CC.
Autres conseils
Il n'y a pas de manière simple, mais il est possible.
En supposant que vous utilisez Distribution.Simple, vous avez besoin essentiellement d'ajouter un crochet utilisateur à l'étape de construction.
Toutes les modifications suivantes doivent apparaître dans Setup.hs:
Changer principal d'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 regardera 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 a probablement besoin de déballer un peu. Les clauses sont essentiellement sur let déballer les champs de données requis des structures transmises au crochet de construction. Notez que vous pouvez créer strophes personnalisés dans votre foo.cabal. J'ai fourni le code pour soutenir une strophe quelque chose comme:
x-cc-name: icc
En tant que moyen de spécifier votre compilateur. Après avoir extrait tous les fichiers source, vous associez sur eux en utilisant une fonction de compiler un seul fichier (NB: c'est sous-optimale dans certains cas, par exemple, les compilateurs qui peuvent compiler efficacement les fichiers sources multiples pour produire une seule sortie d'objet et avantages de grandes optimisations à l'échelle, mais nous allons laisser cela de côté pour l'instant).
Enfin, comme nous l'avons maintenant compilé le code C / C ++, retirer des structures de construction avant de passer tout sur le crochet de construction par défaut.
Désolé que cela est plus d'un « guide pratique » qu'une réponse en conserve, mais il devrait vous aider à y aller.
Je dois mentionner que le code n'a pas été testé. Je l'ai adapté à partir des travaux que je l'ai fait sur le système de construction wxHaskell, donc je sais que l'idée fonctionne très bien. L'API Cabal est en fait assez bien documenté -. Il souffre surtout d'être quelque peu instable autour de certains de ces domaines
4.10.1. Remplacement du programme pour une ou plusieurs phases
-pgmc cmd
Utilisezcmd
comme le compilateur C.
Cela fonctionne pour ghc --make
, mais je ne suis pas sûr de savoir comment obtenir Cabal d'appliquer cela à la compilation du fichier C.