diff --git a/Makefile b/Makefile index e0e2aaa8..a989e034 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,14 @@ DEFAULT_CONFIG_LOCATION = 454656 CONFIG_LOCATION = 458752 HTML_LOCATION = 262144 +# Startup configuration embedded in the image. Override it to build a specific +# machine with its own configuration: make MACHINE= CONFIG= +CONFIG ?= config.txt + +# Startup configuration embedded in the image. Override it to build a specific +# machine with its own configuration: make MACHINE= CONFIG= +CONFIG ?= config.txt + SDCC_PREFIX = toolchain/sdcc-$(shell cat sdcc/* | cksum | cut -d' ' -f1) ifeq ($(origin CC),default) SDCC = $(SDCC_PREFIX)/bin/sdcc @@ -46,6 +54,7 @@ ifndef BUILDDIR BUILDDIR = output/$(MACHINE) endif +CONFIG_STAMP := $(BUILDDIR)/.config VERSION_HEADER := version.h GIT_VERSION := $(shell git rev-parse --short HEAD) @@ -68,9 +77,10 @@ BUILD_DATE := $(shell date -u -d @$(SOURCE_DATE_EPOCH) +"%Y-%m-%d %H:%M:%S" 2>/d || date -u -r $(SOURCE_DATE_EPOCH) +"%Y-%m-%d %H:%M:%S") endif -# $(MACHINE_SRC) is listed here so an unknown $MACHINE fails before anything else -# is built, including the tools/ subdirectory. -all: create_build_dir $(VERSION_HEADER) $(MACHINE_SRC) $(SUBDIRS) $(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin +# $(MACHINE_SRC) and $(CONFIG) are listed here so an unknown $MACHINE or a +# missing config file fails before anything else is built, including the tools/ +# subdirectory. +all: create_build_dir $(VERSION_HEADER) $(MACHINE_SRC) $(CONFIG) $(SUBDIRS) $(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin bank_size: tools/bank_occupancy.sh "$(MACHINE)" @@ -91,6 +101,12 @@ $(MACHINE_SRC): @echo " Example: make MACHINE=KP_9000_6XHML_X2" >&2 @false +# Fail with a clear message when CONFIG names a file that does not exist. +$(CONFIG): + @echo "ERROR: CONFIG='$(CONFIG)' does not exist." >&2 + @echo " Point CONFIG at a configuration file, or omit it to use config.txt." >&2 + @false + # Keep the per-machine definition in first position to fail immediately on an # invalid $MACHINE value SRCS = \ @@ -209,6 +225,12 @@ FORCE: $(CCFLAGS_STAMP): FORCE | create_build_dir @echo '$(CC_FLAGS)' | cmp -s - $@ 2>/dev/null || echo '$(CC_FLAGS)' > $@ +# The same for $(CONFIG): its path is stamped so switching to a config file +# older than the image still rebuilds it, while $(CONFIG) itself as a normal +# prerequisite covers edits to the selected file. +$(CONFIG_STAMP): FORCE | create_build_dir + @echo '$(CONFIG)' | cmp -s - $@ 2>/dev/null || echo '$(CONFIG)' > $@ + $(BUILDDIR)/%.rel: %.c $(CCFLAGS_STAMP) | create_build_dir html_data.h $(CC) -MMD $(CC_FLAGS) -o $@ -c $< @@ -222,11 +244,11 @@ $(BUILDDIR)/rtlplayground.ihx: $(OBJS) $(BUILDDIR)/crtbank.rel $(BUILDDIR)/crc16 $(BUILDDIR)/rtlplayground.img: $(BUILDDIR)/rtlplayground.ihx objcopy --input-target=ihex -O binary $< $@ -$(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin: $(BUILDDIR)/rtlplayground.img | tools +$(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin: $(BUILDDIR)/rtlplayground.img $(CONFIG) $(CONFIG_STAMP) | tools if [ -e $@ ]; then rm $@; fi - tools/$(BUILDDIR)/imagebuilder -i $^ $@ - tools/$(BUILDDIR)/fileadder -a $(DEFAULT_CONFIG_LOCATION) -s $(IMAGESIZE) -d config.txt $@ - tools/$(BUILDDIR)/fileadder -a $(CONFIG_LOCATION) -s $(IMAGESIZE) -d config.txt $@ + tools/$(BUILDDIR)/imagebuilder -i $(BUILDDIR)/rtlplayground.img $@ + tools/$(BUILDDIR)/fileadder -a $(DEFAULT_CONFIG_LOCATION) -s $(IMAGESIZE) -d "$(CONFIG)" $@ + tools/$(BUILDDIR)/fileadder -a $(CONFIG_LOCATION) -s $(IMAGESIZE) -d "$(CONFIG)" $@ tools/$(BUILDDIR)/fileadder -a $(HTML_LOCATION) -s $(IMAGESIZE) -z -d $(HTML_MIN) -b BANK1 $@ tools/$(BUILDDIR)/crc_calculator -u $@ ln -sf $(MACHINE)/rtlplayground-$(FILENAME_EXTENSION).bin $(BUILDDIR)/../rtlplayground.bin diff --git a/README.md b/README.md index 25c0a02d..0deddc6f 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,13 @@ The name selects the board definition `machine/.c`; `make` without a `MACHINE` value stops with an error listing what is expected. If your board is not in the list yet, see [Adding a new device](doc/adding-a-device.md). +To embed a machine-specific startup configuration, pass `CONFIG`: +``` +make MACHINE=DEFAULT_8C_1SFP CONFIG=configs/DEFAULT_8C_1SFP.txt +``` +`CONFIG` defaults to `config.txt`; the selected file is embedded in the image +and changing it triggers a rebuild. + > [!TIP] > You can write configuration parameters in config.txt (see below) in order your switch to get > straight at the first boot, a correct IP configuration.