Makefile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. ### Project name (also used for output file name)
  2. PROJECT = glg
  3. ### Firmware version string, embedded in the boot log record
  4. FW_VERSION_NUM = 1.0.0
  5. GIT_HASH := $(shell git describe --always --dirty --abbrev=8 2>/dev/null || echo unknown)
  6. ### Source files and search directory
  7. CSRC = main.c uart0.c uart1.c ff.c mmc.c 1wire.c ds18b20.c expander.c I2C.c xprintf.c gpx.c ffunicode.c display.c working_modes.o timec.o nmea.o settings.o menu.o syslog.o autopause.o
  8. ASRC = stime.S
  9. VPATH =
  10. ### Target device
  11. DEVICE = atmega644p
  12. ### Device memory sizes, for the size report below (bytes)
  13. FLASH_SIZE = 65536
  14. RAM_SIZE = 4096
  15. EEPROM_SIZE = 2048
  16. ### Bootloader port
  17. PROGPORT ?= /dev/ttyUSB0
  18. ### Optimization level (0, 1, 2, 3, 4 or s)
  19. OPTIMIZE = s
  20. ### C Standard level (c89, gnu89, c99 or gnu99)
  21. #CSTD = c99
  22. ### Include dirs, library dirs and definitions
  23. LIBS =
  24. LIBDIRS =
  25. INCDIRS =
  26. DEFS = F_CPU=7372800
  27. DEFS += 'FW_VERSION="$(FW_VERSION_NUM)+$(GIT_HASH)"'
  28. # DEFS += LEDR_UART
  29. ADEFS =
  30. ifeq ($(LCD),graphic)
  31. CSRC += UC1601S-I2C.c
  32. DEFS += LCD_GRAPHIC
  33. endif
  34. ifeq ($(LCD),alnum)
  35. CSRC += HD44780-I2C.c
  36. DEFS += LCD_ALNUM
  37. endif
  38. ### Warning contorls
  39. WARNINGS = all extra
  40. ### Output directory
  41. OBJDIR = obj
  42. ### Output file format (hex, bin or both) and debugger type
  43. OUTPUT = hex
  44. HEXFMT = ihex
  45. DEBUG = dwarf-2
  46. ### Programs to build porject
  47. CC = avr-gcc
  48. OBJCOPY = avr-objcopy
  49. OBJDUMP = avr-objdump
  50. SIZE = avr-size
  51. NM = avr-nm
  52. AVRDUDE = avrdude -c arduino -b 230400 -P $(PROGPORT) -p $(DEVICE)
  53. # Define all object files
  54. COBJ = $(CSRC:.c=.o)
  55. AOBJ = $(ASRC:.S=.o)
  56. COBJ := $(addprefix $(OBJDIR)/,$(COBJ))
  57. AOBJ := $(addprefix $(OBJDIR)/,$(AOBJ))
  58. PROJECT := $(OBJDIR)/$(PROJECT)
  59. # Flags for C files
  60. #CFLAGS += -std=$(CSTD)
  61. CFLAGS += -g$(DEBUG)
  62. CFLAGS += -mmcu=$(DEVICE)
  63. CFLAGS += -O$(OPTIMIZE) -mcall-prologues
  64. CFLAGS += $(addprefix -W,$(WARNINGS)) --param=min-pagesize=0
  65. CFLAGS += $(addprefix -I,$(INCDIRS))
  66. CFLAGS += $(addprefix -D,$(DEFS))
  67. CFLAGS += -Wp,-MM,-MP,-MT,$(OBJDIR)/$(*F).o,-MF,$(OBJDIR)/$(*F).d
  68. # Assembler flags
  69. ASFLAGS += $(addprefix -D,$(ADEFS)) -Wa,-gstabs,-g$(DEBUG)
  70. ALL_ASFLAGS = -mmcu=$(DEVICE) -I. -x assembler-with-cpp $(ASFLAGS)
  71. # Linker flags
  72. LDFLAGS += -Wl,-Map,$(PROJECT).map
  73. # Default target.
  74. all: version build size
  75. ifeq ($(OUTPUT),hex)
  76. build: elf hex lst sym
  77. hex: $(PROJECT).hex
  78. else
  79. ifeq ($(OUTPUT),bin)
  80. build: elf bin lst sym
  81. bin: $(PROJECT).bin
  82. else
  83. ifeq ($(OUTPUT),both)
  84. build: elf hex bin lst sym
  85. hex: $(PROJECT).hex
  86. bin: $(PROJECT).bin
  87. else
  88. $(error "Invalid format: $(OUTPUT)")
  89. endif
  90. endif
  91. endif
  92. elf: $(PROJECT).elf
  93. lst: $(PROJECT).lst
  94. sym: $(PROJECT).sym
  95. # Display compiler version information.
  96. version :
  97. @$(CC) --version
  98. # Create final output file from ELF output file.
  99. %.hex: %.elf
  100. @echo
  101. # $(OBJCOPY) -j .text -j .data -j .eeprom -j .fuse -O $(HEXFMT) $< $@
  102. $(OBJCOPY) -j .text -j .data -O $(HEXFMT) $< $@
  103. %.bin: %.elf
  104. @echo
  105. $(OBJCOPY) -j .text -j .data -O binary $< $@
  106. # Create extended listing file from ELF output file.
  107. %.lst: %.elf
  108. @echo
  109. $(OBJDUMP) -h -S -C $< > $@
  110. # Create a symbol table from ELF output file.
  111. %.sym: %.elf
  112. @echo
  113. $(NM) -n $< > $@
  114. # Display size of file, with a device-specific (DEVICE) usage summary.
  115. size:
  116. @echo
  117. $(SIZE) $(PROJECT).elf
  118. $(SIZE) $(PROJECT).hex
  119. @echo
  120. @$(SIZE) -A $(PROJECT).elf | awk '\
  121. $$1==".text" || $$1==".data" { prog += $$2 } \
  122. $$1==".data" || $$1==".bss" || $$1==".noinit" { ram += $$2 } \
  123. END { \
  124. printf "Program: %6d bytes (%5.1f%% of %d byte flash on $(DEVICE))\n", prog, prog*100.0/$(FLASH_SIZE), $(FLASH_SIZE); \
  125. printf "Data: %6d bytes (%5.1f%% of %d byte RAM on $(DEVICE))\n", ram, ram*100.0/$(RAM_SIZE), $(RAM_SIZE); \
  126. }'
  127. # Link: create ELF output file from object files.
  128. %.elf: $(AOBJ) $(COBJ)
  129. @echo
  130. @echo Linking...
  131. $(CC) $(CFLAGS) $(AOBJ) $(COBJ) --output $@
  132. # Compile: create object files from C source files. ARM or Thumb(-2)
  133. $(COBJ) : $(OBJDIR)/%.o : %.c
  134. @echo
  135. @echo $< :
  136. $(CC) -c $(CFLAGS) $< -o $@
  137. # Assemble: create object files from assembler source files. ARM or Thumb(-2)
  138. $(AOBJ) : $(OBJDIR)/%.o : %.S
  139. @echo
  140. @echo $< :
  141. $(CC) -c $(ALL_ASFLAGS) $< -o $@
  142. # Target: clean project.
  143. clean:
  144. @echo
  145. rm -f -r $(OBJDIR) | exit 0
  146. # Include the dependency files.
  147. -include $(shell mkdir $(OBJDIR) 2>/dev/null) $(wildcard $(OBJDIR)/*.d)
  148. install: all
  149. $(AVRDUDE) -U flash:w:$(PROJECT).hex
  150. reset:
  151. $(AVRDUDE)