Statistics
| Revision:

root / demos / hunter_prey / src / Makefile @ 1828

History | View | Annotate | Download (15.2 KB)

1
# This is the root makefile
2
#
3
# Make global makefile changes here
4
#
5
###################################
6

    
7
# Relative path to the root directory (containing lib directory)
8
ifndef COLONYROOT
9
COLONYROOT := ..
10
# Target file name (without extension).
11
TARGET = main
12

    
13
# Uncomment this to use the wireless library
14
USE_WIRELESS = 1
15

    
16
# com1 = serial port. Use lpt1 to connect to parallel port.
17
AVRDUDE_PORT = $(shell if uname -s |grep -i w32 >/dev/null; then echo 'COM4:'; else echo '/dev/ttyUSB0'; fi)
18

    
19
else
20
COLONYROOT := ../$(COLONYROOT)
21
endif
22

    
23
# Hey Emacs, this is a -*- makefile -*-
24
#----------------------------------------------------------------------------
25
# WinAVR Makefile Template written by Eric B. Weddington, J?rg Wunsch, et al.
26
#
27
# Released to the Public Domain
28
#
29
# Additional material for this makefile was written by:
30
# Peter Fleury
31
# Tim Henigan
32
# Colin O'Flynn
33
# Reiner Patommel
34
# Markus Pfaff
35
# Sander Pool
36
# Frederik Rouleau
37
#
38
#----------------------------------------------------------------------------
39
# On command line:
40
#
41
# make all = Make software.
42
#
43
# make clean = Clean out built project files.
44
#
45
# make coff = Convert ELF to AVR COFF.
46
#
47
# make extcoff = Convert ELF to AVR Extended COFF.
48
#
49
# make program = Download the hex file to the device, using avrdude.
50
#                Please customize the avrdude settings below first!
51
#
52
# make debug = Start either simulavr or avarice as specified for debugging,
53
#              with avr-gdb or avr-insight as the front end for debugging.
54
#
55
# make library = Build the library, then make software
56
#
57
# make demo = copy this directory and all subdirectories to the demos folder
58
#
59
# make filename.s = Just compile filename.c into the assembler code only.
60
#
61
# make filename.i = Create a preprocessed source file for use in submitting
62
#                   bug reports to the GCC project.
63
#
64
# To rebuild project do "make clean" then "make all".
65
#----------------------------------------------------------------------------
66

    
67
#if you want your code to work on the Firefly++ and not Firefly+
68
#then add the -DFFPP line to CDEFS
69
CDEFS =
70
#-DFFPP
71

    
72
# MCU name
73
MCU = atmega128
74

    
75
# Processor frequency.
76
#     This will define a symbol, F_CPU, in all source code files equal to the
77
#     processor frequency. You can then use this symbol in your source code to
78
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
79
#     automatically to create a 32-bit value in your source code.
80
F_CPU = 8000000
81

    
82
# Output format. (can be srec, ihex, binary)
83
FORMAT = ihex
84

    
85
# List C source files here. (C dependencies are automatically generated.)
86
SRC = $(wildcard *.c)
87

    
88
# List Assembler source files here.
89
#     Make them always end in a capital .S.  Files ending in a lowercase .s
90
#     will not be considered source files but generated files (assembler
91
#     output from the compiler), and will be deleted upon "make clean"!
92
#     Even though the DOS/Win* filesystem matches both .s and .S the same,
93
#     it will preserve the spelling of the filenames, and gcc itself does
94
#     care about how the name is spelled on its command-line.
95
ASRC =
96

    
97
# Optimization level, can be [0, 1, 2, 3, s].
98
#     0 = turn off optimization. s = optimize for size.
99
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
100
OPT = s
101

    
102
# Debugging format.
103
#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
104
#     AVR Studio 4.10 requires dwarf-2.
105
#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
106
DEBUG =
107

    
108
# Compiler flag to set the C Standard level.
109
#     c89   = "ANSI" C
110
#     gnu89 = c89 plus GCC extensions
111
#     c99   = ISO C99 standard (not yet fully implemented)
112
#     gnu99 = c99 plus GCC extensions
113
CSTANDARD = -std=gnu99
114

    
115
# Place -D or -U options here
116
CDEFS += -DF_CPU=$(F_CPU)UL
117
CDEFS += -DFFP
118
# for wireless library
119
ifdef USE_WIRELESS
120
	CDEFS += -DROBOT
121
endif
122

    
123
# Place -I, -L options here
124
CINCS = -I$(COLONYROOT)/lib/include/libdragonfly
125
CINCS += -L$(COLONYROOT)/lib/bin
126
ifdef USE_WIRELESS
127
  CINCS += -I$(COLONYROOT)/lib/include/libwireless
128
endif
129

    
130
#---------------- Compiler Options ----------------
131
#  -g*:          generate debugging information
132
#  -O*:          optimization level
133
#  -f...:        tuning, see GCC manual and avr-libc documentation
134
#  -Wall...:     warning level
135
#  -Wa,...:      tell GCC to pass this to the assembler.
136
#    -adhlns...: create assembler listing
137
CFLAGS =
138
# CFLAGS = -g$(DEBUG)
139
CFLAGS += $(CDEFS) $(CINCS)
140
CFLAGS += -O$(OPT)
141
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
142
CFLAGS += -Wall -Wstrict-prototypes
143
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
144
CFLAGS += $(CSTANDARD)
145

    
146
#---------------- Assembler Options ----------------
147
#  -Wa,...:   tell GCC to pass this to the assembler.
148
#  -ahlms:    create listing
149
#  -gstabs:   have the assembler create line number information; note that
150
#             for use in COFF files, additional information about filenames
151
#             and function names needs to be present in the assembler source
152
#             files -- see avr-libc docs [FIXME: not yet described there]
153
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
154

    
155

    
156
#---------------- Library Options ----------------
157
# Minimalistic printf version
158
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
159

    
160
# Floating point printf version (requires MATH_LIB = -lm below)
161
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
162

    
163
# If this is left blank, then it will use the Standard printf version.
164
PRINTF_LIB =
165
#PRINTF_LIB = $(PRINTF_LIB_MIN)
166
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
167

    
168

    
169
# Minimalistic scanf version
170
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
171

    
172
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
173
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
174

    
175
# If this is left blank, then it will use the Standard scanf version.
176
SCANF_LIB =
177
#SCANF_LIB = $(SCANF_LIB_MIN)
178
#SCANF_LIB = $(SCANF_LIB_FLOAT)
179

    
180
MATH_LIB = -lm
181

    
182
#---------------- External Memory Options ----------------
183

    
184
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
185
# used for variables (.data/.bss) and heap (malloc()).
186
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
187

    
188
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
189
# only used for heap (malloc()).
190
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
191

    
192
EXTMEMOPTS =
193

    
194
#---------------- Linker Options ----------------
195
#  -Wl,...:     tell GCC to pass this to linker.
196
#    -Map:      create map file
197
#    --cref:    add cross reference to  map file
198
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
199
LDFLAGS += $(EXTMEMOPTS)
200
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
201
ifdef USE_WIRELESS
202
	LDFLAGS += -lwireless
203
endif
204
LDFLAGS += -ldragonfly
205

    
206

    
207

    
208
#---------------- Programming Options (avrdude) ----------------
209

    
210
# Programming hardware: alf avr910 avrisp bascom bsd
211
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
212
#
213
# Type: avrdude -c ?
214
# to get a full listing.
215
#
216
AVRDUDE_PROGRAMMER = avrisp
217

    
218
# programmer connected to serial device
219

    
220
AVRDUDE_WRITE_FLASH = -b 57600 -U flash:w:$(TARGET).hex
221
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
222

    
223

    
224
# Uncomment the following if you want avrdude's erase cycle counter.
225
# Note that this counter needs to be initialized first using -Yn,
226
# see avrdude manual.
227
#AVRDUDE_ERASE_COUNTER = -y
228

    
229
# Uncomment the following if you do /not/ wish a verification to be
230
# performed after programming the device.
231
#AVRDUDE_NO_VERIFY = -V
232

    
233
# Increase verbosity level.  Please use this when submitting bug
234
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
235
# to submit bug reports.
236
#AVRDUDE_VERBOSE = -v -v
237

    
238
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
239
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
240
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
241
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
242

    
243
#don't check for device signature
244
AVRDUDE_FLAGS += -F
245

    
246

    
247

    
248
#---------------- Debugging Options ----------------
249

    
250
# For simulavr only - target MCU frequency.
251
DEBUG_MFREQ = $(F_CPU)
252

    
253
# Set the DEBUG_UI to either gdb or insight.
254
# DEBUG_UI = gdb
255
DEBUG_UI = insight
256

    
257
# Set the debugging back-end to either avarice, simulavr.
258
DEBUG_BACKEND = avarice
259
#DEBUG_BACKEND = simulavr
260

    
261
# GDB Init Filename.
262
GDBINIT_FILE = __avr_gdbinit
263

    
264
# When using avarice settings for the JTAG
265
JTAG_DEV = /dev/com1
266

    
267
# Debugging port used to communicate between GDB / avarice / simulavr.
268
DEBUG_PORT = 4242
269

    
270
# Debugging host used to communicate between GDB / avarice / simulavr, normally
271
#     just set to localhost unless doing some sort of crazy debugging when
272
#     avarice is running on a different computer.
273
DEBUG_HOST = localhost
274

    
275

    
276

    
277
#============================================================================
278

    
279

    
280
# Define programs and commands.
281
SHELL = sh
282
CC = avr-gcc
283
OBJCOPY = avr-objcopy
284
OBJDUMP = avr-objdump
285
SIZE = avr-size
286
NM = avr-nm
287
AVRDUDE = avrdude
288
REMOVE = rm -f
289
REMOVEDIR = rm -rf
290
COPY = cp
291
WINSHELL = cmd
292

    
293

    
294
# Define Messages
295
# English
296
MSG_ERRORS_NONE = Errors: none
297
MSG_BEGIN = -------- begin --------
298
MSG_END = --------  end  --------
299
MSG_SIZE_BEFORE = Size before:
300
MSG_SIZE_AFTER = Size after:
301
MSG_COFF = Converting to AVR COFF:
302
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
303
MSG_FLASH = Creating load file for Flash:
304
MSG_EEPROM = Creating load file for EEPROM:
305
MSG_EXTENDED_LISTING = Creating Extended Listing:
306
MSG_SYMBOL_TABLE = Creating Symbol Table:
307
MSG_LINKING = Linking:
308
MSG_COMPILING = Compiling:
309
MSG_ASSEMBLING = Assembling:
310
MSG_CLEANING = Cleaning project:
311
MSG_LIBRARY_BUILD = Building library:
312
MSG_LIBRARY_CHECK = Checking if we need to rebuild the library:
313

    
314

    
315

    
316
# Define all object files.
317
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
318

    
319
# Define all listing files.
320
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
321

    
322

    
323
# Compiler flags to generate dependency files.
324
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
325

    
326

    
327
# Combine all necessary flags and optional flags.
328
# Add target processor to flags.
329
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
330
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
331

    
332

    
333

    
334

    
335

    
336
# Default target.
337
all: begin gccversion lib sizebefore build sizeafter checksize end
338

    
339
build: elf hex eep lss sym
340

    
341
elf: $(TARGET).elf
342
hex: $(TARGET).hex
343
eep: $(TARGET).eep
344
lss: $(TARGET).lss
345
sym: $(TARGET).sym
346

    
347

    
348

    
349
# Eye candy.
350
# AVR Studio 3.x does not check make's exit code but relies on
351
# the following magic strings to be generated by the compile job.
352
begin:
353
	@echo
354
	@echo $(MSG_BEGIN)
355

    
356
end:
357
	@echo $(MSG_END)
358
	@echo
359

    
360

    
361
# Display size of file.
362
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
363
ELFSIZE = $(SIZE) -A $(TARGET).elf
364
AVRMEM = avr-mem.sh $(TARGET).elf $(MCU)
365

    
366
# Check RAM size (make sure under 4 kB)
367
AWK = $(shell if uname -s |grep -i w32 >/dev/null; then echo 'gawk'; else echo 'awk'; fi)
368
DATASIZE = avr-size -A main.elf | grep 'data' | $(AWK) '{ print $$2 }' > 1.tmp
369
BSSSIZE = avr-size -A main.elf | grep 'bss' | $(AWK) '{ print $$2 }' > 2.tmp
370
ADD = expr `cat 1.tmp` + `cat 2.tmp` > 3.tmp
371
CLEANSIZE = rm 1.tmp 2.tmp 3.tmp
372
checksize:
373
	@$(DATASIZE)
374
	@$(BSSSIZE)
375
	@$(ADD)
376
	@if test `cat 3.tmp` -gt 4096; \
377
	then echo "RAM size exceeded.  Make .data or .bss smaller.";echo;exit 1; \
378
	else echo ".data and .bss size fine";echo; fi
379
	@$(CLEANSIZE)
380

    
381
# Display size before
382
sizebefore:
383
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
384
	$(AVRMEM) 2>/dev/null; echo; fi
385

    
386
# Display size after
387
sizeafter:
388
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
389
	$(AVRMEM) 2>/dev/null; echo; fi
390

    
391

    
392

    
393
# Display compiler version information.
394
gccversion :
395
	@$(CC) --version
396
  
397
  
398
# Build the library
399
library:
400
	@echo $(MSG_LIBRARY_BUILD)
401
	make clean -C $(COLONYROOT)/lib/src/libdragonfly
402
	make dist -C $(COLONYROOT)/lib/src/libdragonfly
403
ifdef USE_WIRELESS
404
	make clean -C $(COLONYROOT)/lib/src/libwireless
405
	make dist -C $(COLONYROOT)/lib/src/libwireless
406
endif
407

    
408
# Check if library needs to be built
409
lib:
410
	@echo $(MSG_LIBRARY_CHECK)
411
	make dist -C $(COLONYROOT)/lib/src/libdragonfly
412
ifdef USE_WIRELESS
413
	make dist -C $(COLONYROOT)/lib/src/libwireless
414
endif
415

    
416

    
417
# Program the device.
418
program: $(TARGET).hex $(TARGET).eep
419
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
420

    
421

    
422
# Generate avr-gdb config/init file which does the following:
423
#     define the reset signal, load the target file, connect to target, and set
424
#     a breakpoint at main().
425
gdb-config:
426
	@$(REMOVE) $(GDBINIT_FILE)
427
	@echo define reset >> $(GDBINIT_FILE)
428
	@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
429
	@echo end >> $(GDBINIT_FILE)
430
	@echo file $(TARGET).elf >> $(GDBINIT_FILE)
431
	@echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE)
432
ifeq ($(DEBUG_BACKEND),simulavr)
433
	@echo load  >> $(GDBINIT_FILE)
434
endif
435
	@echo break main >> $(GDBINIT_FILE)
436

    
437
debug: gdb-config $(TARGET).elf
438
ifeq ($(DEBUG_BACKEND), avarice)
439
	@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
440
	@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
441
	$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
442
	@$(WINSHELL) /c pause
443

    
444
else
445
	@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
446
	$(DEBUG_MFREQ) --port $(DEBUG_PORT)
447
endif
448
	@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
449

    
450

    
451

    
452

    
453
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
454
COFFCONVERT=$(OBJCOPY) --debugging \
455
--change-section-address .data-0x800000 \
456
--change-section-address .bss-0x800000 \
457
--change-section-address .noinit-0x800000 \
458
--change-section-address .eeprom-0x810000
459

    
460

    
461
coff: $(TARGET).elf
462
	@echo
463
	@echo $(MSG_COFF) $(TARGET).cof
464
	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
465

    
466

    
467
extcoff: $(TARGET).elf
468
	@echo
469
	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
470
	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
471

    
472

    
473

    
474
# Create final output files (.hex, .eep) from ELF output file.
475
%.hex: %.elf
476
	@echo
477
	@echo $(MSG_FLASH) $@
478
	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
479

    
480
%.eep: %.elf
481
	@echo
482
	@echo $(MSG_EEPROM) $@
483
	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
484
	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
485

    
486
# Create extended listing file from ELF output file.
487
%.lss: %.elf
488
	@echo
489
	@echo $(MSG_EXTENDED_LISTING) $@
490
	$(OBJDUMP) -h -S $< > $@
491

    
492
# Create a symbol table from ELF output file.
493
%.sym: %.elf
494
	@echo
495
	@echo $(MSG_SYMBOL_TABLE) $@
496
	$(NM) -n $< > $@
497

    
498

    
499

    
500
# Link: create ELF output file from object files.
501
.SECONDARY : $(TARGET).elf
502
.PRECIOUS : $(OBJ)
503
%.elf: $(OBJ)
504
	@echo
505
	@echo $(MSG_LINKING) $@
506
	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
507

    
508

    
509
# Compile: create object files from C source files.
510
%.o : %.c
511
	@echo
512
	@echo $(MSG_COMPILING) $<
513
	$(CC) -c $(ALL_CFLAGS) $< -o $@
514

    
515

    
516
# Compile: create assembler files from C source files.
517
%.s : %.c
518
	$(CC) -S $(ALL_CFLAGS) $< -o $@
519

    
520

    
521
# Assemble: create object files from assembler source files.
522
%.o : %.S
523
	@echo
524
	@echo $(MSG_ASSEMBLING) $<
525
	$(CC) -c $(ALL_ASFLAGS) $< -o $@
526

    
527
# Create preprocessed source for use in sending a bug report.
528
%.i : %.c
529
	$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
530

    
531

    
532
# Target: clean project.
533
clean: begin clean_list end
534

    
535
clean_list :
536
	@echo
537
	@echo $(MSG_CLEANING)
538
	$(REMOVE) $(TARGET).hex
539
	$(REMOVE) $(TARGET).eep
540
	$(REMOVE) $(TARGET).cof
541
	$(REMOVE) $(TARGET).elf
542
	$(REMOVE) $(TARGET).map
543
	$(REMOVE) $(TARGET).sym
544
	$(REMOVE) $(TARGET).lss
545
	$(REMOVE) $(OBJ)
546
	$(REMOVE) $(LST)
547
	$(REMOVE) $(SRC:.c=.s)
548
	$(REMOVE) $(SRC:.c=.d)
549
	$(REMOVEDIR) .dep
550

    
551

    
552

    
553
# Include the dependency files.
554
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
555

    
556

    
557
# Listing of phony targets.
558
.PHONY : all begin finish end sizebefore sizeafter gccversion \
559
build elf hex eep lss sym coff extcoff \
560
clean clean_list program debug gdb-config