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.

Était-ce utile?

La solution

Il ne semble vraiment pas être un moyen de spécifier dans un fichier .cabal; la seule chose que nous semblons avoir au moment qui serait encore à distance utile ici est --with-<prog>=path.

Je vous suggère d'essayer le dépôt d'un billet contre Cabal sur le trac.

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
  Utilisez cmd 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top