2017-01-05 4 views
0
$(Q)makedepend $(CFLAGS) -o.o -f- $< 2> nul: | sed -e s!$(<:.cpp=.o)[email protected]! -e s!\\!/!g > $(@:.o=.d) 

Es ist Teil der folgenden Regel in Contiki Makefile.Kann mir jemand dieses Rezept erklären?

CUSTOM_RULE_CPP_TO_OBJECTDIR_O = 1 
$(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR) 
    $(TRACE_CC) 
    $(Q)cl -nologo $(VCFLAGS) -c $< [email protected] 
    $(Q)makedepend $(CFLAGS) -o.o -f- $< 2> nul: | sed -e s!$(<:.cpp=.o)[email protected]! -e s!\\!/!g > $(@:.o=.d) 

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen vor dem Downvoting möchten. Danke

Antwort

0

Ich bin mir nicht sicher, was genau Sie erklären möchten. Dies ist eine Befehlszeile, die das Programm makedepend aufruft, leitet seinen stderr zu nul: um (sieht so aus, als würde dies auf einem DOS-System ausgeführt werden? Aber mit UNIX-Tools wie sed?) Und sendet seine Ausgabe an sed. Das Programm sed konvertiert den Dateinamen .o in der Ausgabe von makedepend in den tatsächlichen Zielnamen (einschließlich des Pfads) und konvertiert umgekehrte Schrägstriche in Schrägstriche.

Dann werden die Ergebnisse in eine .d Datei geschrieben. Vermutlich irgendwo im Makefile finden Sie eine Zeile, die include verwendet, um alle .d Dateien einzuschließen.

Im Grunde ist dies eine Möglichkeit, automatisch Header-Dateiabhängigkeiten zu generieren, so dass make Objektdateien neu erstellt, wenn sie sich ändern, ohne dass Sie sie alle manuell in das Makefile schreiben müssen.

ETA

  • $ (Q)
    A macht variable Referenz, die entweder an @ erweitert wahrscheinlich ist oder nicht, Ausführlichkeit der Make-Datei zu steuern.
  • makedepend $ (CFLAGS) -oo -f- $ <
    Invoke makedepend mit den CFLAGS Optionen und die Ergebnisse an stdout (-f-) schreiben, um die Quelldatei zu lesen ($<)
  • 2> nul:
    Redirect stderr zu nul:, die auf Windows ein Sonderzeichen Gerät ist, was bedeutet "wegwerfen".
  • |
    Senden Sie die Ausgabe des vorherigen Befehls an die Eingabe des nächsten Befehls.
  • sed
    Führen Sie den sed (Stream-Editor) Programm, das ein UNIX/POSIX-Programm, das Dateien auf einer Zeile-für-Zeile-Basis (in der Regel) manipuliert.
  • -e s! $ (<: .cpp = .o)! $ @!
    Die erste Manipulation ersetzt die Klarnamen der Objektdatei (zB wenn Sie kompilieren foo.cpp dann $<foo.cpp sind, und $(<:.cpp=.o) ersetzt die .cpp mit einem .o so das Ergebnis ist foo.o) mit dem Namen des Ziels: [email protected] wird der vollständige Zielname wie obj/foo.o sein, wenn OBJECTDIRobj ist.
  • -e s! \\! /!g
    Die zweite Substitution ersetzt alle umgekehrten Schrägstriche (aus der Shell entfernt, also \\) mit Schrägstrichen.
  • > $ (@ :. o = .d)
    Schreiben Sie den Ausgang des sed-Befehl in die Datei [email protected] mit dem ersetzten .o durch .d, also wenn OBJECTDIRobj ist, wird es zu obj/foo.d
schreiben
+0

Ich habe den Punkt verstanden, danke dafür, aber können Sie bitte die Aussage brechen und erklären, welcher Teil was macht? –

Verwandte Themen