1ifneq ($(shell echo),)
2  CMD_EXE = 1
3endif
4
5PROGS = ar65     \
6        ca65     \
7        cc65     \
8        chrcvt65 \
9        cl65     \
10        co65     \
11        da65     \
12        grc65    \
13        ld65     \
14        od65     \
15        sim65    \
16        sp65
17
18.PHONY: all mostlyclean clean install zip avail unavail bin $(PROGS)
19
20.SUFFIXES:
21
22bindir  := $(PREFIX)/bin
23datadir := $(if $(PREFIX),$(PREFIX)/share/cc65,$(abspath ..))
24
25CA65_INC = $(datadir)/asminc
26CC65_INC = $(datadir)/include
27CL65_TGT = $(datadir)/target
28LD65_LIB = $(datadir)/lib
29LD65_OBJ = $(datadir)/lib
30LD65_CFG = $(datadir)/cfg
31
32ifdef CMD_EXE
33  NULLDEV = nul:
34  DIRLIST = $(strip $(foreach dir,$1,$(wildcard $(dir))))
35  MKDIR = mkdir $(subst /,\,$1)
36  RMDIR = $(if $(DIRLIST),rmdir /s /q $(subst /,\,$(DIRLIST)))
37else
38  NULLDEV = /dev/null
39  MKDIR = mkdir -p $1
40  RMDIR = $(RM) -r $1
41endif
42
43#CC = $(CROSS_COMPILE)gcc
44AR = $(CROSS_COMPILE)ar
45
46ifdef CROSS_COMPILE
47  $(info CC: $(CC))
48  $(info AR: $(AR))
49endif
50
51ifdef USER_CFLAGS
52  $(info USER_CFLAGS: $(USER_CFLAGS))
53endif
54
55ifndef BUILD_ID
56  BUILD_ID := Git $(shell git rev-parse --short HEAD 2>$(NULLDEV) || svnversion 2>$(NULLDEV))
57  ifneq ($(words $(BUILD_ID)),2)
58    BUILD_ID := N/A
59  endif
60endif
61$(info BUILD_ID: $(BUILD_ID))
62
63CFLAGS += -MMD -MP -O3 -I common \
64          -Wall -Wextra -Wno-char-subscripts $(USER_CFLAGS) \
65          -DCA65_INC="$(CA65_INC)" -DCC65_INC="$(CC65_INC)" -DCL65_TGT="$(CL65_TGT)" \
66          -DLD65_LIB="$(LD65_LIB)" -DLD65_OBJ="$(LD65_OBJ)" -DLD65_CFG="$(LD65_CFG)" \
67          -DBUILD_ID="$(BUILD_ID)"
68
69LDLIBS += -lm
70
71ifdef CMD_EXE
72  EXE_SUFFIX=.exe
73endif
74
75ifdef CROSS_COMPILE
76  EXE_SUFFIX=.exe
77endif
78
79all bin: $(PROGS)
80
81mostlyclean:
82	$(call RMDIR,../wrk)
83
84clean:
85	$(call RMDIR,../wrk ../bin)
86
87ifdef CMD_EXE
88
89install avail unavail:
90
91else # CMD_EXE
92
93INSTALL = install
94
95define AVAIL_recipe
96
97ln -s $(abspath ../bin/$(prog)) /usr/local/bin/$(prog)
98
99endef # AVAIL_recipe
100
101define UNAVAIL_recipe
102
103$(RM) /usr/local/bin/$(prog)
104
105endef # UNAVAIL_recipe
106
107install:
108	$(if $(PREFIX),,$(error variable "PREFIX" must be set))
109	$(INSTALL) -d $(DESTDIR)$(bindir)
110	$(INSTALL) ../bin/* $(DESTDIR)$(bindir)
111
112avail:
113	$(foreach prog,$(PROGS),$(AVAIL_recipe))
114
115unavail:
116	$(foreach prog,$(PROGS),$(UNAVAIL_recipe))
117
118endif # CMD_EXE
119
120zip:
121	@cd .. && zip cc65 bin/*
122
123define OBJS_template
124
125$1_OBJS := $$(patsubst %.c,../wrk/%.o,$$(wildcard $1/*.c))
126
127$$($1_OBJS): | ../wrk/$1
128
129../wrk/$1:
130	@$$(call MKDIR,$$@)
131
132DEPS += $$($1_OBJS:.o=.d)
133
134endef # OBJS_template
135
136define PROG_template
137
138$$(eval $$(call OBJS_template,$1))
139
140../bin/$1$(EXE_SUFFIX): $$($1_OBJS) ../wrk/common/common.a | ../bin
141	$$(CC) $$(LDFLAGS) -o $$@ $$^ $$(LDLIBS)
142
143$1: ../bin/$1$(EXE_SUFFIX)
144
145endef # PROG_template
146
147../wrk/%.o: %.c
148	@echo $<
149	@$(CC) -c $(CFLAGS) -o $@ $<
150
151../bin:
152	@$(call MKDIR,$@)
153
154$(eval $(call OBJS_template,common))
155
156../wrk/common/common.a: $(common_OBJS)
157	$(AR) r $@ $?
158
159$(foreach prog,$(PROGS),$(eval $(call PROG_template,$(prog))))
160
161-include $(DEPS)
162