Hallo zusammen. Ich versuche mich gerade an einem WinAVR makefile. Soweit funktioniert alles. Nun habe ich das makefile mit allen *.bat in einen extra Ordner gelegt und die Pfade im Makefile angepasst. Funktioniert soweit immernoch. Als letzten Schritt möchte ich, dass alle temp. files (*.o *.map, ...) in einem extra Ordner abgelegt werden. Wie macht man das? Und wo genau trägt man das im makefile ein? Danke!
Andersherum ist es wohl einfacher, also die Erzeugnisse im aktuellen Verzeichnis und die Sourcen werden aus einem anderen Verzeichnis genommen. Dafür gibt es die Variable VPATH in GNU make, in dem man die Pfade einträgt, in denen nach Abhängigkeiten gesucht werden soll. Also wird das Makefile (mit passendem VPATH) in den Zielordner kopiert und make auch dort ausgeführt.
Ich habs gewusst!!! Ein billiger Befehl und schon funktionierts. :D Also ich habe jetzt meine source files seperat gelagert. Makefile und *.o files sind dank des VPATH Befehls gemeinsam im anderen Verzeichnis. Danke! Eine Sache stimmt allerdings noch nicht. Und zwar werden die *.lst files immernoch im Verzeichnis der source files abgelegt. Wie kann ich das ändern?
Makefile im top level, optional: VPATH zeigt auf Source-Directory src Targets mit Verzeichnis-Präfix: # mit VPATH build/main.o: main.c # ohne VPATH build/main.o: src/main.c analog für .elf, .lss etc. Dann liegt alles da, wo es hingehört. Und man kann build komplett löschen. In das Versionskontrollsystem wird build nicht aufgenommen.
phuuuu.... noch bin ich nicht ganz verzweifelt ;)
Ich habe jetzt folgende Ordnerstruktur aufgebaut:
Projektordner
- alle *.bat
- makefile
-> build
(in diesen Ordner sollen alle temp. files)
-> src
(hier liegen alle *.c *.h files)
Jetzt habe ich aber wieder das gleiche Problem. Wie bekomme ich die
temp. files in den build Ordner???
Ein Auszug aus meinem makefile:
1 | VPATH = src |
2 | BPATH = build |
3 | ... |
4 | |
5 | coff: $(TARGET).elf |
6 | @echo |
7 | @echo $(MSG_COFF) $(TARGET).cof |
8 | $(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
9 | |
10 | |
11 | extcoff: $(TARGET).elf |
12 | @echo |
13 | @echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
14 | $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
15 | |
16 | |
17 | # Create final output files (.hex, .eep) from ELF output file. |
18 | $(BPATH)/%.hex: $(BPATH)/%.elf |
19 | @echo |
20 | @echo $(MSG_FLASH) $@ |
21 | $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
22 | |
23 | $(BPATH)/%.lss: $(BPATH)/%.elf |
24 | @echo |
25 | @echo $(MSG_EXTENDED_LISTING) $@ |
26 | $(OBJDUMP) -h -S $< > $@ |
27 | |
28 | # Create a symbol table from ELF output file. |
29 | $(BPATH)/%.sym: $(BPATH)/%.elf |
30 | @echo |
31 | @echo $(MSG_SYMBOL_TABLE) $@ |
32 | $(NM) -n $< > $@ |
33 | |
34 | |
35 | # Link: create ELF output file from object files. |
36 | .SECONDARY : $(BPATH)/$(TARGET).elf |
37 | .PRECIOUS : $(BPATH)/$(OBJ) |
38 | $(BPATH)/%.elf: $(BPATH)/$(OBJ) |
39 | @echo |
40 | @echo $(MSG_LINKING) $@ |
41 | $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) |
42 | |
43 | |
44 | # Compile: create object files from C source files. |
45 | $(BPATH)/%.o : %.c |
46 | @echo |
47 | @echo $(MSG_COMPILING) $< |
48 | $(CC) -c $(ALL_CFLAGS) $< -o $@ |
49 | |
50 | ... |
So funktionierts nicht.
Ja stimmt.
Die Compiler Ausgabe ist aber nichts aussagend, meiner Meinung nach.
[code]
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
avr-gcc -gdwarf-2 -Os -funsigned-char -funsigned-bitfields
-fpack-struct -fshort-enums -Wall -Wstrict-prototypes
-Wa,-adhlns=main.lst -I../RP6Lib -I../RP6Lib/RP6base
-I../RP6Lib/RP6common -Isrc -std=gnu99 -c -o main.o main.c
In file included from src/ATMEGA32_StdConf.h:40,
from main.c:35:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:404:6: warning:
#warning "device type not defined"
main.c: In function 'main':
main.c:46: warning: implicit declaration of function 'RP6robot_Init'
main.c:49: error: 'DDRC' undeclared (first use in this function)
main.c:49: error: (Each undeclared identifier is reported only once
main.c:49: error: for each function it appears in.)
main.c:49: error: 'PINC4' undeclared (first use in this function)
main.c:50: error: 'PORTC' undeclared (first use in this function)
make: *** [main.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:00
[\code]
Er findet scheinbar paar *.h files nicht. Es fehlt also irgendwo noch ne
Verzeichnisangabe. Aber so weit war ich ja auch ohne ihn. Ich weiß nur
nicht, wo ich noch was machen soll.
Grüße :)
µC schrieb: > c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:404:6: warning: > #warning "device type not defined" > [...] > Er findet scheinbar paar *.h files nicht. Was steht in der ersten Fehlermeldung? Dass er ein paar *.h files nicht findet???
Naja, steht doch eigentlich alles da:
1 | c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:404:6: warning: |
2 | #warning "device type not defined" |
Frank M. schrieb: > Was steht in der ersten Fehlermeldung? Dass er ein paar *.h files nicht > findet??? Warum gleich 3 Fragezeichen? Einmal ausatmen und Ruhe bewahren ;) Im Allgemeinen funktioniert das Projekt und lässt sich wunderbar compilieren und ausführen. Und da findet er auch den "device type" und sonstiges... Nur wenn ich versuche die temp. files in ein gesondertes Verzeichnis zu erstellen, kommt diese Fehlermeldung. Nochmal: Klar, habe ich diese Fehlermeldung gelesen. Aber ich verstehe nicht, wie ich sie beheben soll. Deshalb suche ich ja auch hier Hilfe, oder? ;) (Das mit den *.h files war nur ne Vermutung! von mir)
µC schrieb: > Im Allgemeinen funktioniert das Projekt und lässt sich wunderbar > compilieren und ausführen. Aber ganz sicher nicht ohne -mmcu Option. Also such die Stelle, wo du bei deinen Modifikationen dafür gesorgt hast, dass diese Option nicht mehr in der Compiler-Kommandozeile auftaucht.
µC schrieb: > Warum gleich 3 Fragezeichen? Einmal ausatmen und Ruhe bewahren ;) Ich kann nun mal nicht verstehen, wie man bei so einer eindeutigen Fehlermeldung (bei C ist immer die erste ausschlaggebend) auf solche hanebüchenden Vermutungen kommen kann. Da steht nichts - aber auch rein gar nichts - von "Ich armer Compiler vermisse eine H-Datei namens foo.h". > Klar, habe ich diese Fehlermeldung gelesen. Aber ich verstehe nicht, wie > ich sie beheben soll. Schaue Dir den Compiler-Aufruf mal genauer an:
1 | avr-gcc -gdwarf-2 -Os -funsigned-char -funsigned-bitfields |
2 | -fpack-struct -fshort-enums -Wall -Wstrict-prototypes |
3 | -Wa,-adhlns=main.lst -I../RP6Lib -I../RP6Lib/RP6base |
4 | -I../RP6Lib/RP6common -Isrc -std=gnu99 -c -o main.o main.c |
Da fehlt was. Nämlich die Angabe des Prozessor-Typs. Du hast da irgendwas beim Verbiegen Deiner Pfade im Makefile kaputt gemacht. Vergleiche das mit einer älteren Variante, die Du bestimmt irgendwo gesichert hast.
Tut mir leid, aber ich kenne mich im makefile zu wenig aus, als dass mir diese obigen Kommentare weiterhelfen würden. Das Projekt lässt sich compilieren und ausführen. Sobald ich aber eine einzige Zeile ändere, indem ich "build/" hinzufüge, funktioniert nix mehr:
1 | # Compile: create object files from C source files. |
2 | build/%.o : %.c |
3 | @echo |
4 | @echo $(MSG_COMPILING) $< |
5 | $(CC) -c $(ALL_CFLAGS) $< -o $@ |
1 | Output: |
2 | avr-gcc -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -I../RP6Lib -I../RP6Lib/RP6base -I../RP6Lib/RP6common -Isrc -std=gnu99 -c -o main.o main.c |
3 | In file included from src/ATMEGA32_StdConf.h:40, |
4 | from main.c:35: |
5 | c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:404:6: warning: #warning "device type not defined" |
6 | main.c: In function 'main': |
7 | main.c:46: warning: implicit declaration of function 'RP6robot_Init' |
8 | main.c:49: error: 'DDRC' undeclared (first use in this function) |
9 | main.c:49: error: (Each undeclared identifier is reported only once |
10 | main.c:49: error: for each function it appears in.) |
11 | main.c:49: error: 'PINC4' undeclared (first use in this function) |
12 | main.c:50: error: 'PORTC' undeclared (first use in this function) |
13 | make: *** [main.o] Error 1 |
14 | |
15 | > Process Exit Code: 2 |
16 | > Time Taken: 00:00 |
Ich habe dann an allen anderen stellen auch "build/" hinzugefügt, wo ichs für sinnvoll hielt. Hat nichts gebracht.
Der von dir gepostete Output wurde garantiert nicht von dem gezeigten Makefile-Fragment erzeugt. Ich habe jetzt keine Lust das im Make-Manual zu überprüfen, aber ich würde einfach mal vermuten, dass wenn keine passende c->o Regel explizit vorhanden ist, eine implizite zur Anwendung kommt, die dann CFLAGS mit einschließt. Du musst natürlich auch dafür sorgen, dass Make überhaupt ein build/XXX.o erzeugen will, und kein XXX.o. Oder anders gesagt, dies > Ich habe dann an allen anderen stellen auch "build/" hinzugefügt, wo > ichs für sinnvoll hielt. war unzureichend.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.