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


von Axel R. (Gast)


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:
1
> "make.exe" all
2
3
-------- begin --------
4
5
Cleaning project:
6
rm -f NAVKOS_P.hex
7
rm -f NAVKOS_P.eep
8
rm -f NAVKOS_P.cof
9
rm -f NAVKOS_P.elf
10
rm -f NAVKOS_P.map
11
rm -f NAVKOS_P.sym
12
rm -f NAVKOS_P.lss
13
rm -rf obj
14
rm -f NAVKOS_P.s I2C.s
15
rm -f NAVKOS_P.d I2C.d
16
rm -rf .dep
17
-------- end --------
18
19
20
Compiling C: NAVKOS_P.c
21
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 
22
NAVKOS_P.c:902: fatal error: opening dependency file .dep/NAVKOS_P.o.d: No such file or directory
23
compilation terminated.
24
make.exe: *** [obj/NAVKOS_P.o] Error 1
25
26
> Process Exit Code: 2
27
> Time Taken: 00:00

einzeln aufgerufen funktioniert alles wie gewünscht.

Danke

AxelR.

von jemand (Gast)


Lesenswert?

maker.bat
1
make all
2
make clean
:-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Axel R. (Gast)


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.


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Rolf Magnus (Gast)


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.

von Axel R. (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Axel R. (Gast)


Lesenswert?

Alles klar, habe ich begriffen.

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

Dankeschön zusammen!!

xlr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.