Makefile: Wie Abhängigkeit beschreiben?

Gast #4146545
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
#4146596
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.
Gast #4147326
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.

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