2009-11-09 7 views
43

Ich möchte mein Programm mit einer Profilierung kompilieren, so dass ich laufen:Cabal installiert keine Abhängigkeiten, wenn Profilbibliotheken benötigt werden?

$ cabal configure --enable-executable-profiling 
... 
$ cabal build 
... 
    Could not find module 'Graphics.UI.GLUT': 
     Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'? 
... 
$ # indeed I have not installed the prof libs for GLUT, so.. 
$ cabal install -p GLUT --reinstall 
... 
    Could not find module 'Graphics.Rendering.OpenGL': 
     Perhaps you havent installed the profiling libraries for package 'OpenGL-2.4.0.1'? 
... 

Also, das Problem ist, dass im Gegensatz zu begrüßen Verhalten üblich der Kabalen, Kabale nicht die Abhängigkeiten auflösen und sie installieren, wenn Profilierungs Bibliotheken benötigen.

Ich kann es umgehen, indem Sie die Abhängigkeiten manuell lösen (durch Fehler folgen, die nach einer gewissen Zeit der Erstellung angezeigt):

$ cabal install -p OpenGLRaw --reinstall 
$ cabal install -p StateVar --reinstall 
$ cabal install -p Tensor --reinstall 
$ cabal install -p ObjectName --reinstall 
$ cabal install -p GLURaw --reinstall 
$ cabal install -p OpenGL --reinstall 
$ cabal install -p GLUT --reinstall 

und wiederholen Sie dann für meine nächste Abhängigkeit ..

Gibt es eine bessere Möglichkeit, dies zu tun? Machen cabal die Arbeit alleine wie für normale Bibliotheken?

+9

Ich habe 'aktiviert Bibliothek-Profilin g: Wahr in meiner '~/.cabal/config' Datei. Ab dann wird bei jeder neuen Installation automatisch das Profiling aktiviert. Leider bedeutet das immer noch, dass ich für die alten bereits installierten Pakete manuell neu installieren musste. Obwohl ich nach einiger Zeit manuell die meisten Pakete neu installiert habe, wurde die Profilierung aktiviert ... –

+0

@Tom Lokhorst: Danke. Auch das scheint die beste/einzige Antwort zu sein. Also, wenn du willst, kannst du es als Antwort aufschreiben, damit ich es akzeptieren kann. – yairchu

+0

Nun, es ist unhöflich, nein zu sagen, um upvotes zu befreien :-) Allerdings hoffe ich, dass jemand mit einer besseren Antwort kommt, eine, die das nicht würde fordere, dass ich die komplette Haskell Platform beim nächsten Mal manuell neu installiere. –

Antwort

45

Ich habe library-profiling: True in meiner ~/.cabal/config Datei aktiviert. Ab dann wird bei jeder neuen Installation automatisch das Profiling aktiviert.

Leider bedeutet das immer noch, dass ich für die alten bereits installierten Pakete manuell neu installieren musste. Obwohl nach einer Weile dies manuell zu tun, ich jetzt haben die meisten Pakete mit einer Profilierung neu installiert aktiviert ...

+7

Ich stelle mir das für viele Menschen eine vertraute Routine vor. Wenn nur ein Befehl vorhanden wäre, um diese ansonsten mühsame Aufgabe zu automatisieren, z. 'cabal reinstall-all --mit-library-profiling-enabled'. –

+0

Muss ich wirklich alle Bibliotheken neu kompilieren, nur um meine Anwendung zu profilieren? Gibt es keine Möglichkeit, schneller zwischen der vollständig optimierten Version (ohne Profiling-Code) und dem Profiling zu wechseln? –

+3

Nach wochenlangen frustrierenden Neuinstallationen schlage ich vor, dass Sie nach dem oben genannten Update für Ihre '~/.cabal/config' alles komplett deinstallieren. Es gibt ein paar Möglichkeiten, dies zu tun. Eine davon ist 'rm -rf ~/.ghc' – RussellStewart

30

Aus einem Kommentar von Tom Lokhorst:

Ich hoffe, dass jemand mit einer besseren Antwort kommen wird, eine, die mich nicht die nächste Haskell-Plattform manuell neu installieren würde.

Für zukünftige Besucher:

Die Aufgabe Profilierungs Versionen aller installierten Bibliotheken installiert wird, hat weniger mühsam geworden, cabal (cabal-install) hält nun verfolgen, was installiert wurde es in der world Datei im .cabal Verzeichnis mit (auf Linux, das wäre $HOME/.cabal, unter Windows so etwas wie C:\Users\%YOU%\AppData\Roaming\cabal\, auf OSX ??).

So Profilierung in config Datei nach der Aktivierung (im gleichen Verzeichnis) und Clearing-Paket-Datenbank des GHC (Sie die Standorte des globalen und Benutzer db pro ghc-pkg list nonexisting finden, die Kabalen-installierten Pakete aus der globalen Datenbank entfernen mit ghc-pkg unregister packagename wenn Sie welche haben, umbenennen oder das gesamte Anwender db löschen - dies ist notwendig, da die world Datei nur explizit installierten Pakete verfolgt, nicht ihre Abhängigkeiten), mit allem, was die Installation Unterstützung Profilierung sollte wie folgt funktionieren:

$ cabal install --reinstall world --dry-run 

Erste run mit --dry-run auf Probleme vor der tatsächlichen Neuinstallation zu überprüfen ling alles. Wenn es Boot-Pakete wie process oder directory neu installieren würde, ist das ein schlechtes Zeichen, wenn Sie nicht wissen, wie man damit umgeht, fragen Sie nach dem IRC-Kanal #haskell, einer der Mailing-Listen oder hier zur Orientierung. Wenn es aufgrund neuer Versionen auf hackage einiger Pakete, die miteinander inkompatibel sind, keinen konsistenten Installationsplan findet, kann dies normalerweise durch Bearbeiten der Datei world und Einschränken der zulässigen Versionen einiger Pakete gelöst werden.

Dann, wenn Sie optimistisch sind, dass nichts schlecht brechen,

$ cabal install --reinstall world 

und haben eine schöne Kanne Tee während GHC beschäftigt Compilierung ist.

+0

wird das Profiling tatsächlich aktiviert, wenn es in Config auf' True' gesetzt ist? Wenn ich ein --reinstall von vorhandenen Paketen tue, scheint es das -p Markierungsflag – jberryman

+2

zu erfordern, das ich gerade versucht habe, 'cabal install --installer world' hat mit aktivierter Profilierung neu installiert. Ist die Zeile 'library-profiling: True' in der Konfigurationsdatei auskommentiert? –

+6

heh, danke. Ich habe das "-" als Befehlszeilenflag nicht kommentiert. OOOPS! – jberryman

13

Daniel Fischers Antwort sieht gut aus, aber aus irgendeinem Grund enthielt meine ~/.cabal/world-Bibliothek nur Einträge für direkt installierte Bibliotheken und nicht deren Abhängigkeiten.

Stattdessen habe ich abgeladen eine Liste aller installierten Bibliotheken

$ ghc-pkg list > list 

Dies listet die systemweit installierten Bibliotheken und vor Ort. Daher habe ich die Datei list bearbeitet, um den ersten Teil zu entfernen (der systemweit installierte Bibliotheken enthält), wobei nur die Zeilen nach /home/<user>/.ghc/... belassen werden. Schließlich lief ich

$ cabal install --reinstall $(cat list) 

Das funktionierte für mich. Sie sollten zuerst --dry-run tun. Dann mach eine Kanne Tee. Oder einen Kuchen backen.

+1

Laut Daniels Antwort oben sollte die World-Datei nur direkt installierte Pakete enthalten. Ich denke, die Idee ist, dass Kabale die Abhängigkeiten für dich auflösen wird, und sie können sich im Laufe der Zeit ändern. – ntc2

+0

Es gibt einige zusätzliche hilfreiche Kommentare hier: https://github.com/haskell/cabal/issues/275 – Tad

0

Für Besucher 2016+: Einfach installieren ghc-prof

Debian Linux-Systeme:

sudo apt-get install ghc-prof

Arch Linux-Systeme:

sudo pacman -S ghc-prof

Verwandte Themen