Bernhard L. R. schrieb:
> Bin für jeden zielführenden Hinweis sehr dankbar :)
Ich mache für ein recht umfangreiches Projekt (kein AVR) so was
ähnliches (ein Makefile für mehrere Plattformen, Quellen in einem
gemeinsamen Source tree) mit Templates. Ein (gekürzter) Ausschnitt aus
dem Makefile:
1 | TRGTDIRS=./target1 ./target2 ./target3
|
2 | EXE=program
|
3 |
|
4 | CSRCS=\
|
5 | sysinit.c \
|
6 | init_fpga.c \
|
7 | fault_vectors.c \
|
8 | ...
|
9 | interrupts.c \
|
10 | pci.c
|
11 |
|
12 | ASRCS=\
|
13 | start.S\
|
14 | exceptions.S
|
15 |
|
16 | SRCS=$(ASRCS) $(CSRCS)
|
17 | COBJS=$(patsubst %.c,%.o,$(CSRCS))
|
18 | AOBJS=$(patsubst %.S,%.o,$(ASRCS))
|
19 | OBJS=$(COBJS) $(AOBJS)
|
20 |
|
21 | # flag targets
|
22 | target1/$(EXE): MACHINE=MACHINE_TARGET1
|
23 | target2/$(EXE): MACHINE=MACHINE_TARGET2
|
24 | target3/$(EXE): MACHINE=MACHINE_TARGET3
|
25 |
|
26 | #
|
27 | # define pattern rules for object files
|
28 | #
|
29 | define CC_TEMPLATE
|
30 | $(1)/objs/%.o:%.c
|
31 | $(CC) $$(CFLAGS) -D$$(MACHINE) $(INCLUDE) -c $$< -o $$@
|
32 |
|
33 | $(1)/objs/%.o:%.S
|
34 | $(CC) $$(CFLAGS) $(INCLUDE) -c $$< -o $$@
|
35 | endef
|
36 | $(foreach DIR,$(TRGTDIRS),$(eval $(call CC_TEMPLATE,$(DIR))))
|
37 |
|
38 | #
|
39 | # define pattern rules for binaries
|
40 | #
|
41 | define EX_TEMPLATE
|
42 | # pattern rule for flash targets
|
43 | $(1)_MAPFILE=$(1)/$$(basename $$(EXE)).map
|
44 | $(1)/$$(EXE): $(LDCSRC)
|
45 | $(CPP) $(INCLUDE) -DOBJDIR=$(1)/objs -P -DFORMAT_ELF=$(FORMAT_ELF) -D$$(MACHINE) $(LDCSRC) -o $(1)/$$(LDCFILE)
|
46 | $(LD) --oformat $$(FORMAT) -Map $$($(1)_MAPFILE) --cref -T $(1)/$$(LDCFILE) -o $$@
|
47 | $(OBJCOPY) -O srec $$@ $$(basename $$@).s19
|
48 | endif
|
49 | endef
|
50 | $(foreach DIR,$(TRGTDIRS),$(eval $(call EX_TEMPLATE,$(DIR))))
|
Die Idee ist, daß die Objekte und Executables in für jedes Ziel
getrennten, ansonsten aber (strukturell) identischen Verzeichnissen
abgelegt werden. Die Templates erzeugen für jedes dieser
Zielverzeichnisse individuelle Regeln, die abhängig vom Target (s.
Definition von $(MACHINE) bei "flag targets") unterschiedliche
Präprozessor-Definitionen enthalten können.
[edit: da war noch ein Fehler drin]