2009-09-11 8 views
34

Beim Kompilieren einer Haskell-Quelldatei über ghc --make foo.hs hinterlässt GHC immer eine Reihe anderer Zwischendateien als foo.exe. Diese sind foo.hi und foo.o.Wie kann GHC keine Zwischendateien erzeugen?

Oft muss ich am Ende die .hi und .o Dateien löschen, um die Ordner nicht zu überladen.

Gibt es eine Befehlszeilenoption für GHC, die Zwischendateien nicht zu löschen? (Bei der Frage auf #haskell war die beste Antwort, die ich bekam, ghc --make foo.hs && rm foo.hi foo.o.

Antwort

30

Ich habe die GHC-Dokumentation ein wenig durchgelaufen, und es scheint keine integrierte Möglichkeit zu sein, die temporären Dateien automatisch zu entfernen - - Schließlich benötigt GHC diese Zwischendateien, um die endgültige ausführbare Datei zu erstellen, und ihre Anwesenheit beschleunigt die gesamte Kompilierung, wenn GHC weiß, dass es ein Modul nicht neu kompilieren muss

Sie könnten jedoch herausfinden, dass setting the -outputdir option Ihnen helfen wird Das wird alle Ihre Objektdateien (.o), Schnittstellendateien (.hi) und FFI-Stub-Dateien im angegebenen Verzeichnis platzieren.Es ist immer noch "Unordnung", aber zumindest ist es nicht mehr in Ihrem Arbeitsverzeichnis.

+0

Ich weiß, dass diese Frage alt ist, aber dieser Tipp ist sehr praktisch. Ich habe einen Alias ​​zu meinem './Zshrc' für ghc hinzugefügt, um alle Zwischendateien jedes Mal in einen Ordner zu legen, wenn ich ghc über die Kommandozeile starte – djhworld

+1

Wenn ich cabal nicht benutze, schreibe ich normalerweise ein Makefile (auch unter Windows)), setze das '-outputdir' wie erwähnt und lösche es automatisch aus dem Makefile. – MasterMastic

+1

Ich finde es auch einfacher, nur ein Shell-Skript zu schreiben. Da ich nur ein Programm testen wollte, schrieb ich einfach eine 'run.sh' mit' ghc program.hs -outputdir dist && ./program && rm programm && rm -rf dist/' – lucasarruda

15

Mein üblicher Workflow besteht darin, cabal statt ghc direkt zu verwenden. Dies setzt die outputdir-Option in einen geeigneten Build-Ordner und kann Dinge wie Scheddock-Dokumentation für Sie erstellen. Alles, was Sie brauchen, ist, die .cabal-Datei für Ihr Projekt zu definieren und dann cabal install oder cabal build zu sagen, anstatt ghc direkt auszuführen. Da Sie diesen Prozess am Ende befolgen müssen, wenn Sie Ihre Arbeit mit Hacker teilen möchten, ist es eine gute Übung, sich damit vertraut zu machen und Paketabhängigkeiten zu verwalten.

+1

Das mache ich auch. Für jedes Haskell-Codeelement, das größer ist als eine einzelne Datei, habe ich eine .cabal-Datei eingerichtet. Das heißt, ich kopiere einfach eine vorhandene .cabal-Datei von irgendwo und modifiziere sie. Ich denke, jemand arbeitet an einem "cabal --init" -Befehl, um einen Standardarbeitsraum einzurichten, was sehr nützlich wäre. –

+0

Ich bin ziemlich neu in Haskell, aber das ist etwas, das ich an Kabalen wirklich mag. cabal erstellt ein Verzeichnis (dist) und legt beim Erstellen alle Ausgabedateien in diesem Verzeichnis ab. Es hält andere Verzeichnisse sauber. – davidbe

6

Sie können den -hidir auf/dev/null setzen, denke ich und schicke sie dorthin. Außerdem schaltet die Option -fno-code im Allgemeinen viel Ausgabe aus. Du möchtest vielleicht nur Cabal benutzen.