make targets: dirclean, distclean, config-clean-deps etc.

ao

Aktives Mitglied
Mitglied seit
15 Aug 2005
Beiträge
2,158
Punkte für Reaktionen
2
Punkte
38
Hallo,

im Zusammenhang mit dem Freetz-FW-Bau aus dem SVN taucht immer wieder die Frage auf, was zu tun ist, wenn man noch einmal einen make Vorgang starten will, aber sichergehen muss, dass aus der vorherigen "Sitzung" (make menuconfig und/oder make) nicht noch störende Überreste übriggeblieben sind.

Nun kann man natürlich das ganze Verzeichnis löschen und völlig von vorne mit svn starten, aber das wäre doch übertrieben und ist nicht notwendig.

Da ich selbst (als Linux-Einsteiger) nicht wirklich tief in der Materie des Kompilierens drin bin (und zum tieferen Verständnis evtl. auch nie dahin kommen werde), aber trotzdem gerne (und erfolgreich) FWs bauen kann, möchte ich einmal zusammentragen, welche Varianten des Aufräumens es gibt bzw. was die einzelnen make Aufrufe bedeuten (nicht nur zum Aufräumen). Ein Blick ins Makefile hilft bei der Entwirrung sicherlich weiter, auch wenn ich es bisher noch nicht verstanden habe.

Der aktuelle Stand der Infos findet sich im Wiki unter den Help/FAQs.
Die Infos hier unten werde ich nicht mehr weiterpfelgen, da ich sonst doppelten Aufwand damit habe.
Um die Antworten im Thread besser verstehen zu können und den Zusammenhang nicht zu stören, lasse ich sie aber hier (mit dem altend Stand) setehen.

Ggf. sind einige der u.g. Parameter für Freetz nicht mehr aktuell, was ich mit meinen beschränkten Kenntnissen leider nicht verifizieren kann. Daher bitte ich um entsprechende Rückmeldungen. Danke!

Also fangen wir einmal an (ggf. nicht mehr aktuell - aktuelle Infos im Wiki/FAQs):


1. Aufräumen:
  • make clean
    ...
  • make <Paket>-clean (Quelle):
    ruft normalerweise das clean-Target des Source-Makefiles auf. Dieses wird typischerweise alle generierten Dateien (vor allem Object-Dateien, Libraries und ausführbare Programme) löschen.
    Ein nachfolgendes make wendet keine geänderten Patches an, sondern erstellt nur die o.g. Object-Dateien, Libraries und ausführbare Programme neu (compilieren).
    Z.B. räumt make mc-clean so das Paket "Midnight Commander" (mc) auf.
  • make <Paket>-dirclean (Quelle):
    löscht das gesamte Verzeichnis des Pakets. Ein nachfolgendes make wird die Quellen neu auspacken, die Patches anwenden, das Paket konfigurieren und dann compilieren.
    Nur der letzte Schritt (compilieren) wird nach make <Paket>-clean (s.o.) ausgeführt.
  • make common-clean (Quelle):
    ...
  • make common-dirclean (Quelle):
    ...
  • make common-distclean (Quelle):
    ...
  • make distclean (Quelle):
    ...
  • make config-clean-deps (Quelle):
    Wenn bei make menuconfig Pakete abgewählt wurden, sind ggfs. noch Shared Libraries ausgewählt, die nicht mehr benötigt werden (dies kann menuconfig nicht automatisch erkennen). Diese kann man dann manuell unter 'Advanced Options'→'Shared Libraries' abwählen - die benötigten lassen sich nicht deaktivieren. Alternativ kann man dies automatisch mittels make config-clean-deps erledigen lassen.
  • make kernel-dirclean (Quelle):
    löscht den aktuell entpackten Source-Tree des Kernels, um von komplett sauberen Kernel Sourcen zu kompilieren - Alternative(?):
  • make kernel-clean (Quelle):
    siehe make kernel-dirclean und analog make <Paket>-clean bzw. make <Paket>-dirclean
  • make kernel-toolchain-dirclean
    löscht den Kernel-Compiler
  • make target-toolchain-dirclean (Quelle):
    löscht den Compiler für die uClibc und die Binaries (ausführbare Programme)
2. Vorbereitungen:
  • make world (Quelle):
    Vorraussetzung ist eine Toolchain (siehe Cross-Compiler / Toolchain erstellen). Sollten jemals Probleme mit nicht vorhandenen Verzeichnissen auftauchen, so kann ein make world Abhilfe schaffen. In der Regel sollte das aber nicht nötig sein.
  • make kernel-toolchain (Quelle):
    kompiliert den Kernel und auch für das target (Fritzbox)
    Aus historischen Gründen wurde die Bezeichnung als kernel-toolchain belassen, obwohl damit wie gesagt nicht nur der Kernel gebaut wird, sondern auch Pakete (s.u.).
  • make target-toolchain (Quelle):
    kompiliert die Pakete für das target (Fritzbox)
  • make kernel-menuconfig (Quelle):
    Die Konfiguration des Kernels wird danach wieder nach ./make/linux/Config.<kernel-ref> zurückgespeichert.
  • make kernel-precompiled (Quelle):
    Damit werden der Kernel und die Kernel Module kompiliert.
  • make menuconfig (Quelle): Zum Konfigurieren von Freetz kommt das Programm conf/mconf zum Einsatz, welches dem ein oder anderen vielleicht von der Konfiguration des Linux Kernels bekannt ist. Die ncurses Variante mconf kann mit dem Kommando make menuconfig aufgerufen werden.
    Eine Hilfe zu den einzelnen Punkten kann übrigens direkt in menuconfig durch Eingabe von "?" aufgerufen werden.
 
Zuletzt bearbeitet von einem Moderator:
Die einzelnen make-Targets finden sich im "Makefile". Mit ein wenig Shell-knoffhoff (wirklich nur wenig) kann man da schon eine Menge draus ersehen.

Generelle Targets zum "aufräumen" aber sind dirclean und distclean.
 
Der Build-Prozess inklusive der Make-Targets ist in diesem Howto schon ziemlich umfangreich beschrieben, aber leider auch schon ein bisschen älter. Manche Dinge sind daher überholt und haben sich geändert, und manches ist hinzugekommen. Das sollte aber ein guter Ausgangspunkt zur Überarbeitung sein.
 
Danke, es ist natürlich sicherlich sinnvoll, sich in die Materie (make, build-Prozess etc.) einzuarbeiten. Aber wie ich bereits (vielleicht undeutlich) geschrieben habe, hat nicht jeder die Zeit, sich da reinzuwühlen - auch wenn er trotzdem FWs erstellen und einigermaßen mitreden kann (ich zähle mich mal ein bisschen dazu).
Da aber doch immer wieder Fragen aufkommen, ob man nun make mit diesem oder jenem Parameter aufrufen muss, wenn man nochmal starten will, wollte ich das halt zusammenfassen und als Wiki/HowTo/Tipp o.ä. ablegen.
Daher wäre es nett, wenn Ihr einfach kurz(!) dazuschreiben könntet, was die einzelnen Parameter tun.
Ich weiß, dass ich mir damit nicht unbedingt Freunde unter Euch mache, weil es so aussieht, als ob ich mich nicht näher damit beschäftigen will. Aber wie oben bereits geschrieben, würde eine solche kurze Zusammenfassung allen denjenigen helfen, die nicht die Zeit haben, das alles zu verstehen, aber trotzdem FWs bauen und Fehler/Bugs/Probleme melden wollen. Wie ebenfalls geschrieben, würde ich das dann auch gerne im Wiki ablegen, damit alle etwas davon haben und man nicht immer zig Threads durchsuchen muss. Ist das ok?
 
Meinetwegen ist auch das ok; in dem genannten Howto steht aber ja genau diese Info für viele Targets schon drin, so daß Du sie da entnehmen kannst.
 
Ja, die Wiki-Seiten lese ich mir eben durch. Ergebnisse poste ich erst einmal oben in meinem ersten Beitrag, bevor sie dann zusammen an eine Stelle ins Wiki kommen, dann hoffentlich aktuell. Ich weiß nämlich nicht genau, was für Freetz noch zutrifft und was ggf. schon längst überholt ist.

Was ist der Unterschied zwischen kernel-toolchain-dirclean und target-toolchain-dirclean?
 
Mit der kernel-toolchain wird der Kernel gebaut. Mit der target-toolchain die Pakete. Die Bezeichnung ist nicht ganz korrekt, weil auch die Kernel Toolchain für das target (FritzBox) kompiliert. Aber wir haben das aus "historischen" Gründen so gelassen.

Was dabei gelöscht wird ist unterschiedlich und kommt auf die ausgewählte Toolchain an. Siehe dazu unter /make/toolchain...

MfG Oliver
 
Der Build-Prozess inklusive der Make-Targets ist in diesem Howto (development/freetz_make) schon ziemlich umfangreich beschrieben.

Ich halte es für sinnvoll, wenn die Make-Targets (zumindest die wichtigsten/relevanten) in der Anwender-Dokumentation beschrieben sind, bzw. um nicht die Beschreibung doppelt pflegen zu müssen, irgendwo in der Anwender-Dokumentation ein Link auf die Liste der Make-Targets, und diese Liste evtl. aufgeteilt in Targets für Anwender und Targets für Entwickler. Oder die wichtigen Targets auf andere Weise hervorgehoben.

Im Entwickler-Teil der Dokumentation würde ich auch nicht nachsehen, wenn ich in der Richtung keine Kenntnisse oder keine Absichten hätte.

Evtl. noch die wichtigsten Targets mit "make help" anzeigen.
 
Was dabei gelöscht wird ist unterschiedlich und kommt auf die ausgewählte Toolchain an. Siehe dazu unter /make/toolchain...
/make/toolchain finde ich nicht. Meinst Du evtl. /toolchain/make?
Aber egal, ich blicke da eh nicht durch, sorry.
icon11.gif

Im ersten Beitrag habe ich das soweit ich es verstanden habe, eingetragen, aber es sind noch einige Lücken, wo ich mir völlig unklar bin, ob diese Punkte überhaupt noch aktuell sind. Z.B. ist make precompiled ja Schnee von gestern, so dass ich es auch gleich weggelassen habe.
Aber die anderen?

@RalfFriedl:
Kannst Du mir diesbzgl. evtl. noch weiterhelfen, ohne dass ich mich nun durch makefiles durchwursteln muss? Es geht ja wirklich nur um eine kurze Beschreibung, die ich dann an geeigneter Stelle (Anfänger/Entwickler) im Wiki eintrage.
 
Generell ist die Bedeutung der Targets folgende:
  • distclean: Löscht alle Dateien, die evtl. durch den make-Prozeß erstellt werden. Nach distclean sollten nur noch die Dateien übrig sein, die man am Anfang heruntergeladen hat (dist wie distribution). In manchen Fällen kann es sein, daß Dateien, die automatisch erstellt werden können, für deren Erstellung aber seltene Toos oder viel Zeit gebraucht wird, Bestandteil der Distribution sind und daher mit distclean nicht gelöscht werden. Insbesondere wird mit distclean normalerweise auch die Konfiguration gelöscht, da diese ja auch nicht Bestandteil der Distribution ist.
  • dirclean: Bei Freetz werden damit die ausgepackten Verzeichnisse der Pakete gelöscht, also insbesondere die Verzeichnisse unter source und packages.
  • clean: Damit werden normalerweise die Dateien gelöscht, die durch den Build-Prozeß erstellt werden, also Programme, Libraries und Object-Dateien, aber nicht die Konfiguration.
Diese Targets gibt es auch für einzelnen Pakete. pgk-dirclean löscht das gesamte Verzeichnis source/pkg. Die Folge davon ist, daß das Verzeichnis beim nächsten Aufruf von make komplett ausgepackt wird, und insbesondere die Patches auf das Paket angewendet werden. Bei einem Update von Freetz könnten die Patches geändert sein, so daß man mit distclean auf der sicheren Seite ist. Häufig wird auch darauf hingewiesen (svn up && make pkg-dirclean).

Dir Targets common-*clean werden verwendet als Bestandteil der entsprechenden *clean Tragets, ich habe nicht den Eindruck, daß diese dazu gedacht sind, daß man sie direkt aufruft.

Das Target config-clean-deps hat mit den anderen recht wenig gemeinsam, damit wird die Konfiguration bereinigt und nicht Dateien gelöscht, die durch ein vorheriges Build erstellt wurden.

Die Targets kernel-clean und kernel-dirclean entsprechen der gleichen Systematik wie pkg-clean und pgk-dirclean. kernel-dirclean löscht den Kernel, beim nächsten erstellen werden alle Patches auf den Kernel angewendet.

Die Toolchain besteht aus zwei Teilen, es gibt für jeden Teil ein clean-Target:
  • Kernel-Toolchain zum Erstellen des Kernels.
  • "Target"-Toolchain zum Erstellen von Anwendungsprogrammen. Target ist in diesem Zusammenhang etwas unglücklich, weil Target ja auf beide Toolchains zutrifft, beide sind ja für das Ziel-System. Aber der Name ist nun mal so und wird es auch erstmal bleiben. Vermutlich stammt der Name aus einer Zeit, als noch kein eigener Kernel erstellt wurde.
Das Target world wird inzwischen automatisch ausgeführt und muß nicht mehr explizit aufgerufen werden. Ebenso wird alles mit precompiled automatisch aufgerufen.

Auch die Toolchain wird automatisch heruntergeladen bzw. erstellt, je nach Konfiguration. Bei Bedarf kann man die Teile auch einzeln erstellen.

Target kernel-menuconfig ist normalerweise nicht notwendig, wenn man dort etwas ändern will, weiß man besser, was man macht.

Der normale Ablauf ist "make menuconfig; make".
 
Wow, das ist mal eine (selbst für mich als Laien) super verständliche Erklärung - tausend Dank!
icon14.gif

Morgen packe ich das Ganze ins Wiki - nur wohin dort?
Ist das eher etwas für "Normal-User", für Developer, für beide?
Wo im Wiki würde man solche Infos am ehesten erwarten - egal, ob Anfänger oder Guru?
 
Zuletzt bearbeitet:
Ich denke, dass ein Guru eher in die Makefiles schaut. Daher würde ich es eher zu den "Normal User"-Infos packen. Zumindest die Targets, die wichtig sind. Irgendwelche Hintergründe oder Internas des Build-Prozess gehören da dann aber nicht rein.

MfG Oliver
 
@ao
"make world" ist eigentlich nicht dazu gedacht, dass es vom User aufgerufen wird.
"make kernel-toolchain" und "make target-toolchain" baut nur die Toolchains und macht sonst nichts. Die 2 Targets gibts auch nur, wenn im menuconfig so eingestellt. Ansonsten heißt das target "download-toolchain". Man könnte natürlich auch für die Download-Toolchain die 2 Targets kernel- und target-toolchain anbieten.
"make kernel-menuconfig" ruft menuconfig für den Kernel auf und speichert die .config dann zurück.
"make kernel-precompiled" baut den Kernel, kopiert ihn nach kernel/, ebenso die Module.

MfG Oliver
 
Nochmals Danke, Oliver. Heute komme ich zwar nicht mehr dazu, das ins Wiki zu schreiben, aber versprochen ist versprochen.
Schönen Abend! :D
 
make busybox-menuconfig fiele mir da noch ein ;)
 
Hallo,

es ist schon eine ziemliche Weile her, dass ich diesen Thread erstellt habe, und ich habe nicht vergessen, die wesentlichen Punkte ins Wiki zu übertragen bzw. dort anzupassen, falls nötig.
Falls jemand zu meinen rot markierten Fragen oben im 1. Beitrag noch eine kurze Antwort geben könnte, würde ich das auch gerne entsprechend berücksichtigen. Danke.
 
$pkg-clean ruft normalerweise das clean-Target des Source-Makefiles auf. Dieses wird typischerweise alle generierten Dateien (vor allem Object-Dateien, Libraries und ausführbare Programme) löschen. Ein nachfolgendes make wird diese neu erstellen, aber keine geänderten Patches anwenden.

$pkg-dirclean dagegen löscht das gesamte Verzeichnis des Pakets. Ein nachfolgendes make wird die Quellen neu auspacken, die Patches anwenden, das Paket konfigurieren und dann compilieren. Nur der letzte Schritt (compilieren) wird nach $pkg-clean ausgeführt.
 
Aber was ist der Unterschied zwischen kernel-toolchain-dirclean und target-toolchain-dirclean?
Das eine löscht den Kernel-Compiler und das andere den für die uClibc und die Binaries.

make world hab ich noch nie verwendet. Die anderen beiden sind noch aktuell.

MfG Oliver
 
Hallo,

nun habe ich Eure und auch die älteren Infos im Wiki unter FAQs (v3) untergebracht.

OT:
Leider sind mir dabei seltsamerweise sämtliche Formatierungen (Fettdruck der Kapitelüberschriften) aber vor allem auch die Code Boxen verschwunden, die nun auch nicht mehr in den v1+v2 angezeigt werden. Was ist da los? Mehr dazu bitte dort lesen und antworten. Danke und sorry für mein Missgeschick.
 
Zuletzt bearbeitet:
OT: make (dir)clean without affecting the toolchain

For those that have to build the toolchains themselfes, e.g. when one deploys IPv6, the make dirclean target causes a mostly unwanted cleanup of the toolchains. A subsequent make takes a very long time because the toolchains need to be build again completely from start.

It would be nice when either:
- the clean targets do not affect the toolchains and special cleanup targets for the toolchains were introduced, or
- other cleanup targets would become available that cleanup just the freetz packages stuff.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.