"Bootstrapping" mit Cabal

8

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:

  1. Wie kann ich das ganze oben in Kabal machen? Soll ich das nur mit Haken machen? (wie zB dies oder dies .) Was ist, wenn der Hook von einem anderen Programm in dem zu erstellenden Paket abhängig sein muss?
  2. Was ist, wenn Setup.hs so kompliziert wird, dass es selbst benötigt wird? Abhängigkeitsverwaltung?
  3. Gibt es ein Cabalized-Paket, das ähnliche Dinge macht? Wenn Happy ein verfälschtes Testprogramm enthielt, das von einer Happy-Invokation abhing, wäre das ein perfektes Beispiel gewesen.
mnish 16.02.2012, 16:53
quelle

1 Antwort

5

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:

  1. 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:

    %Vor%
  2. 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:

    %Vor%

    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.

  3. 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.

    
dflemstr 16.02.2012, 17:59
quelle

Tags und Links