2017-11-25 23:19:35 +00:00
###############################################################################
### Generic Makefile for cc65 projects - full version with abstract options ###
### V1.3.0(w) 2010 - 2013 Oliver Schmidt & Patryk "Silver Dream !" ?ogiewa ###
###############################################################################
###############################################################################
### In order to override defaults - values can be assigned to the variables ###
###############################################################################
# Space or comma separated list of cc65 supported target platforms to build for.
# Default: c64 (lowercase!)
2019-06-16 15:40:48 +00:00
TARGETS := apple2
2017-11-25 23:19:35 +00:00
# Name of the final, single-file executable.
# Default: name of the current dir with target name appended
2017-11-30 12:00:06 +00:00
PROGRAM := AppleIISd
2017-11-25 23:19:35 +00:00
# Path(s) to additional libraries required for linking the program
# Use only if you don't want to place copies of the libraries in SRCDIR
# Default: none
LIBS :=
# Custom linker configuration file
# Use only if you don't want to place it in SRCDIR
# Default: none
2017-11-30 12:00:06 +00:00
CONFIG :=
2017-11-25 23:19:35 +00:00
# Additional C compiler flags and options.
# Default: none
CFLAGS =
# Additional assembler flags and options.
# Default: none
ASFLAGS =
# Additional linker flags and options.
# Default: none
LDFLAGS =
# Path to the directory containing C and ASM sources.
# Default: src
2017-11-30 12:00:06 +00:00
SRCDIR :=
2017-11-25 23:19:35 +00:00
# Path to the directory where object files are to be stored (inside respective target subdirectories).
# Default: obj
OBJDIR :=
# Command used to run the emulator.
# Default: depending on target platform. For default (c64) target: x64 -kernal kernal -VICIIdsize -autoload
EMUCMD :=
# Optional commands used before starting the emulation process, and after finishing it.
# Default: none
# Examples
#PREEMUCMD := osascript -e "tell application \"System Events\" to set isRunning to (name of processes) contains \"X11.bin\"" -e "if isRunning is true then tell application \"X11\" to activate"
#PREEMUCMD := osascript -e "tell application \"X11\" to activate"
#POSTEMUCMD := osascript -e "tell application \"System Events\" to tell process \"X11\" to set visible to false"
#POSTEMUCMD := osascript -e "tell application \"Terminal\" to activate"
PREEMUCMD :=
POSTEMUCMD :=
# On Windows machines VICE emulators may not be available in the PATH by default.
# In such case, please set the variable below to point to directory containing
# VICE emulators.
#VICE_HOME := "C:\Program Files\WinVICE-2.2-x86\"
VICE_HOME :=
# Options state file name. You should not need to change this, but for those
# rare cases when you feel you really need to name it differently - here you are
STATEFILE := Makefile.options
###################################################################################
#### DO NOT EDIT BELOW THIS LINE, UNLESS YOU REALLY KNOW WHAT YOU ARE DOING! ####
###################################################################################
###################################################################################
### Mapping abstract options to the actual compiler, assembler and linker flags ###
### Predefined compiler, assembler and linker flags, used with abstract options ###
### valid for 2.14.x. Consult the documentation of your cc65 version before use ###
###################################################################################
# Compiler flags used to tell the compiler to optimise for SPEED
d e f i n e _ o p t s p e e d _
CFLAGS += -Oris
e n d e f
# Compiler flags used to tell the compiler to optimise for SIZE
d e f i n e _ o p t s i z e _
CFLAGS += -Or
e n d e f
# Compiler and assembler flags for generating listings
d e f i n e _ l i s t i n g _
CFLAGS += --listing $$ ( @:.o= .lst)
ASFLAGS += --listing $$ ( @:.o= .lst)
REMOVES += $( addsuffix .lst,$( basename $( OBJECTS) ) )
e n d e f
# Linker flags for generating map file
d e f i n e _ m a p f i l e _
LDFLAGS += --mapfile $$ @.map
REMOVES += $( PROGRAM) .map
e n d e f
# Linker flags for generating VICE label file
d e f i n e _ l a b e l f i l e _
LDFLAGS += -Ln $$ @.lbl
REMOVES += $( PROGRAM) .lbl
e n d e f
# Linker flags for generating a debug file
d e f i n e _ d e b u g f i l e _
LDFLAGS += -Wl --dbgfile,$$ @.dbg
REMOVES += $( PROGRAM) .dbg
e n d e f
###############################################################################
### Defaults to be used if nothing defined in the editable sections above ###
###############################################################################
# Presume the C64 target like the cl65 compile & link utility does.
# Set TARGETS to override.
i f e q ( $( TARGETS ) , )
TARGETS := c64
e n d i f
# Presume we're in a project directory so name the program like the current
# directory. Set PROGRAM to override.
i f e q ( $( PROGRAM ) , )
PROGRAM := $( notdir $( CURDIR) )
e n d i f
# Presume the C and asm source files to be located in the subdirectory 'src'.
# Set SRCDIR to override.
i f e q ( $( SRCDIR ) , )
SRCDIR := src
e n d i f
# Presume the object and dependency files to be located in the subdirectory
# 'obj' (which will be created). Set OBJDIR to override.
i f e q ( $( OBJDIR ) , )
OBJDIR := obj
e n d i f
TARGETOBJDIR := $( OBJDIR)
# On Windows it is mandatory to have CC65_HOME set. So do not unnecessarily
# rely on cl65 being added to the PATH in this scenario.
i f d e f C C 6 5 _ H O M E
CC := $( CC65_HOME) /bin/cl65
e l s e
CC := cl65
e n d i f
# Default emulator commands and options for particular targets.
# Set EMUCMD to override.
c64_EMUCMD := $( VICE_HOME) x64 -kernal kernal -VICIIdsize -autoload
c128_EMUCMD := $( VICE_HOME) x128 -kernal kernal -VICIIdsize -autoload
vic20_EMUCMD := $( VICE_HOME) xvic -kernal kernal -VICdsize -autoload
pet_EMUCMD := $( VICE_HOME) xpet -Crtcdsize -autoload
plus4_EMUCMD := $( VICE_HOME) xplus4 -TEDdsize -autoload
# So far there is no x16 emulator in VICE (why??) so we have to use xplus4 with -memsize option
c16_EMUCMD := $( VICE_HOME) xplus4 -ramsize 16 -TEDdsize -autoload
cbm510_EMUCMD := $( VICE_HOME) xcbm2 -model 510 -VICIIdsize -autoload
cbm610_EMUCMD := $( VICE_HOME) xcbm2 -model 610 -Crtcdsize -autoload
atari_EMUCMD := atari800 -windowed -xl -pal -nopatchall -run
i f e q ( $( EMUCMD ) , )
EMUCMD = $( $( CC65TARGET) _EMUCMD)
e n d i f
###############################################################################
### The magic begins ###
###############################################################################
# The "Native Win32" GNU Make contains quite some workarounds to get along with
# cmd.exe as shell. However it does not provide means to determine that it does
# actually activate those workarounds. Especially $(SHELL) does NOT contain the
# value 'cmd.exe'. So the usual way to determine if cmd.exe is being used is to
# execute the command 'echo' without any parameters. Only cmd.exe will return a
# non-empty string - saying 'ECHO is on/off'.
#
# Many "Native Win32" programs accept '/' as directory delimiter just fine. How-
# ever the internal commands of cmd.exe generally require '\' to be used.
#
# cmd.exe has an internal command 'mkdir' that doesn't understand nor require a
# '-p' to create parent directories as needed.
#
# cmd.exe has an internal command 'del' that reports a syntax error if executed
# without any file so make sure to call it only if there's an actual argument.
i f e q ( $( shell echo ) , )
MKDIR = mkdir -p $1
RMDIR = rmdir $1
RMFILES = $( RM) $1
e l s e
MKDIR = mkdir $( subst /,\, $1 )
RMDIR = rmdir $( subst /,\, $1 )
RMFILES = $( if $1 ,del /f $( subst /,\, $1 ) )
e n d i f
COMMA := ,
SPACE := $( N/A) $( N/A)
d e f i n e N E W L I N E
e n d e f
# Note: Do not remove any of the two empty lines above !
TARGETLIST := $( subst $( COMMA) ,$( SPACE) ,$( TARGETS) )
i f e q ( $( words $ ( TARGETLIST ) ) , 1 )
# Set PROGRAM to something like 'myprog.c64'.
override PROGRAM : = $( PROGRAM ) .bin
# Set SOURCES to something like 'src/foo.c src/bar.s'.
# Use of assembler files with names ending differently than .s is deprecated!
SOURCES := $( wildcard $( SRCDIR) /*.c)
SOURCES += $( wildcard $( SRCDIR) /*.s)
SOURCES += $( wildcard $( SRCDIR) /*.asm)
SOURCES += $( wildcard $( SRCDIR) /*.a65)
# Add to SOURCES something like 'src/c64/me.c src/c64/too.s'.
# Use of assembler files with names ending differently than .s is deprecated!
SOURCES += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.c)
SOURCES += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.s)
SOURCES += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.asm)
SOURCES += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.a65)
# Set OBJECTS to something like 'obj/c64/foo.o obj/c64/bar.o'.
OBJECTS := $( addsuffix .o,$( basename $( addprefix $( TARGETOBJDIR) /,$( notdir $( SOURCES) ) ) ) )
# Set DEPENDS to something like 'obj/c64/foo.d obj/c64/bar.d'.
DEPENDS := $( OBJECTS:.o= .d)
# Add to LIBS something like 'src/foo.lib src/c64/bar.lib'.
LIBS += $( wildcard $( SRCDIR) /*.lib)
LIBS += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.lib)
# Add to CONFIG something like 'src/c64/bar.cfg src/foo.cfg'.
CONFIG += $( wildcard $( SRCDIR) /$( TARGETLIST) /*.cfg)
CONFIG += $( wildcard $( SRCDIR) /*.cfg)
# Select CONFIG file to use. Target specific configs have higher priority.
i f n e q ( $( word 2,$ ( CONFIG ) ) , )
CONFIG := $( firstword $( CONFIG) )
$( info Using config file $( CONFIG) for linking)
e n d i f
.SUFFIXES :
.PHONY : all test clean zap love
all : $( PROGRAM )
- i n c l u d e $( DEPENDS )
- i n c l u d e $( STATEFILE )
# If OPTIONS are given on the command line then save them to STATEFILE
# if (and only if) they have actually changed. But if OPTIONS are not
# given on the command line then load them from STATEFILE. Have object
# files depend on STATEFILE only if it actually exists.
i f e q ( $( origin OPTIONS ) , c o m m a n d l i n e )
ifneq ( $( OPTIONS) ,$( _OPTIONS_) )
ifeq ( $( OPTIONS) ,)
$( info Removing OPTIONS)
$( shell $( RM) $( STATEFILE) )
$( eval $( STATEFILE) :)
else
$( info Saving OPTIONS = $( OPTIONS) )
$( shell echo _OPTIONS_ = $( OPTIONS) > $( STATEFILE) )
endif
$( eval $( OBJECTS) : $( STATEFILE) )
endif
e l s e
ifeq ( $( origin _OPTIONS_) ,file)
$( info Using saved OPTIONS = $( _OPTIONS_) )
OPTIONS = $( _OPTIONS_)
$( eval $( OBJECTS) : $( STATEFILE) )
endif
e n d i f
# Transform the abstract OPTIONS to the actual cc65 options.
$( foreach o ,$ ( subst $ ( COMMA ) ,$ ( SPACE ) ,$ ( OPTIONS ) ) ,$ ( eval $ ( _ $ o_ ) ) )
# Strip potential variant suffix from the actual cc65 target.
CC65TARGET := $( firstword $( subst .,$( SPACE) ,$( TARGETLIST) ) )
# The remaining targets.
$(TARGETOBJDIR) :
$( call MKDIR,$@ )
v p a t h % . c $( SRCDIR ) / $( TARGETLIST ) $( SRCDIR )
$(TARGETOBJDIR)/%.o : %.c | $( TARGETOBJDIR )
$( CC) -t $( CC65TARGET) -c --create-dep $( @:.o= .d) $( CFLAGS) -o $@ $<
v p a t h % . s $( SRCDIR ) / $( TARGETLIST ) $( SRCDIR )
$(TARGETOBJDIR)/%.o : %.s | $( TARGETOBJDIR )
$( CC) -t $( CC65TARGET) -c --create-dep $( @:.o= .d) $( ASFLAGS) -o $@ $<
v p a t h % . a s m $( SRCDIR ) / $( TARGETLIST ) $( SRCDIR )
$(TARGETOBJDIR)/%.o : %.asm | $( TARGETOBJDIR )
$( CC) -t $( CC65TARGET) -c --create-dep $( @:.o= .d) $( ASFLAGS) -o $@ $<
v p a t h % . a 6 5 $( SRCDIR ) / $( TARGETLIST ) $( SRCDIR )
$(TARGETOBJDIR)/%.o : %.a 65 | $( TARGETOBJDIR )
$( CC) -t $( CC65TARGET) -c --create-dep $( @:.o= .d) $( ASFLAGS) -o $@ $<
$(PROGRAM) : $( CONFIG ) $( OBJECTS ) $( LIBS )
$( CC) -t $( CC65TARGET) $( LDFLAGS) -o $@ $( patsubst %.cfg,-C %.cfg,$^)
test : $( PROGRAM )
$( PREEMUCMD)
$( EMUCMD) $<
$( POSTEMUCMD)
clean :
$( call RMFILES,$( OBJECTS) )
$( call RMFILES,$( DEPENDS) )
$( call RMFILES,$( REMOVES) )
$( call RMFILES,$( PROGRAM) )
e l s e # $(words $(TARGETLIST)),1
all test clean :
$( foreach t,$( TARGETLIST) ,$( MAKE) TARGETS = $t $@ $( NEWLINE) )
e n d i f # $(words $(TARGETLIST)),1
OBJDIRLIST := $( wildcard $( OBJDIR) /*)
zap :
$( foreach o,$( OBJDIRLIST) ,-$( call RMFILES,$o /*.o $o /*.d $o /*.lst) $( NEWLINE) )
$( foreach o,$( OBJDIRLIST) ,-$( call RMDIR,$o ) $( NEWLINE) )
-$( call RMDIR,$( OBJDIR) )
-$( call RMFILES,$( basename $( PROGRAM) ) .* $( STATEFILE) )
love :
@echo "Not war, eh?"
###################################################################
### Place your additional targets in the additional Makefiles ###
### in the same directory - their names have to end with ".mk"! ###
###################################################################
- i n c l u d e * . m k