mikrocontroller.net

Forum: Compiler & IDEs makefile Suffixregeln


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von J. V. (janvi)


Bewertung
0 lesenswert
nicht 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 ?

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

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

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

CSOURCES = *.c
ASOURCES = *.s
OBJECTS = ./o/*.o

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

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

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

./o/cpuinit.o : cpuinit.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/main.o : main.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/flop.o : flop.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/misc.o : misc.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_adc.o : stm32f10x_adc.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_dma.o : stm32f10x_dma.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_gpio.o : stm32f10x_gpio.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_flash.o : stm32f10x_flash.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_it.o : stm32f10x_it.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_rcc.o : stm32f10x_rcc.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<
./o/stm32f10x_tim.o : stm32f10x_tim.c
        ${CC} ${CFLAGS} -I./ -o$@ ./$<


von svedisk ficklampa (Gast)


Bewertung
0 lesenswert
nicht lesenswert
make -p

von leo (Gast)


Bewertung
0 lesenswert
nicht 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:
src = $(wildcard *.c)
obj = $(src:.c=.o)

LDFLAGS = -lm -lbla

myprog: $(obj)
    $(CC) -o $@ $^ $(LDFLAGS)

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

leo

von J. V. (janvi)


Bewertung
0 lesenswert
nicht 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
CC = arm-none-eabi-gcc
CFLAGS = -Wall -O0 -funsigned-char --function-sections -mthumb -c -mcpu=cortex-m3

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

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

CSOURCES = *.c
ASOURCES = *.s
OBJECTS = ./o/*.o

.SUFFIXES: .o .c .s
.c.o : 
        ${CC} ${CFLAGS} -o$@ ./$<
.s.o : 
        {AS} ${AFLAGS} -o./$@ ./$<
        
./o/out.bin : ./o/out.elf
        arm-none-eabi-objcopy -O binary ./$< ./$@

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

: Bearbeitet durch User
von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.
csource := $(wildcard *.c)
asource := $(wildcard *.s)
cobjcts  = $(csource:%.c=./o/%.o)
aobjcts  = $(asource:%.s=./o/%.o)
objects  = $(csource:%.c=./o/%.o)
objects += $(asource:%.s=./o/%.o)

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

./o/out.bin : ./o/out.elf
        arm-none-eabi-objcopy -O binary ./$< ./$@
./o/out.elf : $(objects)
        ${LD} ${LFLAGS} $(objects) -o./o/out.elf
$(aobjcts) : $(asource)
        ${AS} ${AFLAGS} -o$@ $(notdir $*.s)
$(cobjcts) : $(csource)
        ${CC} ${CFLAGS} -o$@ $(notdir $*.c)

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.