13 votes

Sélection du compilateur C dans le paquet cabal

J'ai décidé d'ajouter quelques drapeaux pour contrôler la façon dont le fichier source C est compilé (c'est-à-dire quelque chose comme use-clang, use-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 de description doivent être modifiées pour changer le compilateur C ? Je n'ai trouvé que des CC-Options.

9voto

Jeremy O'Donoghue Points 696

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.

1voto

SamB Points 3218

Il ne semble pas y avoir de moyen de spécifier cela dans un fichier .cabal ; la seule chose que nous ayons pour le moment et qui pourrait être utile, même de loin, est la suivante --with-<prog>=path .

Je vous suggère d'essayer de déposer un ticket contre Cabal sur le trac .

0voto

ephemient Points 87003

4.10.1. Remplacement du programme pour une ou plusieurs phases

-pgmc _cmd_
        Utilisez _cmd_ comme le compilateur C.

Cela fonctionne pour ghc --make mais je ne suis pas sûr de savoir comment faire pour que Cabal applique cela à la compilation du fichier C.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X