Stellen Sie sich ein Makefile wie das folgende vor:
%Vor%Das aktuelle Verzeichnis enthält zuerst Makefile und Stage0.hs und erzeugt stage1.
Hier sind die Fragen:
Cabal ist schwierig, wenn es um solche Situationen geht.
Wie Sie gesagt haben, wenn Sie alles in Setup.hs
komprimieren können, behalten Sie die Anzahl der Kopfschmerzen, die Sie auf ein Minimum reduzieren werden.
Wenn Sie wirklich komplizierte Präprozessoren haben, würde ich Folgendes vorschlagen:
Erstelle ein Cabal-Paket für jeden Präprozessor mit seinen eigenen Abhängigkeiten usw. Also, für stage0
hättest du eine Cabal-Datei wie folgt:
Für stage1
müssen Sie den Quellcode generieren. Fügen Sie also einen preBuild
Hook in Ihrem Setup.hs
für mypackage-stage1
hinzu, der das ausführbare Programm mpk-stage0
ausführt:
Sie würden dann eine Build-Tool-Abhängigkeit von der vorherigen Stufe hinzufügen:
%Vor% Dies sollte in den letzten Cabal-Versionen funktionieren; Andernfalls müssen Sie möglicherweise stattdessen eine Abhängigkeit Build-depends:
hinzufügen.
Sie müssen jedes Paket abwechselnd jedes Mal neu erstellen, wenn Sie eine kaskadierende Änderung durchführen (Dies ist notwendig, da cabal projektübergreifende Abhängigkeitsänderungen nicht verwaltet). Sie benötigen also a Skript, das for project in mypackage-stage0 mypackage-stage1; do (cd $project; cabal install); done
oder etwas ähnliches tut.
Cabal wurde nie für diese Art von Projekt gebaut, also wird schwierig sein, wenn Sie so etwas tun wollen. Sie sollten stattdessen mit Template Haskell arbeiten, wenn Sie Code kohärenter generieren möchten.