]> git.sur5r.net Git - cc65/blob - libsrc/Makefile
Replaced whole bunch for Makefiles with a single generic Makefile.
[cc65] / libsrc / Makefile
1 CBMS = c128   \
2        c16    \
3        c64    \
4        cbm510 \
5        cbm610 \
6        pet    \
7        plus4  \
8        vic20
9
10 GEOS = geos-apple \
11        geos-cbm
12
13 TARGETS = $(CBMS)   \
14           $(GEOS)   \
15           apple2    \
16           apple2enh \
17           atari     \
18           atmos     \
19           lynx      \
20           nes       \
21           supervision
22
23 DRVTYPES = emd \
24            joy \
25            mou \
26            ser \
27            tgi
28
29 # Every target requires its individual vpath setting but the vpath directive
30 # acts globally. Therefore each target is built in a separate make instance.
31
32 ifeq ($(words $(MAKECMDGOALS)),1)
33   ifeq ($(MAKECMDGOALS),$(filter $(MAKECMDGOALS),$(TARGETS)))
34     TARGET = $(MAKECMDGOALS)
35   endif
36 endif
37
38 .SUFFIXES:
39
40 .PHONY: all $(TARGETS) mostlyclean clean
41
42 ifndef TARGET
43
44 all: $(TARGETS)
45
46 $(TARGETS):
47         @$(MAKE) --no-print-directory $@
48
49 mostlyclean:
50         $(RM) -r ../wrk
51
52 clean: mostlyclean
53         $(RM) -r ../lib $(addprefix ../,$(DRVTYPES))
54
55 else # TARGET
56
57 CFLAGS += -t $(TARGET) -Osir --create-dep $(@:.o=.d)
58
59 EXTZP = cbm510 \
60         cbm610 \
61         lynx
62
63 MKINC = $(GEOS) \
64         atari   \
65         nes
66
67 GEOSDIRS = common      \
68            conio       \
69            disk        \
70            dlgbox      \
71            file        \
72            graph       \
73            memory      \
74            menuicon    \
75            mousesprite \
76            process     \
77            runtime     \
78            system
79
80 ifeq ($(TARGET),apple2enh)
81   OBJPFX = a2
82   DRVPFX = a2e
83   DIRS = apple2
84 else
85   DIRS = $(TARGET)
86 endif
87
88 ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
89   DIRS += cbm
90 endif
91
92 ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
93   DIRS += $(addprefix $(TARGET)/,  $(GEOSDIRS))
94   DIRS += $(addprefix geos-common/,$(GEOSDIRS))
95 endif
96
97 DIRS += common   \
98         conio    \
99         dbg      \
100         em       \
101         joystick \
102         mouse    \
103         runtime  \
104         serial   \
105         tgi      \
106         zlib
107
108 vpath %.s $(DIRS)
109 vpath %.c $(DIRS)
110
111 OBJS := $(patsubst %.s,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.s)))
112 OBJS += $(patsubst %.c,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c)))
113
114 OBJS := $(addprefix ../wrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
115
116 DEPS = $(OBJS:.o=.d)
117
118 ZPOBJ = ../wrk/$(TARGET)/zeropage.o
119 ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
120   ZPOBJ += ../wrk/$(TARGET)/extzp.o
121 endif
122
123 ifeq ($(TARGET),$(filter $(TARGET),$(MKINC)))
124   include $(TARGET)/Makefile.inc
125 endif
126
127 ##########
128
129 define DRVTYPE_template
130
131 $1_SRCDIR = $$(firstword $$(DIRS))/$1
132 $1_OBJDIR = ../wrk/$$(TARGET)/$1
133 $1_DRVDIR = ../$1
134
135 $1_OBJPAT = $$($1_OBJDIR)/$$(OBJPFX)%.o
136 $1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1
137 $1_STCPAT = ../wrk/$$(TARGET)/$$(DRVPFX)%-$1.o
138
139 $1_OBJS := $$(patsubst $$($1_SRCDIR)/%.s,$$($1_OBJDIR)/%.o,$$(wildcard $$($1_SRCDIR)/*.s))
140
141 $1_DRVS = $$(patsubst $$($1_OBJPAT),$$($1_DRVPAT),$$($1_OBJS))
142
143 $1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS))
144
145 $$($1_OBJS): | $$($1_OBJDIR)
146
147 $$($1_OBJDIR):
148         mkdir -p $$@
149
150 $$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR)
151         $$(LD) -o $$@ -t module $$^
152
153 $$($1_DRVDIR):
154         mkdir $$@
155
156 $(TARGET): $$($1_DRVS)
157
158 $$($1_STCPAT): $$($1_DRVPAT)
159         $$(CO) -o $$(@:.o=.s) --code-label _$$(subst -,_,$$(subst .,_,$$(<F))) $$<
160         $$(CC) -c -t $$(TARGET) -o $$@ $$(@:.o=.s)
161
162 OBJS += $$($1_STCS)
163
164 DEPS += $$($1_OBJS:.o=.d)
165
166 endef
167
168 ##########
169
170 $(foreach drvtype,$(DRVTYPES),$(eval $(call DRVTYPE_template,$(drvtype))))
171
172 ifdef CC65_HOME
173   AR = $(CC65_HOME)/bin/ar65
174   CC = $(CC65_HOME)/bin/cl65
175   CO = $(CC65_HOME)/bin/co65
176   LD = $(CC65_HOME)/bin/ld65
177 else
178   AR = ../bin/ar65
179   CC = ../bin/cl65
180   CO = ../bin/co65
181   LD = ../bin/ld65
182 endif
183
184 ../wrk/$(TARGET)/%.o: %.s | ../wrk/$(TARGET)
185         $(CC) -c $(CFLAGS) -o $@ $<
186
187 ../wrk/$(TARGET)/%.o: %.c | ../wrk/$(TARGET)
188         $(CC) -c $(CFLAGS) -o $@ $<
189
190 ../wrk/$(TARGET):
191         mkdir -p $@
192
193 ../lib/$(TARGET).lib: $(OBJS) | ../lib
194         $(AR) a $@ $?
195
196 ../lib:
197         mkdir $@
198
199 $(TARGET): ../lib/$(TARGET).lib
200
201 -include $(DEPS)
202
203 endif # TARGET