mikrocontroller.net

Forum: Compiler & IDEs GCC: make 'clean' und 'all' in einem Rutsch


Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte den Job "clean" und den Job "all" mit einem knopfdruck 
erledigen.
Dazu habe ich den Eintrag im Makefile entsprechend geändert:

aus
>> "all: begin gccversion sizebefore build sizeafter end"
habe ich
>> "all: begin clean gccversion sizebefore build sizeafter end"
gemacht.

Nun hat es den Anschein, dass die shell nicht wartet, bis "clean" fertig 
ist.
Wie kann ich den Exitcode von Job "clean" abfragen, oder solange warten, 
bis clean fertig ist?
Ich erhalte folgende Fehlermeldung:
> "make.exe" all

-------- begin --------

Cleaning project:
rm -f NAVKOS_P.hex
rm -f NAVKOS_P.eep
rm -f NAVKOS_P.cof
rm -f NAVKOS_P.elf
rm -f NAVKOS_P.map
rm -f NAVKOS_P.sym
rm -f NAVKOS_P.lss
rm -rf obj
rm -f NAVKOS_P.s I2C.s
rm -f NAVKOS_P.d I2C.d
rm -rf .dep
-------- end --------


Compiling C: NAVKOS_P.c
avr-gcc -c -mmcu=atmega168 -I. -gdwarf-2 -DF_CPU=7874000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/NAVKOS_P.lst  -std=gnu99 -Wall -gdwarf-2 -Os -fsigned-char -DMODE_OPT=0 -Wundef -MD -MP -MF .dep/NAVKOS_P.o.d NAVKOS_P.c -o obj/NAVKOS_P.o 
NAVKOS_P.c:902: fatal error: opening dependency file .dep/NAVKOS_P.o.d: No such file or directory
compilation terminated.
make.exe: *** [obj/NAVKOS_P.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00


einzeln aufgerufen funktioniert alles wie gewünscht.

Danke

AxelR.

Autor: jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
maker.bat
make all
make clean
:-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
make clean all

Aber, wenn du das haben willst, deutet das eher darauf hin, dass in
deinem Makefile irgendeine Abhängigkeit nicht sauber spezifiziert
ist.  Normalerweise braucht man das nicht.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Tipps.

Ich wollte einfach (aus Faulheit) das aufeinanderfolgende Drücken der 
"Knöpfe" automatisieren;-)

ich habe mal mit 'copy con maker.bat'
make clean
make all
^Z
getippt und maker.bat aufgerufen. Das funktioniert!! (Juhuu)

'make clean all' hingegen bringt exakt den gleichen Fehler wie im 
Output-Fenster von PN.
Was ja meine Annahme bestätigt, das die Windows Command Shell wartet, 
bis 'make clean' fertig ist ist und dann erst mit 'make all' 
weitermacht.
Nunja.

ich lege mir jetzt 'maker.bat' auf F12. Muss mir allerdings noch die 
XML-Datei von PN suchen ;-))

Danke erstmal - auch wenn noch keine 100%tige Erklärung gefunden habe - 
so gehts jedenfalls.

Kann man die sh nicht einfach nach 'make clean' etwas warten lassen? 
einen wait -Befehl habe ich gefunden. Aber kann mit der geforderten pid 
oder mit dem jobname nichts anfangen. Na; sooo wichtig ist's auch wieder 
nicht.


Viele Grüße
AxelR.


Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Rühl wrote:

> 'make clean all' hingegen bringt exakt den gleichen Fehler wie im
> Output-Fenster von PN.

Ach, jetzt sehe ich das Dilemma.

> Was ja meine Annahme bestätigt, das die Windows Command Shell
> wartet, bis 'make clean' fertig ist ist und dann erst mit 'make all'
> weitermacht.

Nein, deine Annahme bezüglich der Ursache des Fehlers ist flasch.  Mit
diesen komischen automatischen Abhängigkeiten verheddert sich da
intern was, wenn man beide Schritte in einem Aufruf machen will.

Im Prinzip müsste ja auch »make clean; make all« gehen, aber ich bin
mir nicht ganz sicher, ob cmd.exe nun so Unix-shell-kompatibel ist.

Die Frage, wofür du das clean überhaupt erst brauchst, hast du mir
aber noch nicht beantwortet.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aus
>>> "all: begin gccversion sizebefore build sizeafter end"
> habe ich
>>> "all: begin clean gccversion sizebefore build sizeafter end"
> gemacht.

Damit führst du die ganze Verwendung von make ad absurdum. Du könntest 
auch einfach ein Skript schreiben, das das macht. Der einzige Grund, 
warum make existiert, ist, damit man nicht immer alles bauen muß, 
sondern nur das, was sich geändert hat und was davon abhängt.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Frage, wofür du das clean überhaupt erst brauchst, hast du mir
>aber noch nicht beantwortet.

ich dachte gelesen zu haben, dass man erst 'clean' drücken soll und dann 
'all'...

Ich habe allerdings auch schon geschnallt, das er tatsächlich nur die 
Dateien neu anfasst, die auch geändert wurden. Tolle Sache!

Somit ist die Sache wirklich vollkommen daneben. Ad absurdum eben, wie 
Rolf richtig feststellte.

Wozu dient denn der 'clean' Befehl dann eigentlich, wenn er nicht 
benötigt wird. Zur "Sicherheit"?

Gruß
AxelR.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Rühl wrote:

> Wozu dient denn der 'clean' Befehl dann eigentlich, wenn er nicht
> benötigt wird.

Eben zum Aufräumen, wie der Name ja eigentlich sagt.  Die Idee dahinter
ist, dass man hinter dem "clean"-Target im Makefile alle Aktionen
anordnet, die vorgenommen werden müssen, um sämtliche im Build-Prozess
generierten Dateien wieder zu löschen, d. h. man kehrt zum Zustand
vor dem Beginn des Compilierens zurück.

Zuweilen nimmt man an einem Projekt auch mal Änderungen vor, die im
Makefile nicht als Abhängigkeit erfasst worden sind.  Denkbar ist
beispielsweise in unserem Zusammenhang, dass man den Zielprozessor
vom ursprünglich angedachten ATmega88 auf einen ATmega168 hochgedreht
hat.  Damit sind alle bereits existierenden Objektdateien hinfällig.
Nun könnte man loslegen und alle Objektdateien noch vom Makefile
abhängig machen, damit sie nach jeder Änderung des Makefiles automatisch
neu gebaut werden.  Das lohnt aber eigentlich nicht, da diese Änderung
praktisch einmalig innerhalb der Lebenszeit des Projekts war.  Dann
bietet es sich als Krücke an, dass man vor dem nächsten "make" eben
mal schnell ein "make clean" reinwirft, um von vorn anzufangen.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, habe ich begriffen.

Dann hau ich aller Naselang mal wieder ein clean rein und gut :-))

Dankeschön zusammen!!

xlr.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.