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.
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???
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:
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.
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.