Frage

Ich habe beschlossen, einige Flags hinzuzufügen, um die Art und Weise zu steuern, wie die C-Quelldatei zusammengestellt wird (dh so etwas wie Gebrauchsklang, Anwendungsintel usw.).

      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 der DescritPion -Datei müssen geändert werden, um den C -Compiler zu ändern? Ich habe nur CC-Optionen gefunden.

War es hilfreich?

Lösung

Es scheint wirklich keine Möglichkeit zu geben, dies in einer .cabal -Datei anzugeben. Das einzige, was wir im Moment zu haben scheinen, das hier sogar aus der Ferne nützlich wäre, ist --with-<prog>=path.

Ich schlage vor, Sie versuchen, ein Ticket gegen Cabal an der Einreichung eines Tickets einzulegen Trac.

Andere Tipps

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

Unter der Annahme, dass Sie Distribution.Simple verwenden, müssen Sie der Build -Phase im Grunde einen Benutzerhaken hinzufügen.

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

Wechseln Sie die Haupthöhle, um einen Build -Hook zu verwenden, so etwas wie:

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

Als nächstes brauchen Sie einen Build -Haken. Es wird wahrscheinlich ungefähr 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 muss wahrscheinlich ein bisschen auspacken. Bei den LET -Klauseln geht es im Grunde genommen darum, die erforderlichen Datenfelder von den Strukturen auszupacken, die an den Build -Haken übergeben wurden. Beachten Sie, dass Sie in Ihrem Foo.cabal benutzerdefinierte Strophen erstellen können. Ich habe den Code bereitgestellt, um eine Strophe zu unterstützen, so etwas wie:

x-cc-name: icc

Als Mittel, um Ihren Compiler anzugeben. Nachdem Sie alle Quelldateien extrahiert haben, zeichnen Sie diese mit einer Funktion zum Kompilieren einer einzelnen Datei ab (NB: Dies ist in einigen Fällen suboptimal, z. von großen Optimierungen, aber wir lassen das vorerst beiseite).

Entfernen Sie ihn, da wir jetzt den C/C ++ - Code kompiliert haben, aus den Build -Strukturen, bevor Sie alles an den Standard -Build -Hook weitergeben.

Tut mir leid, dass dies eher ein "Howto" als eine Antwort ist, aber es sollte Ihnen helfen, loszulegen.

Ich sollte erwähnen, dass der Code ungetestet ist. Ich habe es aus einer Arbeit angepasst, die ich im WXHaskell -Build -System gemacht habe, also weiß ich, dass die Idee gut funktioniert. Die Kabalen -API ist eigentlich ziemlich gut dokumentiert - sie leidet hauptsächlich darum, einige dieser Bereiche etwas instabil zu sein.

4.10.1. Ersetzen des Programms für eine oder mehrere Phasen

-pgmc CMD
Verwenden CMD als C -Compiler.

Das funktioniert für ghc --make, aber ich bin mir nicht sicher, wie Cabal dies dazu bringt, dies auf die C -Dateikompilierung anzuwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top