2010-03-27 5 views
11

Ich entschied mich, einige Flags hinzuzufügen, um die Art zu steuern, wie C-Quelldatei kompiliert wird (d. H. Wie use-clang, use-intel usw.).C-Compiler-Auswahl in Cabal-Paket

 
     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

Frage ist: welche Optionen in descriptpion Datei müssen geändert werden, um C Compiler zu ändern? Ich habe nur CC-Optionen gefunden.

Antwort

1

Es scheint wirklich keine Möglichkeit zu geben, dies in einer .cabal-Datei anzugeben; Das einzige, was wir im Moment zu haben scheinen, wäre, dass es auch nur entfernt nützlich wäre. --with-<prog>=path.

Ich schlage vor, Sie versuchen, ein Ticket gegen Cabal auf der trac.

+1

Wahr. Es gibt eine [Ausgaben # 1325 auf GitHub] (https://github.com/haskell/cabal/issues/1325) :) – ony

0

4.10.1. Replacing the program for one or more phases

-pgmc cmd
              Verwenden cmd als C-Compiler.

Dies funktioniert für ghc --make, aber ich bin nicht sicher, wie Cabal bekommen diese in die Zusammenstellung C-Datei anzuwenden.

+0

Versucht - nichts geändert. Wenn "-fvia-C" angegeben wird, werden während der Haskell-Dateikompilierung erwartete Fehler angezeigt, sodass diese Optionen nicht gefiltert werden. Sieht so aus, als ob Cabal eine eigene Sequenz benutzt, um ".c" -Dateien zu erstellen. – ony

7

Es gibt keinen direkten Weg, aber es ist möglich.

Angenommen, Sie verwenden Distribution.Simple, müssen Sie im Grunde einen Benutzer-Hook der Build-Phase hinzufügen.

Alle folgenden Änderungen müssen in Setup.hs erscheinen:

ändern Haupt einen Build Haken verwenden, so etwas wie:

main :: IO() 
main = defaultMainWithHooks simpleUserHooks { buildHook = myBuildHook } 

Weiter Sie einen Build Haken benötigen. Es wird wahrscheinlich so etwas wie folgt aussehen:

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 

Der obige Code wahrscheinlich ein bisschen muss auspacken. Bei den let-Klauseln geht es im Wesentlichen darum, die erforderlichen Datenfelder aus den an den Bau-Hook übergebenen Strukturen zu entpacken. Beachten Sie, dass Sie in Ihrem foo.cabal benutzerdefinierte Zeilengruppen erstellen können. Ich habe den Code zur Verfügung gestellt eine Strophe etwas wie zu unterstützen:

x-cc-name: icc 

Als Mittel Compiler angeben. Nach dem Extrahieren aller Quelldateien ordnen Sie diese mit einer Funktion zum Kompilieren einer einzelnen Datei ab (NB: Dies ist in einigen Fällen nicht optimal, z. B. solche Compiler, die mehrere Quelldateien effizient kompilieren können, um eine einzige Objektausgabe und einen Nutzen zu erzeugen von großen Optimierungen, aber wir lassen das für jetzt beiseite).

Zuletzt, da wir jetzt den C/C++ - Code kompiliert haben, entfernen Sie ihn aus den Build-Strukturen, bevor Sie alles an den Standard-Build-Hook übergeben.

Es tut uns leid, dass dies eher ein "HOWTO" als eine Antwort in Dosen ist, aber es sollte Ihnen helfen, in Gang zu kommen.

Ich sollte erwähnen, dass der Code nicht getestet ist. Ich habe es von einer Arbeit, die ich auf dem wxHaskell Build-System gemacht habe, angepasst, also weiß ich, dass die Idee gut funktioniert.Die API von Cabal ist ziemlich gut dokumentiert - sie leidet hauptsächlich daran, dass sie in einigen dieser Bereiche instabil ist.