]>
Commit | Line | Data |
---|---|---|
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.bincs | |
200 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U eeprom:w:$<:r | |
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 | NODEID ?= 1 | |
220 | ||
221 | %.bincs: %.bin | |
222 | ../tools/patcheeprom $(NODEID) < $< > $@ | |
223 | ||
224 | %.eep.bin: %.elf | |
225 | $(OBJCOPY) --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O binary -j .eeprom $< $@ | |
226 | ||
227 | %.lss: %.elf | |
228 | $(OBJDUMP) -h -S $< > $@ | |
229 | ||
230 | .PHONY: fuses-atmega8-fnordlichtmini-without-bootloader | |
231 | ||
232 | fuses-atmega8-fnordlichtmini-without-bootloader: | |
233 | $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U lfuse:w:0x3f:m -U hfuse:w:0xd9:m | |
234 | ||
235 | -include $(shell $(MKDIR) .dep 2>/dev/null) $(wildcard .dep/*) |