X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=samples%2FMakefile;h=601d19d76c484e293e40071e9d4b26f617dce514;hb=9439b5b64571535360ce43715ccdcbc915ed9a55;hp=abd304b143cf6c414c6366c1fb92cb62bd19ffb8;hpb=5bbf010029c4d3a844aa2339a69387efcc45f519;p=cc65 diff --git a/samples/Makefile b/samples/Makefile index abd304b14..601d19d76 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -4,10 +4,17 @@ # This Makefile requires GNU make # -# Run 'make SYS=' or set a SYS env -# var to build for another target system. +# Run 'make SYS='; or, set a SYS env. +# var. to build for another target system. SYS ?= c64 +# Just the usual way to define a variable +# containing a single space character. +SPACE := +SPACE += + +# Just the usual way to find out if we're +# using cmd.exe to execute make rules. ifneq ($(shell echo),) CMD_EXE = 1 endif @@ -35,19 +42,55 @@ else endif ifneq ($(filter disk samples.%,$(MAKECMDGOALS)),) - TARGET_PATH := $(shell $(CL) --print-target-path) + ifdef CC65_HOME + TARGET_PATH = $(CC65_HOME)/target + else + TARGET_PATH := $(if $(wildcard ../target),../target,$(shell $(CL) --print-target-path)) + endif + + # If TARGET_PATH contains spaces then it is presumed to contain escaped spaces. GNU make + # has very limited support for paths containing spaces. $(wildcard) is the only function + # that is aware of escaped spaces. However, $(wildcard) never returns paths with escaped + # spaces !!! So if it e.g. finds in a path with 2 spaces 4 files then one ends up with a + # return value consisting of 12 plain words :-(( + # + # Fortunately we can work around that behaviour here because we know that the files we + # are looking for have known extensions. So we can $(filter) the in our example above 12 + # words for file extensions so we come up with 4 path fragments. Then we remove those + # path fragments with $(notdir) from the file names. + # + # So far so good. But here we want to process files from different paths in a single + # recipe further down below and therefore want to prepend the paths to the files with + # $(addprefix). However, $(foreach) isn't aware of escaped spaces (only $(wildcard) is). + # Therefore, we need to replace the spaces with some other character temporarily in order + # to have $(foreach) generate one invocation per file. We use the character '?' for that + # purpose here, just because it is known to not be part of file names. + # + # Inside the recipe generated per file we then replace the '?' again with a space. As we + # want to be compatible with cmd.exe for execution we're not using an escaped space but + # rather double-quote the whole path. + # + # Note: The "strange" $(wildcard) further down below just serves the purpose to unescape + # spaces for cmd.exe. This could have as well been done with another $(subst). + + SUBST_TARGET_PATH := $(subst \$(SPACE),?,$(TARGET_PATH)) EMD := $(wildcard $(TARGET_PATH)/$(SYS)/drv/emd/*) MOU := $(wildcard $(TARGET_PATH)/$(SYS)/drv/mou/*) TGI := $(wildcard $(TARGET_PATH)/$(SYS)/drv/tgi/*) - # This one comes with VICE + EMD := $(addprefix $(SUBST_TARGET_PATH)/$(SYS)/drv/emd/,$(notdir $(filter %.emd,$(EMD)))) + MOU := $(addprefix $(SUBST_TARGET_PATH)/$(SYS)/drv/mou/,$(notdir $(filter %.mou,$(MOU)))) + TGI := $(addprefix $(SUBST_TARGET_PATH)/$(SYS)/drv/tgi/,$(notdir $(filter %.tgi,$(TGI)))) + + # This one comes with the VICE emulator. + # See http://vice-emu.sourceforge.net/ C1541 ?= c1541 - # For this one see http://applecommander.sourceforge.net/ + # For this one, see https://applecommander.github.io/ AC ?= ac.jar - # For this one see http://www.horus.com/~hias/atari/ + # For this one, see http://www.horus.com/~hias/atari/ DIR2ATR ?= dir2atr DISK_c64 = samples.d64 @@ -59,6 +102,8 @@ endif # -------------------------------------------------------------------------- # System-dependent settings +# For convenience, these groups and lines are sorted alphabetically, first +# by target-machine group, then by mission, then by program and sub-target. # The Apple machines need the start address adjusted when using TGI LDFLAGS_mandelbrot_apple2 = --start-addr 0x4000 @@ -66,8 +111,8 @@ LDFLAGS_mandelbrot_apple2enh = --start-addr 0x4000 LDFLAGS_tgidemo_apple2 = --start-addr 0x4000 LDFLAGS_tgidemo_apple2enh = --start-addr 0x4000 -# The Apple ][ needs the start address adjusted for the mousetest -LDFLAGS_mousetest_apple2 = --start-addr 0x4000 +# The Apple ][ needs the start address adjusted for the mousedemo +LDFLAGS_mousedemo_apple2 = --start-addr 0x4000 # The Apple machines need the end address adjusted for large programs LDFLAGS_gunzip65_apple2 = -D __HIMEM__=0xBF00 @@ -90,19 +135,23 @@ LDFLAGS_tgidemo_atarixl = --start-addr 0x4000 %: %.s .c.o: - $(CC) $(CFLAGS) -Oirs --codesize 500 -T -g -t $(SYS) $< + $(CC) $(CFLAGS) -Ors --codesize 500 -T -g -t $(SYS) $< $(AS) $(<:.c=.s) .s.o: - $(AS) $(AFLAGS) -t $(SYS) $< + $(AS) $(ASFLAGS) -t $(SYS) $< .PRECIOUS: %.o .o: - $(LD) $(LDFLAGS_$(@F)_$(SYS)) -o $@ -t $(SYS) -m $@.map $^ $(SYS).lib +ifeq ($(SYS),vic20) + $(LD) $(LDFLAGS_$(@F)_$(SYS)) $(LDFLAGS) -o $@ -C vic20-32k.cfg -m $@.map $^ $(SYS).lib +else + $(LD) $(LDFLAGS_$(@F)_$(SYS)) $(LDFLAGS) -o $@ -t $(SYS) -m $@.map $^ $(SYS).lib +endif # -------------------------------------------------------------------------- -# List of executables +# Lists of executables EXELIST_c64 = \ ascii \ @@ -111,7 +160,7 @@ EXELIST_c64 = \ gunzip65 \ hello \ mandelbrot \ - mousetest \ + mousedemo \ multdemo \ nachtm \ ovrldemo \ @@ -126,7 +175,7 @@ EXELIST_apple2 = \ gunzip65 \ hello \ mandelbrot \ - mousetest \ + mousedemo \ multdemo \ ovrldemo \ sieve \ @@ -139,7 +188,7 @@ EXELIST_atari = \ gunzip65 \ hello \ mandelbrot \ - mousetest \ + mousedemo \ multdemo \ ovrldemo \ sieve \ @@ -147,9 +196,16 @@ EXELIST_atari = \ EXELIST_atarixl = $(EXELIST_atari) -EXELIST_atari2600 = \ +EXELIST_atari2600 = \ atari2600hello +# Unlisted targets will try to build everything. +# That lets us learn what they cannot build, and what settings +# we need to use for programs that can be built and run. +ifndef EXELIST_$(SYS) +EXELIST_$(SYS) := ${patsubst %.c,%,$(wildcard *.c)} +endif + # -------------------------------------------------------------------------- # Rules to make the binaries and the disk @@ -164,10 +220,10 @@ all: # overlay file-names are shortenned to fit the Atari's 8.3-character limit. multdemo: multidemo.o - $(LD) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib + $(LD) $(LDFLAGS) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib ovrldemo: overlaydemo.o - $(LD) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib + $(LD) $(LDFLAGS) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib OVERLAYLIST := $(foreach I,1 2 3,multdemo.$I ovrldemo.$I) @@ -177,32 +233,32 @@ OVERLAYLIST := $(foreach I,1 2 3,multdemo.$I ovrldemo.$I) define D64_WRITE_recipe -$(C1541) -attach $@ -write $(file) $(notdir $(file)) >$(NULLDEV) +$(C1541) -attach $@ -write "$(subst ?,$(SPACE),$(file))" $(notdir $(file)) >$(NULLDEV) endef # D64_WRITE_recipe samples.d64: samples - @$(C1541) -format samples,AA d64 $@ >$(NULLDEV) + @$(C1541) -format samples,AA d64 $@ >$(NULLDEV) $(foreach file,$(EXELIST_$(SYS)),$(D64_WRITE_recipe)) $(foreach file,$(OVERLAYLIST),$(D64_WRITE_recipe)) $(foreach file,$(EMD) $(MOU) $(TGI),$(D64_WRITE_recipe)) # -------------------------------------------------------------------------- -# Rule to make an Apple II disk with all samples. Needs the Apple Commander -# program available at http://applecommander.sourceforge.net/ and a template -# disk named 'prodos.dsk'. +# Rule to make an Apple II disk with all samples. Needs the AppleCommander +# program, available at https://applecommander.github.io/, and a template disk +# named 'prodos.dsk'. define DSK_WRITE_BIN_recipe $(if $(findstring BF00,$(LDFLAGS_$(notdir $(file))_$(SYS))), \ - java -jar $(AC) -p $@ $(notdir $(file)).system sys <$(TARGET_PATH)/$(SYS)/util/loader.system) -java -jar $(AC) -cc65 $@ $(notdir $(file)) bin <$(file) + java -jar $(AC) -p $@ $(notdir $(file)).system sys <"$(wildcard $(TARGET_PATH)/$(SYS)/util/loader.system)") +java -jar $(AC) -as $@ $(notdir $(file)) <"$(file)" endef # DSK_WRITE_BIN_recipe define DSK_WRITE_REL_recipe -java -jar $(AC) -p $@ $(notdir $(file)) rel 0 <$(file) +java -jar $(AC) -p $@ $(notdir $(file)) rel 0 <"$(subst ?,$(SPACE),$(file))" endef # DSK_WRITE_REL_recipe @@ -219,14 +275,14 @@ samples.dsk: samples define ATR_WRITE_recipe -cp $(file) atr/$(notdir $(file)) +cp "$(subst ?,$(SPACE),$(file))" atr/$(notdir $(file)) endef # ATR_WRITE_recipe samples.atr: samples @mkdir atr - cp dos.sys atr/dos.sys - cp dup.sys atr/dup.sys + cp "dos.sys" atr/dos.sys + cp "dup.sys" atr/dup.sys @$(foreach file,$(EXELIST_$(SYS)),$(ATR_WRITE_recipe)) @$(foreach file,$(OVERLAYLIST),$(ATR_WRITE_recipe)) @$(foreach file,$(EMD) $(MOU) $(TGI),$(ATR_WRITE_recipe)) @@ -237,10 +293,10 @@ samples.atr: samples # Installation rules INSTALL = install -samplesdir = $(prefix)/share/cc65 +samplesdir = $(PREFIX)/share/cc65/samples install: - $(if $(prefix),,$(error variable `prefix' must be set)) + $(if $(PREFIX),,$(error variable `PREFIX' must be set)) $(INSTALL) -d $(DESTDIR)$(samplesdir) $(INSTALL) -d $(DESTDIR)$(samplesdir)/geos $(INSTALL) -d $(DESTDIR)$(samplesdir)/tutorial @@ -260,7 +316,7 @@ zip: # Clean-up rules mostlyclean: - @$(DEL) *.map *.o *.s 2>$(NULLDEV) + @$(DEL) *.lbl *.map *.o *.s 2>$(NULLDEV) clean: mostlyclean @$(DEL) $(EXELIST_$(SYS)) $(DISK_$(SYS)) 2>$(NULLDEV)