]> git.sur5r.net Git - cc65/blob - libsrc/Makefile
a37abc98a06c8594d6e23201795c353e9debd69a
[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 DIRLIST = $(strip $(foreach dir,$1,$(wildcard $(dir))))
39
40 ifeq ($(shell echo),)
41   MKDIR = mkdir -p $1
42   RMDIR = $(RM) -r $1
43 else
44   MKDIR = mkdir $(subst /,\,$1)
45   RMDIR = $(if $(DIRLIST),rmdir /s /q $(subst /,\,$(DIRLIST)))
46 endif
47
48 .SUFFIXES:
49
50 .PHONY: all lib $(TARGETS) mostlyclean clean
51
52 ifndef TARGET
53
54 all lib: $(TARGETS)
55
56 $(TARGETS):
57         @$(MAKE) --no-print-directory $@
58
59 mostlyclean:
60         $(call RMDIR,../wrk)
61
62 clean:
63         $(call RMDIR,../wrk ../lib $(addprefix ../,$(DRVTYPES)))
64
65 else # TARGET
66
67 CFLAGS += -Osir
68
69 EXTZP = cbm510 \
70         cbm610 \
71         lynx
72
73 MKINC = $(GEOS) \
74         atari   \
75         nes
76
77 GEOSDIRS = common      \
78            conio       \
79            disk        \
80            dlgbox      \
81            file        \
82            graph       \
83            memory      \
84            menuicon    \
85            mousesprite \
86            process     \
87            runtime     \
88            system
89
90 ifeq ($(TARGET),apple2enh)
91   OBJPFX = a2
92   DRVPFX = a2e
93   DIRS = apple2
94 else
95   DIRS = $(TARGET)
96 endif
97
98 ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
99   DIRS += cbm
100 endif
101
102 ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
103   DIRS += $(addprefix $(TARGET)/,  $(GEOSDIRS))
104   DIRS += $(addprefix geos-common/,$(GEOSDIRS))
105 endif
106
107 DIRS += common   \
108         conio    \
109         dbg      \
110         em       \
111         joystick \
112         mouse    \
113         runtime  \
114         serial   \
115         tgi      \
116         zlib
117
118 vpath %.s $(DIRS)
119 vpath %.c $(DIRS)
120
121 OBJS := $(patsubst %.s,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.s)))
122 OBJS += $(patsubst %.c,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c)))
123
124 OBJS := $(addprefix ../wrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
125
126 DEPS = $(OBJS:.o=.d)
127
128 ZPOBJ = ../wrk/$(TARGET)/zeropage.o
129 ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
130   ZPOBJ += ../wrk/$(TARGET)/extzp.o
131 endif
132
133 ifeq ($(TARGET),$(filter $(TARGET),$(MKINC)))
134   include $(TARGET)/Makefile.inc
135 endif
136
137 ##########
138
139 define DRVTYPE_template
140
141 $1_SRCDIR = $$(firstword $$(DIRS))/$1
142 $1_OBJDIR = ../wrk/$$(TARGET)/$1
143 $1_DRVDIR = ../$1
144
145 $1_OBJPAT = $$($1_OBJDIR)/$$(OBJPFX)%.o
146 $1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1
147 $1_STCPAT = ../wrk/$$(TARGET)/$$(DRVPFX)%-$1.o
148
149 $1_OBJS := $$(patsubst $$($1_SRCDIR)/%.s,$$($1_OBJDIR)/%.o,$$(wildcard $$($1_SRCDIR)/*.s))
150
151 $1_DRVS = $$(patsubst $$($1_OBJPAT),$$($1_DRVPAT),$$($1_OBJS))
152
153 $1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS))
154
155 $$($1_OBJS): | $$($1_OBJDIR)
156
157 $$($1_OBJDIR):
158         @$$(call MKDIR,$$@)
159
160 $$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR)
161         @echo $$(TARGET) - $$(@F)
162         @$$(LD) -o $$@ -t module $$^
163
164 $$($1_DRVDIR):
165         @$$(call MKDIR,$$@)
166
167 $(TARGET): $$($1_DRVS)
168
169 $$($1_STCPAT): $$($1_DRVPAT)
170         @echo $$(TARGET) - $$(<F)
171         @$$(CO) -o $$(@:.o=.s) --code-label _$$(subst -,_,$$(subst .,_,$$(<F))) $$<
172         @$$(CA) -t $$(TARGET) -o $$@ $$(@:.o=.s)
173
174 OBJS += $$($1_STCS)
175
176 DEPS += $$($1_OBJS:.o=.d)
177
178 endef
179
180 ##########
181
182 $(foreach drvtype,$(DRVTYPES),$(eval $(call DRVTYPE_template,$(drvtype))))
183
184 AR = $(if $(wildcard ../bin/ar65*),../bin/ar65,ar65)
185 CA = $(if $(wildcard ../bin/ca65*),../bin/ca65,ca65)
186 CC = $(if $(wildcard ../bin/cc65*),../bin/cc65,cc65)
187 CO = $(if $(wildcard ../bin/co65*),../bin/co65,co65)
188 LD = $(if $(wildcard ../bin/ld65*),../bin/ld65,ld65)
189
190 ../wrk/$(TARGET)/%.o: %.s | ../wrk/$(TARGET)
191         @echo $(TARGET) - $<
192         @$(CA) -t $(TARGET) $(AFLAGS) --create-dep $(@:.o=.d) -o $@ $<
193
194 ../wrk/$(TARGET)/%.o: %.c | ../wrk/$(TARGET)
195         @echo $(TARGET) - $<
196         @$(CC) -t $(TARGET) $(CFLAGS) --create-dep $(@:.o=.d) -o $(@:.o=.s) $<
197         @$(CA) -t $(TARGET) -o $@ $(@:.o=.s)
198
199 ../wrk/$(TARGET):
200         @$(call MKDIR,$@)
201
202 ../lib/$(TARGET).lib: $(OBJS) | ../lib
203         $(AR) a $@ $?
204
205 ../lib:
206         @$(call MKDIR,$@)
207
208 $(TARGET): ../lib/$(TARGET).lib
209
210 -include $(DEPS)
211
212 endif # TARGET