C Compiler -Auswahl in Kabalenpaket
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.
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
VerwendenCMD
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.