]> git.sur5r.net Git - cc65/blob - libsrc/Makefile
a91cc73f4d781b4e09f9fe37d5a52daba139c861
[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 = apple2    \
14           apple2enh \
15           atari     \
16           atmos     \
17           $(CBMS)   \
18           $(GEOS)   \
19           lynx      \
20           nes       \
21           sim6502   \
22           sim65c02  \
23           supervision
24
25 DRVTYPES = emd \
26            joy \
27            mou \
28            ser \
29            tgi
30
31 # Every target requires its individual vpath setting but the vpath directive
32 # acts globally. Therefore each target is built in a separate make instance.
33
34 ifeq ($(words $(MAKECMDGOALS)),1)
35   ifeq ($(MAKECMDGOALS),$(filter $(MAKECMDGOALS),$(TARGETS)))
36     TARGET = $(MAKECMDGOALS)
37   endif
38 endif
39
40 DIRLIST = $(strip $(foreach dir,$1,$(wildcard $(dir))))
41
42 ifeq ($(shell echo),)
43   MKDIR = mkdir -p $1
44   RMDIR = $(RM) -r $1
45 else
46   MKDIR = mkdir $(subst /,\,$1)
47   RMDIR = $(if $(DIRLIST),rmdir /s /q $(subst /,\,$(DIRLIST)))
48 endif
49
50 .SUFFIXES:
51
52 .PHONY: all lib $(TARGETS) mostlyclean clean
53
54 ifndef TARGET
55
56 all lib: $(TARGETS)
57
58 $(TARGETS):
59         @$(MAKE) --no-print-directory $@
60
61 mostlyclean:
62         $(call RMDIR,../wrk)
63
64 clean:
65         $(call RMDIR,../wrk ../lib ../targetutil $(addprefix ../,$(DRVTYPES)))
66
67 else # TARGET
68
69 CFLAGS += -Osir -W error
70
71 EXTZP = cbm510 \
72         cbm610 \
73         lynx
74
75 MKINC = $(GEOS) \
76         atari   \
77         nes
78
79 TARGETUTIL = apple2 \
80              geos-apple
81
82 GEOSDIRS = common      \
83            conio       \
84            disk        \
85            dlgbox      \
86            file        \
87            graph       \
88            memory      \
89            menuicon    \
90            mousesprite \
91            process     \
92            runtime     \
93            system
94
95 ifeq ($(TARGET),apple2enh)
96   OBJPFX = a2
97   DRVPFX = a2e
98   SRCDIR = apple2
99 else ifeq ($(TARGET),sim65c02)
100   SRCDIR = sim6502
101 else
102   SRCDIR = $(TARGET)
103 endif
104
105 SRCDIRS = $(SRCDIR)
106
107 ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
108   SRCDIRS += cbm
109 endif
110
111 ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
112   SRCDIRS += $(addprefix $(TARGET)/,  $(GEOSDIRS))
113   SRCDIRS += $(addprefix geos-common/,$(GEOSDIRS))
114 endif
115
116 SRCDIRS += common   \
117            conio    \
118            dbg      \
119            em       \
120            joystick \
121            mouse    \
122            runtime  \
123            serial   \
124            tgi      \
125            zlib
126
127 vpath %.s $(SRCDIRS)
128 vpath %.c $(SRCDIRS)
129
130 OBJS := $(patsubst %.s,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.s)))
131 OBJS += $(patsubst %.c,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)))
132
133 OBJS := $(addprefix ../wrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
134
135 DEPS = $(OBJS:.o=.d)
136
137 EXTRA_SRCPAT = $(SRCDIR)/extra/%.s
138 EXTRA_OBJPAT = ../lib/$(TARGET)-%.o
139 EXTRA_OBJS := $(patsubst $(EXTRA_SRCPAT),$(EXTRA_OBJPAT),$(wildcard $(SRCDIR)/extra/*.s))
140
141 ZPOBJ = ../wrk/$(TARGET)/zeropage.o
142 ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
143   ZPOBJ += ../wrk/$(TARGET)/extzp.o
144 endif
145
146 ifeq ($(SRCDIR),$(filter $(SRCDIR),$(MKINC)))
147   include $(SRCDIR)/Makefile.inc
148 endif
149
150 ifeq ($(SRCDIR),$(filter $(SRCDIR),$(TARGETUTIL)))
151   include $(SRCDIR)/targetutil/Makefile.inc
152 endif
153
154 ##########
155
156 define DRVTYPE_template
157
158 $1_SRCDIR = $$(SRCDIR)/$1
159 $1_OBJDIR = ../wrk/$$(TARGET)/$1
160 $1_DRVDIR = ../$1
161
162 $1_OBJPAT = $$($1_OBJDIR)/$$(OBJPFX)%.o
163 $1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1
164 $1_STCPAT = ../wrk/$$(TARGET)/$$(DRVPFX)%-$1.o
165
166 $1_OBJS := $$(patsubst $$($1_SRCDIR)/%.s,$$($1_OBJDIR)/%.o,$$(wildcard $$($1_SRCDIR)/*.s))
167
168 $1_DRVS = $$(patsubst $$($1_OBJPAT),$$($1_DRVPAT),$$($1_OBJS))
169
170 $1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS))
171
172 $$($1_OBJS): | $$($1_OBJDIR)
173
174 $$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR)
175         @echo $$(TARGET) - $$(@F)
176         @$$(LD) -o $$@ -t module $$^
177
178 $$($1_OBJDIR) $$($1_DRVDIR):
179         @$$(call MKDIR,$$@)
180
181 $(TARGET): $$($1_DRVS)
182
183 $$($1_STCPAT): $$($1_DRVPAT)
184         @echo $$(TARGET) - $$(<F)
185         @$$(CO) -o $$(@:.o=.s) --code-label _$$(subst -,_,$$(subst .,_,$$(<F))) $$<
186         @$$(CA) -t $$(TARGET) -o $$@ $$(@:.o=.s)
187
188 OBJS += $$($1_STCS)
189
190 DEPS += $$($1_OBJS:.o=.d)
191
192 endef
193
194 ##########
195
196 $(foreach drvtype,$(DRVTYPES),$(eval $(call DRVTYPE_template,$(drvtype))))
197
198 AR := $(if $(wildcard ../bin/ar65*),../bin/ar65,ar65)
199 CA := $(if $(wildcard ../bin/ca65*),../bin/ca65,ca65)
200 CC := $(if $(wildcard ../bin/cc65*),../bin/cc65,cc65)
201 CO := $(if $(wildcard ../bin/co65*),../bin/co65,co65)
202 LD := $(if $(wildcard ../bin/ld65*),../bin/ld65,ld65)
203
204 ##########
205
206 define ASSEMBLE_recipe
207
208 $(if $(TRAVIS),,@echo $(TARGET) - $<)
209 @$(CA) -t $(TARGET) $(AFLAGS) --create-dep $(@:.o=.d) -o $@ $<
210
211 endef
212
213 ##########
214
215 define COMPILE_recipe
216
217 $(if $(TRAVIS),,@echo $(TARGET) - $<)
218 @$(CC) -t $(TARGET) $(CFLAGS) --create-dep $(@:.o=.d) --dep-target $@ -o $(@:.o=.s) $<
219 @$(CA) -t $(TARGET) -o $@ $(@:.o=.s)
220
221 endef
222
223 ##########
224
225 ../wrk/$(TARGET)/%.o: %.s | ../wrk/$(TARGET)
226         $(ASSEMBLE_recipe)
227
228 ../wrk/$(TARGET)/%.o: %.c | ../wrk/$(TARGET)
229         $(COMPILE_recipe)
230
231 $(EXTRA_OBJPAT): $(EXTRA_SRCPAT) | ../lib
232         @echo $(TARGET) - $(@F)
233         @$(CA) -t $(TARGET) $(AFLAGS) -o $@ $<
234
235 ../lib/$(TARGET).lib: $(OBJS) | ../lib
236         $(AR) a $@ $?
237
238 ../wrk/$(TARGET) ../lib ../targetutil:
239         @$(call MKDIR,$@)
240
241 $(TARGET): $(EXTRA_OBJS) ../lib/$(TARGET).lib
242
243 -include $(DEPS)
244
245 endif # TARGET