Frage Wie Sie eine Abhängigkeit C-Bibliothek in Haskell Stack einschließen


Ich möchte ein Haskell Stack-Paket erstellen, das ein weiteres Haskell-Stack-Paket enthält extra-dep. Die problematische Sache ist, dass das Paket, das ich einbinden möchte, eine Bindung zu irgendeinem C-Code ist, der Haskells FFI verwendet.

Wenn ich nur stack unpack  und stack build dieses Paket (HasCacBDD) es funktioniert gut, aber wenn ich es als einschließe extra-dep Stack beschwert sich über eine fehlende Bibliothek.

Mit Blick auf die Setup.hs von diesem ursprünglichen Paket sehe ich, dass es im Grunde erstellt eine statische Bibliothek namens libHasCacBDD.a und legt es in den richtigen Ordner in der .stack-work Pfad für die Verknüpfung. Diese Bibliothek ist genau diejenige, die mir einen Fehler gibt, wenn ich sie in mein eigenes Projekt einfüge.

Sorgfältig auf die .stack-work Ordner meines eigenen Projekts, sehe ich das erwähnt libHasCacBDD.a ist in der Tat in dem Verzeichnis irgendwo versteckt. Glücklicherweise wird die Bibliothek korrekt erstellt, aber mein Projekt kann sie nicht finden.

Das offizielle Haskell-Stapel Dokumentation sagt etwas darüber aus, was in diesem Fall zu tun ist, aber ich denke, es ist nicht spezifisch genug, um mir eine befriedigende Antwort zu geben.

Was ich tun muss, ist den Pfad anzugeben, wo der libHasCacBDD.a Bibliothek wird als gespeichert extra-lib-dirs Möglichkeit. Trotzdem mache ich das nicht plattformunabhängig (wenn ich den Pfad in meinem Computer fest codiere, wird es einfach darin funktionieren und was ist der Sinn, ein Paket in diesem Fall zu machen).

Ich habe ein Ausgabe auf Github mit mehr Informationen über die Einzelheiten.

Irgendwelche Vorschläge?


5
2017-07-11 00:39


Ursprung


Antworten:


Ich habe dies in der Vergangenheit mit einem Makefile behandelt, das das lokale Verzeichnis findet und meine üblichen Stapelbefehle mit Argumenten umschließt, um es zu benutzen.

LIB_DIR :=$(shell dirname $(shell find $(shell stack path --local-install-root) -name libHasCacBDD.a))
ARGS = --extra-lib-dirs ${LIB_DIR}

test:
    stack ${ARGS} test --fast -j4

Hässlich, aber es funktioniert.

ETA: Die erste Zeile ruft die Shell dreimal auf:

  • stack path um herauszufinden, wo Pakete installiert werden
  • find um die gewünschte Datei zu finden
  • dirname um das Verzeichnis zu bekommen

Die übrigen Zeilen übergeben dieses Verzeichnis an stack als zusätzliches Bibliotheksverzeichnis. Mach das jedes Mal make heißt, vermeidet, den Pfad in eine Datei zu stellen, wo er aktualisiert werden muss, wenn sich der Compiler oder die Paketversion ändert.


0
2017-07-11 18:45