AVRgcc makefile - *.o in Unterordner ablegen

Gast #3032383
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!
#3032604
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.
Gast #3032649
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?
#3032660
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.
Gast #3032834
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.
Gast #3033832
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 :)
Gast #3033929
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)
Moderator Persönliche Seite #3034043
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.
Gast #3040931
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.
#3041140
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren