mirror of
https://github.com/cc65/cc65.git
synced 2024-09-07 09:54:35 +00:00
Up to now static drivers were created via co65 from dynamic drivers. However there was an issue with that approach: The dynamic drivers are "o65 simple files" which obligates that they start with the 'code' segment. However dynamic drivers need to start with the module header - which is written to. For dynamic drivers this isn't more than a conceptual issue because they are always contain a 'data' segment and may therefore only be loaded into writable memory. However when dynamic drivers are converted to static drivers using co65 then that issue becomes a real problem as then the 'code' segment may end up in non-writable memory - and thus writing to the module header fails. Instead of changing the way dynamic drivers work I opted to rather make static driver creation totally independent from dynamic drivers. This allows to place the module header in the 'data' segment (see 'module.mac').
291 lines
6.2 KiB
Makefile
291 lines
6.2 KiB
Makefile
ifneq ($(shell echo),)
|
|
CMD_EXE = 1
|
|
endif
|
|
|
|
CBMS = c128 \
|
|
c16 \
|
|
c64 \
|
|
cbm510 \
|
|
cbm610 \
|
|
pet \
|
|
plus4 \
|
|
vic20
|
|
|
|
GEOS = geos-apple \
|
|
geos-cbm
|
|
|
|
TARGETS = apple2 \
|
|
apple2enh \
|
|
atari \
|
|
atarixl \
|
|
atari5200 \
|
|
atmos \
|
|
$(CBMS) \
|
|
$(GEOS) \
|
|
lynx \
|
|
nes \
|
|
sim6502 \
|
|
sim65c02 \
|
|
supervision
|
|
|
|
DRVTYPES = emd \
|
|
joy \
|
|
mou \
|
|
ser \
|
|
tgi
|
|
|
|
OUTPUTDIRS := lib \
|
|
$(DRVTYPES) \
|
|
targetutil \
|
|
asminc \
|
|
cfg \
|
|
include \
|
|
$(subst ../,,$(filter-out $(wildcard ../include/*.*),$(wildcard ../include/*)))
|
|
|
|
.PHONY: all mostlyclean clean install zip lib $(TARGETS)
|
|
|
|
.SUFFIXES:
|
|
|
|
ifdef CMD_EXE
|
|
DIRLIST = $(strip $(foreach dir,$1,$(wildcard $(dir))))
|
|
MKDIR = mkdir $(subst /,\,$1)
|
|
RMDIR = $(if $(DIRLIST),rmdir /s /q $(subst /,\,$(DIRLIST)))
|
|
else
|
|
MKDIR = mkdir -p $1
|
|
RMDIR = $(RM) -r $1
|
|
endif
|
|
|
|
# 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
|
|
|
|
ifndef TARGET
|
|
|
|
datadir = $(prefix)/share/cc65
|
|
|
|
all lib: $(TARGETS)
|
|
|
|
mostlyclean:
|
|
$(call RMDIR,../libwrk)
|
|
|
|
clean:
|
|
$(call RMDIR,../libwrk ../lib ../targetutil $(addprefix ../,$(DRVTYPES)))
|
|
|
|
ifdef CMD_EXE
|
|
|
|
install:
|
|
|
|
else # CMD_EXE
|
|
|
|
INSTALL = install
|
|
|
|
define INSTALL_recipe
|
|
|
|
$(if $(prefix),,$(error variable `prefix' must be set))
|
|
$(INSTALL) -d $(DESTDIR)$(datadir)/$(dir)
|
|
$(INSTALL) -m644 ../$(dir)/*.* $(DESTDIR)$(datadir)/$(dir)
|
|
|
|
endef # INSTALL_recipe
|
|
|
|
install:
|
|
$(foreach dir,$(OUTPUTDIRS),$(INSTALL_recipe))
|
|
|
|
endif # CMD_EXE
|
|
|
|
define ZIP_recipe
|
|
|
|
@cd .. && zip cc65 $(dir)/*.*
|
|
|
|
endef # ZIP_recipe
|
|
|
|
zip:
|
|
$(foreach dir,$(OUTPUTDIRS),$(ZIP_recipe))
|
|
|
|
$(TARGETS):
|
|
@$(MAKE) --no-print-directory $@
|
|
|
|
else # TARGET
|
|
|
|
CA65FLAGS =
|
|
CC65FLAGS = -Or -W error
|
|
|
|
EXTZP = cbm510 \
|
|
cbm610 \
|
|
lynx
|
|
|
|
MKINC = $(GEOS) \
|
|
atari \
|
|
atarixl \
|
|
nes
|
|
|
|
TARGETUTIL = apple2 \
|
|
apple2enh \
|
|
atari \
|
|
geos-apple
|
|
|
|
GEOSDIRS = common \
|
|
conio \
|
|
disk \
|
|
dlgbox \
|
|
file \
|
|
graph \
|
|
memory \
|
|
menuicon \
|
|
mousesprite \
|
|
process \
|
|
runtime \
|
|
system
|
|
|
|
ifeq ($(TARGET),apple2enh)
|
|
SRCDIR = apple2
|
|
OBJPFX = a2
|
|
DRVPFX = a2e
|
|
else ifeq ($(TARGET),atarixl)
|
|
SRCDIR = atari
|
|
OBJPFX = atr
|
|
DRVPFX = atrx
|
|
else ifeq ($(TARGET),sim65c02)
|
|
SRCDIR = sim6502
|
|
else
|
|
SRCDIR = $(TARGET)
|
|
endif
|
|
|
|
SRCDIRS = $(SRCDIR)
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(CBMS)))
|
|
SRCDIRS += cbm
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(GEOS)))
|
|
SRCDIRS += $(addprefix $(TARGET)/, $(GEOSDIRS))
|
|
SRCDIRS += $(addprefix geos-common/,$(GEOSDIRS))
|
|
endif
|
|
|
|
SRCDIRS += common \
|
|
conio \
|
|
dbg \
|
|
em \
|
|
joystick \
|
|
mouse \
|
|
runtime \
|
|
serial \
|
|
tgi \
|
|
zlib
|
|
|
|
vpath %.s $(SRCDIRS)
|
|
vpath %.c $(SRCDIRS)
|
|
|
|
OBJS := $(patsubst %.s,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.s)))
|
|
OBJS += $(patsubst %.c,%.o,$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)))
|
|
|
|
OBJS := $(addprefix ../libwrk/$(TARGET)/,$(sort $(notdir $(OBJS))))
|
|
|
|
DEPS = $(OBJS:.o=.d)
|
|
|
|
EXTRA_SRCPAT = $(SRCDIR)/extra/%.s
|
|
EXTRA_OBJPAT = ../lib/$(TARGET)-%.o
|
|
EXTRA_OBJS := $(patsubst $(EXTRA_SRCPAT),$(EXTRA_OBJPAT),$(wildcard $(SRCDIR)/extra/*.s))
|
|
|
|
ZPOBJ = ../libwrk/$(TARGET)/zeropage.o
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(EXTZP)))
|
|
ZPOBJ += ../libwrk/$(TARGET)/extzp.o
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(MKINC)))
|
|
include $(SRCDIR)/Makefile.inc
|
|
endif
|
|
|
|
ifeq ($(TARGET),$(filter $(TARGET),$(TARGETUTIL)))
|
|
include $(SRCDIR)/targetutil/Makefile.inc
|
|
endif
|
|
|
|
define DRVTYPE_template
|
|
|
|
$1_SRCDIR = $$(SRCDIR)/$1
|
|
$1_STCDIR = ../libwrk/$$(TARGET)
|
|
$1_DYNDIR = ../libwrk/$$(TARGET)/$1
|
|
$1_DRVDIR = ../$1
|
|
|
|
$1_SRCPAT = $$($1_SRCDIR)/$$(OBJPFX)%.s
|
|
$1_STCPAT = $$($1_STCDIR)/$$(OBJPFX)%-$1.o
|
|
$1_DYNPAT = $$($1_DYNDIR)/$$(OBJPFX)%.o
|
|
$1_DRVPAT = $$($1_DRVDIR)/$$(DRVPFX)%.$1
|
|
|
|
$1_SRCS := $$(wildcard $$($1_SRCDIR)/*.s)
|
|
$1_STCS = $$(patsubst $$($1_SRCPAT),$$($1_STCPAT),$$($1_SRCS))
|
|
$1_DYNS = $$(patsubst $$($1_SRCPAT),$$($1_DYNPAT),$$($1_SRCS))
|
|
$1_DRVS = $$(patsubst $$($1_DYNPAT),$$($1_DRVPAT),$$($1_DYNS))
|
|
|
|
$$($1_STCPAT): $$($1_SRCPAT)
|
|
@echo $$(TARGET) - $$< - static
|
|
@$$(CA65) -t $$(TARGET) -D DYN_DRV=0 $$(CA65FLAGS) --create-dep $$(@:.o=.d) -o $$@ $$<
|
|
|
|
OBJS += $$($1_STCS)
|
|
DEPS += $$($1_STCS:.o=.d)
|
|
|
|
$$($1_DYNS): | $$($1_DYNDIR)
|
|
|
|
$$($1_DRVPAT): $$($1_DYNPAT) $$(ZPOBJ) | $$($1_DRVDIR)
|
|
@echo $$(TARGET) - $$(<F)
|
|
@$$(LD65) -o $$@ -t module $$^
|
|
|
|
$$($1_DYNDIR) $$($1_DRVDIR):
|
|
@$$(call MKDIR,$$@)
|
|
|
|
$(TARGET): $$($1_DRVS)
|
|
|
|
DEPS += $$($1_DYNS:.o=.d)
|
|
|
|
endef # DRVTYPE_template
|
|
|
|
$(foreach drvtype,$(DRVTYPES),$(eval $(call DRVTYPE_template,$(drvtype))))
|
|
|
|
AR65 := $(if $(wildcard ../bin/ar65*),../bin/ar65,ar65)
|
|
CA65 := $(if $(wildcard ../bin/ca65*),../bin/ca65,ca65)
|
|
CC65 := $(if $(wildcard ../bin/cc65*),../bin/cc65,cc65)
|
|
LD65 := $(if $(wildcard ../bin/ld65*),../bin/ld65,ld65)
|
|
|
|
export CC65_HOME := $(abspath ..)
|
|
|
|
define ASSEMBLE_recipe
|
|
|
|
$(if $(QUIET),,@echo $(TARGET) - $<)
|
|
@$(CA65) -t $(TARGET) $(CA65FLAGS) --create-dep $(@:.o=.d) -o $@ $<
|
|
|
|
endef # ASSEMBLE_recipe
|
|
|
|
define COMPILE_recipe
|
|
|
|
$(if $(QUIET),,@echo $(TARGET) - $<)
|
|
@$(CC65) -t $(TARGET) $(CC65FLAGS) --create-dep $(@:.o=.d) --dep-target $@ -o $(@:.o=.s) $<
|
|
@$(CA65) -t $(TARGET) -o $@ $(@:.o=.s)
|
|
|
|
endef # COMPILE_recipe
|
|
|
|
../libwrk/$(TARGET)/%.o: %.s | ../libwrk/$(TARGET)
|
|
$(ASSEMBLE_recipe)
|
|
|
|
../libwrk/$(TARGET)/%.o: %.c | ../libwrk/$(TARGET)
|
|
$(COMPILE_recipe)
|
|
|
|
$(EXTRA_OBJPAT): $(EXTRA_SRCPAT) | ../lib
|
|
@echo $(TARGET) - $(<F)
|
|
@$(CA65) -t $(TARGET) $(CA65FLAGS) -o $@ $<
|
|
|
|
../lib/$(TARGET).lib: $(OBJS) | ../lib
|
|
$(AR65) a $@ $?
|
|
|
|
../libwrk/$(TARGET) ../lib ../targetutil:
|
|
@$(call MKDIR,$@)
|
|
|
|
$(TARGET): $(EXTRA_OBJS) ../lib/$(TARGET).lib
|
|
|
|
-include $(DEPS)
|
|
|
|
endif # TARGET
|