## ## spreadspace avr utils ## ## ## Copyright (C) 2013-2018 Christian Pointner ## ## This file is part of spreadspace avr utils. ## ## spreadspace avr utils is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## any later version. ## ## spreadspace avr utils is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with spreadspace avr utils. If not, see . ## ifndef SPREADAVR_PATH SPREADAVR_PATH := .. endif include $(SPREADAVR_PATH)/defines.mk ifndef MCU $(error Unknown board: '$(BOARD_TYPE)') endif ## project-specific objects SRC := $(OBJ:%.o=%.c) DEP := $(SRC:%.c=%.d) CXX_SRC := $(CXX_OBJ:%.o=%.cpp) CXX_DEP := $(CXX_SRC:%.cpp=%.d) OBJ_LIB := $(LIBS:%=lib-%.o) SRC_LIB := $(LIBS:%=$(LIB_DIR)/%.c) DEP_LIB := $(LIBS:%=lib-%.d) CXX_OBJ_LIB := $(CXX_LIBS:%=lib-%.o) CXX_SRC_LIB := $(CXX_LIBS:%=$(LIB_DIR)/%.cpp) CXX_DEP_LIB := $(CXX_LIBS:%=lib-%.d) .PHONY: prepare clean clean-external distclean clean-lufa clean-fastled clean-pjon clean-vusb clean-radiohead clean-rweather-crypto program erase flash reset run ELFFILE := $(NAME).elf HEXFILE := $(NAME).hex all: prepare $(HEXFILE) ## external Libs LDFLAGS += -L./ ifdef LUFA_PATH CFLAGS += -I$(LUFA_PATH) CFLAGS += -DUSES_LUFA CFLAGS += -DF_USB=$(F_USB)UL CFLAGS += -DBOARD=BOARD_$(LUFA_BOARD) CFLAGS += $(LUFA_OPTS) endif ifdef FASTLED_PATH CXXFLAGS += -I$(FASTLED_PATH) CXXFLAGS += -DUSES_FASTLED CXXFLAGS += -DARDUINO CXXFLAGS += -DNEED_CXX_BITS CXXFLAGS += $(FASTLED_OPTS) endif ifdef PJON_PATH CXXFLAGS += -I$(PJON_PATH) CXXFLAGS += -DUSES_PJON CXXFLAGS += -DARDUINO=106 CXXFLAGS += $(PJON_OPTS) endif ifdef VUSB_PATH CFLAGS += -I$(VUSB_PATH)/usbdrv CFLAGS += -I. CFLAGS += -DUSES_VUSB CFLAGS += $(VUSB_OPTS) endif ifdef RADIOHEAD_PATH CXXFLAGS += -I$(RADIOHEAD_PATH) CXXFLAGS += -DUSES_RADIOHEAD CXXFLAGS += -DRH_PLATFORM=RH_PLATFORM_GENERIC_AVR8 ifdef RWEATHER_CRYPTO_PATH CXXFLAGS += -DRH_ENABLE_ENCRYPTION_MODULE endif CXXFLAGS += $(RADIOHEAD_OPTS) endif ifdef RWEATHER_CRYPTO_PATH CXXFLAGS += -I$(RWEATHER_CRYPTO_PATH)/libraries/Crypto CXXFLAGS += -DUSES_RWEATHER_CRYPTO CXXFLAGS += $(RWEATHER_CRYPTO_OPTS) endif prepare: $(EXTERNAL_LIBS:%=build-%) clean-external: $(EXTERNAL_LIBS:%=clean-%) export build-lufa: liblufa.a liblufa.a: Makefile @echo "" @echo "****************************************************" @echo "* building external LUFA lib ($(LUFA_PATH))" @echo "" make -f $(SPREADAVR_PATH)/lufa.mk liblufa.a make -f $(SPREADAVR_PATH)/lufa.mk clean @echo "" @echo "****************************************************" clean-lufa: @echo "" @echo "****************************************************" @echo "cleaning external LUFA lib ($(LUFA_PATH))" @echo "" make -f $(SPREADAVR_PATH)/lufa.mk clean rm -f liblufa.a @echo "" @echo "****************************************************" build-fastled: libfastled.a libfastled.a: Makefile @echo "" @echo "****************************************************" @echo "building external FastLED lib ($(FASTLED_PATH))" @echo "" make -f $(SPREADAVR_PATH)/fastled.mk libfastled.a make -f $(SPREADAVR_PATH)/fastled.mk clean @echo "" @echo "****************************************************" clean-fastled: @echo "" @echo "****************************************************" @echo "cleaning external FastLED lib ($(FASTLED_PATH))" @echo "" make -f $(SPREADAVR_PATH)/fastled.mk clean rm -f libfastled.a @echo "" @echo "****************************************************" build-pjon: libpjon.a libpjon.a: Makefile @echo "" @echo "****************************************************" @echo "building external PJON lib ($(PJON_PATH))" @echo "" make -f $(SPREADAVR_PATH)/pjon.mk libpjon.a make -f $(SPREADAVR_PATH)/pjon.mk clean @echo "" @echo "****************************************************" clean-pjon: @echo "" @echo "****************************************************" @echo "cleaning external PJON lib ($(PJON_PATH))" @echo "" make -f $(SPREADAVR_PATH)/pjon.mk clean rm -f libpjon.a @echo "" @echo "****************************************************" build-vusb: libvusb.a libvusb.a: Makefile @echo "" @echo "****************************************************" @echo "building external V-USB lib ($(VUSB_PATH))" @echo "" make -f $(SPREADAVR_PATH)/vusb.mk libvusb.a make -f $(SPREADAVR_PATH)/vusb.mk clean @echo "" @echo "****************************************************" clean-vusb: @echo "" @echo "****************************************************" @echo "cleaning external V-USB lib ($(VUSB_PATH))" @echo "" make -f $(SPREADAVR_PATH)/vusb.mk clean rm -f libvusb.a @echo "" @echo "****************************************************" build-radiohead: libradiohead.a libradiohead.a: Makefile @echo "" @echo "****************************************************" @echo "building external RadioHead lib ($(RADIOHEAD_PATH))" @echo "" @echo "** #######################################################################" @echo "** ## DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER ##" @echo "** ## ##" @echo "** ## The radiohead lib is not working properly at the moment. ##" @echo "** ## You have been warned!! ##" @echo "** ## ##" @echo "** ## DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER DANGER ##" @echo "** #######################################################################" @echo "" make -f $(SPREADAVR_PATH)/radiohead.mk libradiohead.a make -f $(SPREADAVR_PATH)/radiohead.mk clean @echo "" @echo "****************************************************" clean-radiohead: @echo "" @echo "****************************************************" @echo "cleaning external RadioHead lib ($(RADIOHEAD_PATH))" @echo "" make -f $(SPREADAVR_PATH)/radiohead.mk clean rm -f libradiohead.a @echo "" @echo "****************************************************" build-rweather-crypto: librweather-crypto.a librweather-crypto.a: Makefile @echo "" @echo "****************************************************" @echo "building external rweather/crypto lib ($(RWEATHER_CRYPTO_PATH))" @echo "" make -f $(SPREADAVR_PATH)/rweather-crypto.mk librweather-crypto.a make -f $(SPREADAVR_PATH)/rweather-crypto.mk clean @echo "" @echo "****************************************************" clean-rweather-crypto: @echo "" @echo "****************************************************" @echo "cleaning external rweather/crypto lib ($(RWEATHER_CRYPTO_PATH))" @echo "" make -f $(SPREADAVR_PATH)/rweather-crypto.mk clean rm -f librweather-crypto.a @echo "" @echo "****************************************************" ## project-specific objects %.d: %.c Makefile @set -e; rm -f $@; \ $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$; echo '(re)building $@' %.d: %.cpp Makefile @set -e; rm -f $@; \ $(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$; echo '(re)building $@' lib-%.d: $(LIB_DIR)/%.c Makefile @set -e; rm -f $@; \ $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,lib-\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$; echo '(re)building $@' lib-%.d: $(LIB_DIR)/%.cpp Makefile @set -e; rm -f $@; \ $(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,lib-\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$; echo '(re)building $@' ifneq ($(MAKECMDGOALS),distclean) -include $(DEP) -include $(CXX_DEP) -include $(DEP_LIB) -include $(CXX_DEP_LIB) endif %.o: %.c Makefile $(CC) $(CFLAGS) -c $< -o $@ %.o: %.cpp Makefile $(CXX) $(CXXFLAGS) -c $< -o $@ lib-%.o: $(LIB_DIR)/%.c Makefile $(CC) $(CFLAGS) -c $< -o $@ lib-%.o: $(LIB_DIR)/%.cpp Makefile $(CXX) $(CXXFLAGS) -c $< -o $@ $(ELFFILE): $(OBJ_LIB) $(CXX_OBJ_LIB) $(EXTERNAL_LIBS:%=lib%.a) $(OBJ) $(CXX_OBJ) $(CC) $(LDFLAGS) $(OBJ) $(CXX_OBJ) $(OBJ_LIB) $(CXX_OBJ_LIB) $(EXTERNAL_LIBS:%=-l%) -o $@ $(SIZE) $@ @echo "" $(HEXFILE): $(ELFFILE) $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ clean: $(CLEAN_TARGETS) rm -f *.o rm -f *.d rm -f *.d.* rm -f $(ELFFILE) rm -f $(HEXFILE) distclean: clean-external clean ### DFU-Programmer define DFU/erase $(DFU) $(MCU) erase || true endef define DFU/flash $(DFU) $(MCU) flash $1 endef define DFU/run $(DFU) $(MCU) start endef ### teensy-loader define teensy/erase endef define teensy/flash $(teensy) -mmcu=$(MCU) -w -v $1 endef define teensy/run endef ### avrdude define avrdude/erase endef define avrdude/flash $(avrdude) -V -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(PROG_TYPE) -b $(UPLOAD_RATE) -U flash:w:$1 endef define avrdude/run $(call generic/reset,) endef ### avrdudeNoErase define avrdudeNoErase/erase endef define avrdudeNoErase/flash $(avrdude) -V -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(PROG_TYPE) -b $(UPLOAD_RATE) -D -U flash:w:$1 endef define avrdudeNoErase/run $(call generic/reset,) endef ### micronucleus define micronucleus/erase endef define micronucleus/flash $(micronucleus) --run $1 endef define micronucleus/run endef ### Generic define generic/reset @if [ -n "$(RESET_FUNC)" ]; then \ if [ -x "$(RESET_FUNC)" ]; then \ eval $(RESET_FUNC) $(RESET_PARAM); \ else \ echo "WARNING: ignoring non-existing or non-executable reset script"; \ fi \ fi endef ### Program Targets program: reset erase flash run erase: $(call $(PROG)/$@,) flash: $(HEXFILE) $(call $(PROG)/$@,$(HEXFILE)) run: $(call $(PROG)/$@,) reset: $(call generic/reset,)