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.
Wahr. Es gibt eine [Ausgaben # 1325 auf GitHub] (https://github.com/haskell/cabal/issues/1325) :) – ony