Forum: Compiler & IDEs AVRgcc makefile - *.o in Unterordner ablegen


von µC (Gast)


Lesenswert?

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!

von Andreas B. (andreas_b77)


Lesenswert?

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.

von µC (Gast)


Lesenswert?

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?

von Roland H. (batchman)


Lesenswert?

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.

von µC (Gast)


Lesenswert?

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.

von Roland H. (batchman)


Lesenswert?

µC schrieb:
> So funktionierts nicht.

Dann zeige doch bitte die Ausgabe des make-Aufrufs.

von µC (Gast)


Lesenswert?

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 :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

µ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???

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

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"

von µC (Gast)


Lesenswert?

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)

von Stefan E. (sternst)


Lesenswert?

µ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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

µ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.

von µC (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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
Noch kein Account? Hier anmelden.