# Makefile.avr - AVR part Makefile. # # Flags. AVR_CFLAGS := $(CFLAGS) -mmcu=$(AVR_MCU) AVR_ASFLAGS := $(ASFLAGS) -mmcu=$(AVR_MCU) AVR_CPPFLAGS := $(CPPFLAGS) $(AVR_DEFS) AVR_LDFLAGS := $(LDFLAGS) AVR_LDLIBS := $(LDLIBS) $(AVR_LIBS) AVR_CC := avr-gcc AVR_OBJCOPY := avr-objcopy AVR_OBJDUMP := avr-objdump AVR_COMPILE.c = $(AVR_CC) $(AVR_CFLAGS) $(AVR_CPPFLAGS) -c ifdef L AVR_COMPILE.c += -Wa,-adhlns=$(@:%.avr.o=%.c.avr.lst) endif AVR_COMPILE.S := $(AVR_CC) $(AVR_ASFLAGS) $(AVR_CPPFLAGS) -c AVR_LINK.o := $(AVR_CC) $(AVR_CFLAGS) $(AVR_LDFLAGS) # Main rules. avr: elf lst hex simu: simuelf .PHONY: avr simu clean.avr clean.simu elf simuelf lst \ text hex srec bin eeprom ehex esrec ebin # General rules. AVR_PROGS += $(PROGS) AVR_ELFS := $(AVR_PROGS:%=%.avr.elf) AVR_SIMU_ELFS := $(SIMU_PROGS:%=%.avr.simu.elf) AVR_SOURCES := $(filter-out %.host.c,$(ALL_SOURCES)) AVR_C_SOURCES := $(filter %.c,$(AVR_SOURCES)) AVR_S_SOURCES := $(filter %.S,$(AVR_SOURCES)) AVR_OBJECTS := $(AVR_C_SOURCES:%.c=$(OBJDIR)/%.avr.o) \ $(AVR_S_SOURCES:%.S=$(OBJDIR)/%.avr.o) AVR_SIMU_OBJECTS := $(AVR_OBJECTS:%.avr.o=%.avr.simu.o) elf: $(AVR_ELFS) simuelf: $(AVR_SIMU_ELFS) lst: $(AVR_PROGS:%=%.avr.lst) define AVR_PROG_template $(1).avr.elf: $$(patsubst %.S,$(OBJDIR)/%.avr.o,\ $$(patsubst %.c,$(OBJDIR)/%.avr.o,\ $$(filter-out %.host.c,$$($(1)_SOURCES)))) endef $(foreach prog,$(AVR_PROGS),$(eval $(call AVR_PROG_template,$(prog)))) define SIMU_PROG_template $(1).avr.simu.elf: $$(patsubst %.S,$(OBJDIR)/%.avr.simu.o,\ $$(patsubst %.c,$(OBJDIR)/%.avr.simu.o,\ $$(filter-out %.host.c,$$($(1)_SOURCES)))) endef $(foreach prog,$(SIMU_PROGS),$(eval $(call SIMU_PROG_template,$(prog)))) $(AVR_ELFS) $(AVR_SIMU_ELFS): $(AVR_LINK.o) $^ $(AVR_LDLIBS) -o $@ %.avr.lst: %.avr.elf $(AVR_OBJDUMP) -h -S $< > $@ $(OBJDIR)/%.avr.o: %.c | $(OBJDIR) $(AVR_COMPILE.c) -o $@ $< $(OBJDIR)/%.avr.simu.o: %.c | $(OBJDIR) $(AVR_COMPILE.c) -DSIMU=1 -o $@ $< $(OBJDIR)/%.avr.o: %.S | $(OBJDIR) $(AVR_COMPILE.S) -o $@ $< $(OBJDIR)/%.avr.simu.o: %.S | $(OBJDIR) $(AVR_COMPILE.S) -DSIMU=1 -o $@ $< # Dependency checking. -include $(AVR_OBJECTS:%.avr.o=%.avr.d) -include $(AVR_SIMU_OBJECTS:%.avr.simu.o=%.avr.d) # Rules for building the .text rom images. TEXTS := $(AVR_PROGS:%=%.hex) $(AVR_PROGS:%=%.bin) $(AVR_PROGS:%=%.srec) text: hex hex: $(AVR_PROGS:%=%.hex) bin: $(AVR_PROGS:%=%.bin) srec: $(AVR_PROGS:%=%.srec) %.hex: %.avr.elf $(AVR_OBJCOPY) -j .text -j .data -O ihex $< $@ %.srec: %.avr.elf $(AVR_OBJCOPY) -j .text -j .data -O srec $< $@ %.bin: %.avr.elf $(AVR_OBJCOPY) -j .text -j .data -O binary $< $@ # Rules for building the .eeprom rom images. EEPROMS := $(AVR_PROGS:%=%_eeprom.hex) $(AVR_PROGS:%=%_eeprom.bin) \ $(AVR_PROGS:%=%_eeprom.srec) eeprom: ehex ehex: $(AVR_PROGS:%=%_eeprom.hex) ebin: $(AVR_PROGS:%=%_eeprom.bin) esrec: $(AVR_PROGS:%=%_eeprom.srec) %_eeprom.hex: %.avr.elf $(AVR_OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ %_eeprom.srec: %.avr.elf $(AVR_OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@ %_eeprom.bin: %.avr.elf $(AVR_OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@ # Cleaning. clean.avr: rm -f $(OBJDIR)/*.avr.o $(OBJDIR)/*.avr.d $(AVR_ELFS) \ *.avr.lst *.avr.map $(TEXTS) $(EEPROMS) clean.simu: rm -f $(OBJDIR)/*.avr.simu.o $(OBJDIR)/*.avr.simu.d $(AVR_SIMU_ELFS)