| 1 | #################################################### |
| 2 | # fnordlicht-ng Makefile |
| 3 | #################################################### |
| 4 | |
| 5 | # ATTENTION: |
| 6 | # Any of these variables are overridden with the values from the file |
| 7 | # "config.mk", you can tune your settings there. The file "config.mk" is not |
| 8 | # under version control. |
| 9 | # Just run 'make' to create a "config.mk" with the default settings |
| 10 | |
| 11 | # hardware type, possible values (default is unset): |
| 12 | # ATTENTION: please configure in config.mk, this is just included here for reference! |
| 13 | # - fnordlicht -- original fnordlicht hardware |
| 14 | # - fnordlichtmini -- fnordlichtmini hardware |
| 15 | #HARDWARE = fnordlicht |
| 16 | |
| 17 | # controller |
| 18 | MCU = atmega8 |
| 19 | |
| 20 | # frequency |
| 21 | F_CPU = 16000000UL |
| 22 | |
| 23 | # main application name (without .hex) |
| 24 | # eg 'test' when the main function is defined in 'test.c' |
| 25 | TARGET = fnordlicht |
| 26 | |
| 27 | # c sourcecode files |
| 28 | # eg. 'test.c foo.c foobar/baz.c' |
| 29 | SRC = $(wildcard *.c) |
| 30 | |
| 31 | # asm sourcecode files |
| 32 | # eg. 'interrupts.S foobar/another.S' |
| 33 | ASRC = |
| 34 | |
| 35 | # headers which should be considered when recompiling |
| 36 | # eg. 'global.h foobar/important.h' |
| 37 | HEADERS = $(wildcard *.h) |
| 38 | |
| 39 | # include directories (used for both, c and asm) |
| 40 | # eg '. usbdrv/' |
| 41 | INCLUDES = |
| 42 | |
| 43 | |
| 44 | # use more debug-flags when compiling |
| 45 | DEBUG = 0 |
| 46 | |
| 47 | # default static color program |
| 48 | CONFIG_SCRIPT_DEFAULT = 1 |
| 49 | # include the script interpreter |
| 50 | CONFIG_SCRIPT = 1 |
| 51 | # include uart support |
| 52 | CONFIG_SERIAL = 1 |
| 53 | # include remote command support (needs uart) |
| 54 | CONFIG_REMOTE = 1 |
| 55 | # secondary pwm output |
| 56 | CONFIG_SECONDARY_PWM = 1 |
| 57 | # default baudrate |
| 58 | CONFIG_SERIAL_BAUDRATE = 19200 |
| 59 | |
| 60 | # avrdude programmer protocol |
| 61 | PROG = usbasp |
| 62 | # avrdude programmer device |
| 63 | DEV = usb |
| 64 | # further flags for avrdude |
| 65 | AVRDUDE_FLAGS = |
| 66 | |
| 67 | CFLAGS += -DHARDWARE_$(HARDWARE)=1 -DCONFIG_SCRIPT_DEFAULT=$(CONFIG_SCRIPT_DEFAULT) |
| 68 | CFLAGS += -DCONFIG_SCRIPT=$(CONFIG_SCRIPT) -DCONFIG_SERIAL=$(CONFIG_SERIAL) |
| 69 | CFLAGS += -DCONFIG_REMOTE=$(CONFIG_REMOTE) -DCONFIG_SECONDARY_PWM=$(CONFIG_SECONDARY_PWM) |
| 70 | CFLAGS += -DCONFIG_SERIAL_BAUDRATE=$(CONFIG_SERIAL_BAUDRATE) |
| 71 | |
| 72 | #################################################### |
| 73 | # 'make' configuration |
| 74 | #################################################### |
| 75 | CC = avr-gcc |
| 76 | OBJCOPY = avr-objcopy |
| 77 | OBJDUMP = avr-objdump |
| 78 | AS = avr-as |
| 79 | SIZE = avr-size |
| 80 | CP = cp |
| 81 | RM = rm -f |
| 82 | RMDIR = rm -rf |
| 83 | MKDIR = mkdir |
| 84 | AVRDUDE = avrdude |
| 85 | |
| 86 | # flags for automatic dependency handling |
| 87 | DEPFLAGS = -MD -MP -MF .dep/$(@F).d |
| 88 | |
| 89 | # flags for the compiler (for .c files) |
| 90 | CFLAGS += -g -Os -mmcu=$(MCU) -DF_CPU=$(F_CPU) -std=gnu99 -fshort-enums $(DEPFLAGS) |
| 91 | CFLAGS += $(addprefix -I,$(INCLUDES)) |
| 92 | # optimize for size |
| 93 | CFLAGS += -mcall-prologues |
| 94 | CFLAGS += --param inline-call-cost=2 -finline-limit=3 -fno-inline-small-functions |
| 95 | CFLAGS += -Wl,--relax |
| 96 | CFLAGS += -fno-split-wide-types |
| 97 | |
| 98 | # place each function in an own section and do garbage collection |
| 99 | CFLAGS += -ffunction-sections -fdata-sections |
| 100 | CFLAGS += -Wl,--gc-sections |
| 101 | |
| 102 | # flags for the compiler (for .S files) |
| 103 | ASFLAGS += -g -mmcu=$(MCU) -DF_CPU=$(F_CPU) -x assembler-with-cpp $(DEPFLAGS) |
| 104 | ASFLAGS += $(addprefix -I,$(INCLUDES)) |
| 105 | |
| 106 | # flags for the linker |
| 107 | LDFLAGS += -mmcu=$(MCU) |
| 108 | |
| 109 | # fill in object files |
| 110 | OBJECTS += $(SRC:.c=.o) |
| 111 | OBJECTS += $(ASRC:.S=.o) |
| 112 | |
| 113 | .PHONY: all |
| 114 | |
| 115 | # main make target (moved up here because of the config.mk target) |
| 116 | all: $(TARGET).hex $(TARGET).bin |
| 117 | |
| 118 | # create config.mk (if it does not exist yet) |
| 119 | $(CURDIR)/config.mk: |
| 120 | @$(CP) config.mk.template config.mk |
| 121 | @echo "====================================================" |
| 122 | @echo "created file $@" |
| 123 | @echo 'please tune your settings (especially $$HARDWARE)' |
| 124 | @echo "there, then run 'make' again" |
| 125 | @echo "====================================================" |
| 126 | @exit 1 |
| 127 | |
| 128 | # include config file |
| 129 | -include $(CURDIR)/config.mk |
| 130 | |
| 131 | # include more debug flags, if $(DEBUG) is 1 |
| 132 | ifeq ($(DEBUG),1) |
| 133 | CFLAGS += -Wall -W -Wchar-subscripts -Wmissing-prototypes |
| 134 | CFLAGS += -Wmissing-declarations -Wredundant-decls |
| 135 | CFLAGS += -Wstrict-prototypes -Wshadow -Wbad-function-cast |
| 136 | CFLAGS += -Winline -Wpointer-arith -Wsign-compare |
| 137 | CFLAGS += -Wunreachable-code -Wdisabled-optimization |
| 138 | CFLAGS += -Wcast-align -Wwrite-strings -Wnested-externs -Wundef |
| 139 | CFLAGS += -Wa,-adhlns=$(basename $@).lst |
| 140 | CFLAGS += -DCONFIG_DEBUG=1 |
| 141 | endif |
| 142 | |
| 143 | #################################################### |
| 144 | # avrdude configuration |
| 145 | #################################################### |
| 146 | ifeq ($(MCU),atmega8) |
| 147 | AVRDUDE_MCU=m8 |
| 148 | endif |
| 149 | ifeq ($(MCU),atmega48) |
| 150 | AVRDUDE_MCU=m48 |
| 151 | endif |
| 152 | ifeq ($(MCU),atmega88) |
| 153 | AVRDUDE_MCU=m88 |
| 154 | endif |
| 155 | ifeq ($(MCU),atmega168) |
| 156 | AVRDUDE_MCU=m168 |
| 157 | endif |
| 158 | |
| 159 | AVRDUDE_FLAGS += -p $(AVRDUDE_MCU) |
| 160 | |
| 161 | #################################################### |
| 162 | # make targets |
| 163 | #################################################### |
| 164 | |
| 165 | .PHONY: hardware-check clean distclean avrdude-terminal |
| 166 | |
| 167 | # check if HARDWARE is set |
| 168 | hardware-check: |
| 169 | ifeq ($(HARDWARE),) |
| 170 | @echo 'please edit config.mk and set $$HARDWARE' |
| 171 | @exit 1 |
| 172 | endif |
| 173 | |
| 174 | $(TARGET).elf: hardware-check $(OBJECTS) |
| 175 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) |
| 176 | |
| 177 | # all objects (.o files) and config.mk |
| 178 | $(OBJECTS): $(HEADERS) config.mk |
| 179 | |
| 180 | # remove all compiled files |
| 181 | clean: |
| 182 | $(RM) $(foreach ext,elf hex eep.hex bin map,$(TARGET).$(ext)) \ |
| 183 | $(foreach file,$(patsubst %.o,%,$(OBJECTS)),$(foreach ext,o lst lss,$(file).$(ext))) |
| 184 | |
| 185 | # additionally remove the dependency makefile and config.mk |
| 186 | distclean: clean |
| 187 | $(RMDIR) .dep |
| 188 | $(RM) config.mk |
| 189 | |
| 190 | # avrdude-related targets |
| 191 | install program: program-$(TARGET) |
| 192 | |
| 193 | avrdude-terminal: |
| 194 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -t |
| 195 | |
| 196 | program-%: %.hex |
| 197 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U flash:w:$< |
| 198 | |
| 199 | program-eeprom-%: %.eep.hex |
| 200 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U eeprom:w:$< |
| 201 | |
| 202 | # special programming targets |
| 203 | %.hex: %.elf |
| 204 | $(OBJCOPY) -O ihex -R .eeprom $< $@ |
| 205 | @echo "====================================================" |
| 206 | @echo "$@ compiled for hardware: $(HARDWARE)" |
| 207 | @echo "using controller $(MCU)" |
| 208 | @echo -n "size for $< is " |
| 209 | @$(SIZE) -A $@ | grep '\.sec1' | tr -s ' ' | cut -d" " -f2 |
| 210 | @echo "====================================================" |
| 211 | |
| 212 | # special programming targets |
| 213 | %.bin: %.elf |
| 214 | $(OBJCOPY) -O binary -R .eeprom $< $@ |
| 215 | |
| 216 | %.eep.hex: %.elf |
| 217 | $(OBJCOPY) --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex -j .eeprom $< $@ |
| 218 | |
| 219 | %.lss: %.elf |
| 220 | $(OBJDUMP) -h -S $< > $@ |
| 221 | |
| 222 | .PHONY: fuses-atmega8-fnordlichtmini-without-bootloader |
| 223 | |
| 224 | fuses-atmega8-fnordlichtmini-without-bootloader: |
| 225 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U lfuse:w:0x3f:m -U hfuse:w:0xd9:m |
| 226 | |
| 227 | -include $(shell $(MKDIR) .dep 2>/dev/null) $(wildcard .dep/*) |