Forum: Compiler & IDEs makefile Suffixregeln


von J. V. (janvi)


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$@ ./$<

von svedisk ficklampa (Gast)


Lesenswert?

make -p

von leo (Gast)


Lesenswert?

J. V. schrieb:
> Nun habe ich gehört (irgendwo gelesen) dass es irgendwas wie implizite
> Regeln oder Suffixregeln gibt,

Ich denke, du suchst ca. so was:
1
src = $(wildcard *.c)
2
obj = $(src:.c=.o)
3
4
LDFLAGS = -lm -lbla
5
6
myprog: $(obj)
7
    $(CC) -o $@ $^ $(LDFLAGS)

s. http://nuclear.mutantstargoat.com/articles/make/

leo

von J. V. (janvi)


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

: Bearbeitet durch User
von leo (Gast)


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

von J. V. (janvi)


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.

von J. V. (janvi)


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)

: Bearbeitet durch User
Beitrag #6155300 wurde von einem Moderator gelöscht.
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.