Forum: PC-Programmierung Makefile: Wie Abhängigkeit beschreiben?


von TriHexagon (Gast)


Lesenswert?

Hi,

ich will ein Makefile schreiben, welches das Projektverzeichnis nach src 
Ordnern durchsucht und das wiederum nach C-Quellcodedateien und 
Assembler-Quellcodedateien durchsucht. Diese sollen einzeln zu 
Objektdateien im Projektverzeichnis/obj kompiliert werden. Aber ich 
bekomme es nicht hin make diese Abhängigkeit klar zu machen. Das Target 
mit dem Pattern "%.o: %.c" zu beschreiben funktioniert nicht, da ich vom 
Namen der Objektdatei nicht auf die zugehörige Quellcodedatei schließen 
kann.

Allerings habe ich zwei Listen (keine Ahnung wie man das in make nennt):
1
SRC_DIRS = $(shell find -name src)
2
SRC = $(shell find $(SRC_DIRS) -name *.c) $(shell find $(SRC_DIRS) -name *.s)
3
OBJ = obj/$(notdir $(SRC:.c%.s=.o))

Gibt es eine Möglichkeit diese als Abhängigkeit zu verknüpfen?

Ich meine sowas in der Art:
obj/startup.o: cmsis/src/startup.s
obj/main.o: src/main.o

von Bernd K. (prof7bit)


Lesenswert?

TriHexagon schrieb:
> Allerings habe ich zwei Listen (keine Ahnung wie man das in make
> nennt):SRC_DIRS = $(shell find -name src)
> SRC = $(shell find $(SRC_DIRS) -name *.c) $(shell find $(SRC_DIRS) -name
> *.s)
> OBJ = obj/$(notdir $(SRC:.c%.s=.o))

Du bist schon auf dem richtigen Weg.

Schau Dir mal mein Makefile an für Inspiration:
1
########################################
2
## bare bones makefile for ARM Cortex ##
3
########################################
4
5
NAME      = testanwendung
6
7
#MKDIR     = mkdir -p
8
MKDIR     = c:/bin/mkdir.exe -p
9
10
SRCS      = $(wildcard src/*.c)
11
SRCS     += $(wildcard cmsis/MKL05Z4/*.c)
12
SRCS     += $(wildcard cmsis/MKL05Z4/*.s)
13
14
INCDIRS   = src/
15
INCDIRS  += cmsis/
16
INCDIRS  += cmsis/MKL05Z4/
17
18
DEFINES   = 
19
20
LSCRIPT   = cmsis/MKL05Z4/MKL05Z4.ld
21
#LSCRIPT   = cmsis/MKL05Z4/MKL05Z4_offs4k.ld
22
23
BUILDDIR  = build/
24
25
CFLAGS    = -ffunction-sections
26
CFLAGS   += -mlittle-endian
27
CFLAGS   += -mthumb
28
CFLAGS   += -mcpu=cortex-m0plus
29
CFLAGS   += -std=gnu99
30
CFLAGS   += -ggdb
31
#CFLAGS   += -Os -flto
32
CFLAGS   += -Og
33
34
LFLAGS    = --specs=nano.specs
35
LFLAGS   += --specs=nosys.specs
36
LFLAGS   += -nostartfiles
37
LFLAGS   += -Wl,--gc-sections
38
LFLAGS   += -T$(LSCRIPT)
39
LFLAGS   += -lm
40
41
WFLAGS    = -Wall
42
WFLAGS   += -Wextra 
43
WFLAGS   += -Werror -Wno-error=unused-function -Wno-error=unused-variable
44
WFLAGS   += -Wfatal-errors 
45
WFLAGS   += -Warray-bounds 
46
WFLAGS   += -Wno-unused-parameter
47
48
GCCPREFIX = arm-none-eabi-
49
CC        = $(GCCPREFIX)gcc
50
OBJCOPY   = $(GCCPREFIX)objcopy
51
OBJDUMP   = $(GCCPREFIX)objdump
52
SIZE    = $(GCCPREFIX)size
53
54
INCLUDE   = $(addprefix -I,$(INCDIRS))
55
OBJS      = $(addprefix $(BUILDDIR),$(addsuffix .o,$(basename $(SRCS))))
56
57
58
###########
59
## rules ##
60
###########
61
62
.PHONY: all
63
all: $(OBJS)
64
all: $(BUILDDIR)$(NAME).elf
65
all: $(BUILDDIR)$(NAME).bin
66
all: $(BUILDDIR)$(NAME).s19
67
all: $(BUILDDIR)$(NAME).lst
68
all: print_size
69
70
71
.PHONY: clean
72
clean: 
73
  $(RM) -rf $(wildcard $(BUILDDIR)*)
74
75
# compiler
76
$(BUILDDIR)%.o: %.c
77
  $(MKDIR) $(dir $@)
78
  $(CC) -MMD -c -o $@ $(INCLUDE) $(DEFINES) $(CFLAGS) $(WFLAGS) $<
79
80
# assembler
81
$(BUILDDIR)%.o: %.s
82
  $(MKDIR) $(dir $@)
83
  $(CC) -c -x assembler-with-cpp -o $@ $(INCLUDE) $(DEFINES) $(CFLAGS) $(WFLAGS) $<
84
85
# linker
86
$(BUILDDIR)%.elf: $(OBJS)
87
  $(CC) -o $@ $^ $(CFLAGS) $(LFLAGS)
88
89
%.bin: %.elf
90
  $(OBJCOPY) -O binary -S $< $@ 
91
92
%.s19: %.elf
93
  $(OBJCOPY) -O srec -S $< $@
94
95
%.lst: %.elf
96
  $(OBJDUMP) -D $< > $@ 
97
98
.PHONY: print_size
99
print_size: $(BUILDDIR)$(NAME).elf
100
  $(SIZE) $(BUILDDIR)$(NAME).elf
101
  
102
103
#####################
104
## Advanced Voodoo ##
105
#####################
106
107
# try to include any compiler generated dependency makefile snippet *.d
108
# that might exist in BUILDDIR (but don't complain if it doesn't yet).
109
DEPS = $(addprefix $(BUILDDIR),$(patsubst %.c,%.d,$(filter %.c,$(SRCS))))
110
-include $(DEPS)
111
112
# make the object files also depend on the makefile itself
113
$(OBJS): Makefile

Ich ersetze alle gefundenen .c und .s Endungen durch .o, dadurch bekomme 
ich eine Liste mit allen zu erstellenden .o Dateien. Wenn ich nun 
einfach $(OBJS) als Prerequisite im all habe (erste Zeile von all:) dann 
sorgen meine beiden rules für compiler und assembler automagisch dafür 
dass all diese .o Dateien aus ihren Quellen gebaut werden.

von TriHexagon (Gast)


Lesenswert?

Vielen Dank! Jetzt funktioniert es! Du bildest die Ordnerstruktur auch 
im Buildverzeichnis ab. D.h. cmsis/src/test.c kompiliert zu 
build/cmsis/src/test.o was das ganze sehr vereinfacht und Namensprobleme 
verhindert. Was ich noch nicht wusste war, dass make bei 
"$(BUILDDIR)%.o: %.c" $(BUILDDIR) in $< weglässt.

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.