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