mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 04:30:10 +00:00
81e467cdc2
- No complex shell logic. - "Source file shadowing" for all targets via vpath. - Dependency handling. - True incremental build. - Don't write into source directories. - Easy cleanup by just removing 'wrk'.
204 lines
3.8 KiB
Makefile
204 lines
3.8 KiB
Makefile
CBMS = c128 \
|
|
c16 \
|
|
c64 \
|
|
cbm510 \
|
|
cbm610 \
|
|
pet \
|
|
plus4 \
|
|
vic20
|
|
|
|
GEOS = geos-apple \
|
|
geos-cbm
|
|
|
|
TARGETS = $(CBMS) \
|
|
$(GEOS) \
|
|
apple2 \
|
|
apple2enh \
|
|
atari \
|
|
atmos \
|
|
lynx \
|
|
nes \
|
|
supervision
|
|
|
|
DRVTYPES = emd \
|
|
joy \
|
|
mou \
|
|
ser \
|
|
tgi
|
|
|
|
# Every target requires its individual vpath setting but the vpath directive
|
|
# acts globally. Therefore each target is built in a separate make instance.
|
|
|
|
ifeq ($(words $(MAKECMDGOALS)),1)
|
|
ifeq ($(MAKECMDGOALS),$(filter $(MAKECMDGOALS),$(TARGETS)))
|
|
TARGET = $(MAKECMDGOALS)
|
|
endif
|
|
endif
|
|
|
|
.SUFFIXES:
|
|
|
|
.PHONY: all $(TARGETS) mostlyclean clean
|
|
|
|
ifndef TARGET
|
|
|
|
all: $(TARGETS)
|
|
|
|
$(TARGETS):
|
|
@$(MAKE) --no-print-directory $@
|
|
|
|
mostlyclean:
|
|
$(RM) -r ../wrk
|
|
|
|
clean: mostlyclean
|
|
$(RM) -r ../lib $(addprefix ../,$(DRVTYPES))
|
|
|
|
else # TARGET
|
|
|
|
CFLAGS += -t $(TARGET) -Osir --create-dep $(@:.o=.d)
|
|
|
|
EXTZP = cbm510 \
|
|
cbm610 \
|
|
lynx
|
|
|
|
MKINC = $(GEOS) \
|
|
atari \
|
|
nes
|
|
|
|
GEOSDIRS = common \
|
|
conio \
|
|
disk \
|
|
dlgbox \
|
|
file \
|
|
graph \
|
|
memory \
|
|
menuicon \
|
|
mousesprite \
|
|
process \
|
|
runtime \
|
|
system
|
|
|
|
ifeq ($(TARGET),apple2enh)
|
|
OBJPFX = a2
|
|
DRVPFX = a2e
|
|
DIRS = apple2
|
|
else
|
|
DIRS = $(TARGET)
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
|
|
DIRS += cbm
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
|
|
DIRS += $(addprefix $(TARGET)/, $(GEOSDIRS))
|
|
DIRS += $(addprefix geos-common/,$(GEOSDIRS))
|
|
endif
|
|
|
|
DIRS += common \
|
|
conio \
|
|
dbg \
|
|
em \
|
|
joystick \
|
|
mouse \
|
|
runtime \
|
|
serial \
|
|
tgi \
|
|
zlib
|
|
|
|
vpath %.s $(DIRS)
|
|
vpath %.c $(DIRS)
|
|
|
|
OBJS := $(patsubst %.s,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.s)))
|
|
OBJS += $(patsubst %.c,%.o,$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c)))
|
|
|
|
OBJS := $(addprefix ../wrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
|
|
|
|
DEPS = $(OBJS:.o=.d)
|
|
|
|
ZPOBJ = ../wrk/$(TARGET)/zeropage.o
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
|
|
ZPOBJ += ../wrk/$(TARGET)/extzp.o
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(MKINC)))
|
|
include $(TARGET)/Makefile.inc
|
|
endif
|
|
|
|
##########
|
|
|
|
define DRVTYPE_template
|
|
|
|
$1_SRCDIR = $$(firstword $$(DIRS))/$1
|
|
$1_OBJDIR = ../wrk/$$(TARGET)/$1
|
|
$1_DRVDIR = ../$1
|
|
|
|
$1_OBJPAT = $$($1_OBJDIR)/$$(OBJPFX)%.o
|
|
$1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1
|
|
$1_STCPAT = ../wrk/$$(TARGET)/$$(DRVPFX)%-$1.o
|
|
|
|
$1_OBJS := $$(patsubst $$($1_SRCDIR)/%.s,$$($1_OBJDIR)/%.o,$$(wildcard $$($1_SRCDIR)/*.s))
|
|
|
|
$1_DRVS = $$(patsubst $$($1_OBJPAT),$$($1_DRVPAT),$$($1_OBJS))
|
|
|
|
$1_STCS = $$(patsubst $$($1_DRVPAT),$$($1_STCPAT),$$($1_DRVS))
|
|
|
|
$$($1_OBJS): | $$($1_OBJDIR)
|
|
|
|
$$($1_OBJDIR):
|
|
mkdir -p $$@
|
|
|
|
$$($1_DRVPAT): $$($1_OBJPAT) $$(ZPOBJ) | $$($1_DRVDIR)
|
|
$$(LD) -o $$@ -t module $$^
|
|
|
|
$$($1_DRVDIR):
|
|
mkdir $$@
|
|
|
|
$(TARGET): $$($1_DRVS)
|
|
|
|
$$($1_STCPAT): $$($1_DRVPAT)
|
|
$$(CO) -o $$(@:.o=.s) --code-label _$$(subst -,_,$$(subst .,_,$$(<F))) $$<
|
|
$$(CC) -c -t $$(TARGET) -o $$@ $$(@:.o=.s)
|
|
|
|
OBJS += $$($1_STCS)
|
|
|
|
DEPS += $$($1_OBJS:.o=.d)
|
|
|
|
endef
|
|
|
|
##########
|
|
|
|
$(foreach drvtype,$(DRVTYPES),$(eval $(call DRVTYPE_template,$(drvtype))))
|
|
|
|
ifdef CC65_HOME
|
|
AR = $(CC65_HOME)/bin/ar65
|
|
CC = $(CC65_HOME)/bin/cl65
|
|
CO = $(CC65_HOME)/bin/co65
|
|
LD = $(CC65_HOME)/bin/ld65
|
|
else
|
|
AR = ../bin/ar65
|
|
CC = ../bin/cl65
|
|
CO = ../bin/co65
|
|
LD = ../bin/ld65
|
|
endif
|
|
|
|
../wrk/$(TARGET)/%.o: %.s | ../wrk/$(TARGET)
|
|
$(CC) -c $(CFLAGS) -o $@ $<
|
|
|
|
../wrk/$(TARGET)/%.o: %.c | ../wrk/$(TARGET)
|
|
$(CC) -c $(CFLAGS) -o $@ $<
|
|
|
|
../wrk/$(TARGET):
|
|
mkdir -p $@
|
|
|
|
../lib/$(TARGET).lib: $(OBJS) | ../lib
|
|
$(AR) a $@ $?
|
|
|
|
../lib:
|
|
mkdir $@
|
|
|
|
$(TARGET): ../lib/$(TARGET).lib
|
|
|
|
-include $(DEPS)
|
|
|
|
endif # TARGET
|