makefile Suffixregeln

OP #6088840
Lesenswert?
• ▲
▼
Ein uC Projekt wird mit untenstehendem makefile übersetzt.
Das Makro OBJECTS wird bereits erfolgreich für den Linker eingesetzt.
Nun habe ich gehört (irgendwo gelesen) dass es irgendwas wie implizite 
Regeln oder Suffixregeln gibt, mit welchen man die CC Aufrufe so machen 
kann dass CC für jedes File von CSOURCES aufgerufen wird ohne daß man 
die Dateien einzeln im makefile angeben muss. Geht das auch wenn der AS 
Aufruf andere Parameter haben soll und wie muß das dann aussehen ?

1
CC = arm-none-eabi-gcc
2
CFLAGS = -Wall -O0 -funsigned-char --function-sections -mthumb -c -mcpu=cortex-m3
3

4
AS = arm-none-eabi-as
5
AFLAGS = -mcpu=cortex-m3 -mthumb
6

7
LD = arm-none-eabi-ld
8
LFLAGS = -gc-sections -M=map.txt -T./lscript_ld.txt
9

10
CSOURCES = *.c
11
ASOURCES = *.s
12
OBJECTS = ./o/*.o
13

14
./o/out.bin : ./o/out.elf
15
        @echo ${OBJECTS}
16
        arm-none-eabi-objcopy -O binary ./$< ./$@
17

18
./o/out.elf : ${OBJECTS} 
19
        ${LD} ${LFLAGS} ${OBJECTS} -o./o/out.elf
20

21
./o/startup_stm32f10x_ld.o : startup_stm32f10x_ld.s
22
        ${AS} ${AFLAGS} -I./ -o./o/startup_stm32f10x_ld.o ./startup_stm32f10x_ld.s
23

24
./o/cpuinit.o : cpuinit.c
25
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
26
./o/main.o : main.c
27
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
28
./o/flop.o : flop.c
29
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
30
./o/misc.o : misc.c
31
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
32
./o/stm32f10x_adc.o : stm32f10x_adc.c
33
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
34
./o/stm32f10x_dma.o : stm32f10x_dma.c
35
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
36
./o/stm32f10x_gpio.o : stm32f10x_gpio.c
37
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
38
./o/stm32f10x_flash.o : stm32f10x_flash.c
39
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
40
./o/stm32f10x_it.o : stm32f10x_it.c
41
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
42
./o/stm32f10x_rcc.o : stm32f10x_rcc.c
43
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
44
./o/stm32f10x_tim.o : stm32f10x_tim.c
45
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
OP #6088904
Lesenswert?
• ▲
▼
Ja, so was ähnliches suche ich. Die Regeln für .c.o: und .s.o: sind wohl 
schon eingebaut aber alle Beispiele linken beim Aufruf von CC sogleich 
weshalb das nicht so recht passt ? Sollte ich da doch eigene .SUFFIXES: 
.o .c .s definieren?
Das gibt zwar keine Fehlermeldung aber es macht auch nix weil ich nicht 
weis wo CSOURCES und ASOURCES hingehören
1
CC = arm-none-eabi-gcc
2
CFLAGS = -Wall -O0 -funsigned-char --function-sections -mthumb -c -mcpu=cortex-m3
3

4
AS = arm-none-eabi-as
5
AFLAGS = -mcpu=cortex-m3 -mthumb
6

7
LD = arm-none-eabi-ld
8
LFLAGS = -gc-sections -M=map.txt -T./lscript_ld.txt
9

10
CSOURCES = *.c
11
ASOURCES = *.s
12
OBJECTS = ./o/*.o
13

14
.SUFFIXES: .o .c .s
15
.c.o : 
16
        ${CC} ${CFLAGS} -o$@ ./$<
17
.s.o : 
18
        {AS} ${AFLAGS} -o./$@ ./$<
19
        
20
./o/out.bin : ./o/out.elf
21
        arm-none-eabi-objcopy -O binary ./$< ./$@
22

23
./o/out.elf : ${OBJECTS} 
24
        ${LD} ${LFLAGS} ${OBJECTS} -o./o/out.elf
Gast #6088925
Lesenswert?
• ▲
▼
J. V. schrieb:
> Ja, so was ähnliches suche ich. Die Regeln für .c.o: und .s.o:
> sind wohl
> schon eingebaut aber alle Beispiele linken beim Aufruf von CC sogleich
> weshalb das nicht so recht passt ? Sollte ich da doch eigene .SUFFIXES:
> .o .c .s definieren?

Du kannst gleich linken oder getrennt, dazu hast du ja die rules. 
.SUFFIXES sind schon vordefiniert, du brauchst normalerweise keine 
eigenen.

s. eg. 
https://www.gnu.org/software/make/manual/html_node/Suffix-Rules.html

RTFM
leo
OP #6089003
Lesenswert?
• ▲
▼
habe praktisch nur einen Eintrag anstelle der Liste geändert in:

./o/*.o : ${CSOURCES}
        ${CC} ${CFLAGS} -o$@ ./$<

d.h. die Objektfiles sollen aus C-Sources compiliert werden indem CC 
aufgerufen wird. Das erzeugt aber:

$ cd ..
jv@JamesWebb:~/testprojekt/fw$ make -B
arm-none-eabi-as -gdwarf-2 -mcpu=cortex-m3 -mthumb 
-oo/startup_stm32f10x_ld.o ./startup_stm32f10x_ld.s
make: *** No rule to make target 'o/cpuinit.o', needed by 'o/out.elf'. 
Stop.
OP #6089434
Lesenswert?
• ▲
▼
Mit dem Beispiel von Leo habe ich soweit verstanden warum mein makefile 
nur dann funktioniert solange man die Objekt Files nicht löscht. So 
scheint es zu funktionieren wenngleich mir das notdir nicht gefällt (@< 
ist auch falsch weil es immer den gleichen PreRequisit Namen aus der 
Liste liefert) Ansonsten müsste ich mich davon verabschieden die 
Objektdateien im Unterverzeichnis o zu haben.
1
csource := $(wildcard *.c)
2
asource := $(wildcard *.s)
3
cobjcts  = $(csource:%.c=./o/%.o)
4
aobjcts  = $(asource:%.s=./o/%.o)
5
objects  = $(csource:%.c=./o/%.o)
6
objects += $(asource:%.s=./o/%.o)
7

8
LD = arm-none-eabi-ld
9
LFLAGS = -gc-sections -M=map.txt -T./lscript_ld.txt
10

11
./o/out.bin : ./o/out.elf
12
        arm-none-eabi-objcopy -O binary ./$< ./$@
13
./o/out.elf : $(objects)
14
        ${LD} ${LFLAGS} $(objects) -o./o/out.elf
15
$(aobjcts) : $(asource)
16
        ${AS} ${AFLAGS} -o$@ $(notdir $*.s)
17
$(cobjcts) : $(csource)
18
        ${CC} ${CFLAGS} -o$@ $(notdir $*.c)
Beitrag #6155300 wurde von einem Moderator gelöscht.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.