# Hey Emacs, this is a -*- makefile -*- #---------------------------------------------------------------------------- # WinAVR Makefile Template written by Eric B. Weddington, Joerg Wunsch, et al. # # Released to the Public Domain # # Additional material for this makefile was written by: # Peter Fleury # Tim Henigan # Colin O'Flynn # Reiner Patommel # Markus Pfaff # Sander Pool # Frederik Rouleau # Carlos Lamas # # # Extensively modified for sd2iec and later adapted for ARM by Ingo Korb # # To rebuild project do "make clean" then "make all". #---------------------------------------------------------------------------- # Read configuration file ifdef CONFIG CONFIGSUFFIX = $(CONFIG:config%=%) else CONFIG = config CONFIGSUFFIX = endif # Enable verbose compilation with "make V=1" ifdef V Q := E := @: else Q := @ E := @echo endif # Include the configuration file include $(CONFIG) # Directory for all generated files OBJDIR := obj$(CONFIGSUFFIX) # Output format. (can be srec, ihex, binary) FORMAT = binary # Linker script LINKERSCRIPT = lpc1754.ld # Target file name (without extension). TARGET = $(OBJDIR)/sd2snes # List C source files here. (C dependencies are automatically generated.) SRC = main.c ff.c ccsbcs.c clock.c uart.c power.c led.c timer.c printf.c spi.c fileops.c rtc.c fpga.c fpga_spi.c snes.c smc.c memory.c filetypes.c faulthandler.c sort.c crc32.c cic.c cli.c xmodem.c irq.c rle.c sdnative.c msu1.c crc16.c sysinfo.c cfg.c tests.c # usbcontrol.c usb_hid.c usbhw_lpc.c usbinit.c usbstdreq.c # List Assembler source files here. # Make them always end in a capital .S. Files ending in a lowercase .s # will not be considered source files but generated files (assembler # output from the compiler), and will be deleted upon "make clean"! # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. ASRC = startup.S crc.S # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # (Note: 3 is not always the best optimization level. See avr-libc FAQ.) # Use s -mcall-prologues when you really need size... #OPT = 2 OPT = s # Debugging format. DEBUG = dwarf-2 # List any extra directories to look for include files here. # Each directory must be seperated by a space. # Use forward slashes for directory separators. # For a directory that has spaces, enclose it in quotes. EXTRAINCDIRS = # Compiler flag to set the C Standard level. # c89 = "ANSI" C # gnu89 = c89 plus GCC extensions # c99 = ISO C99 standard (not yet fully implemented) # gnu99 = c99 plus GCC extensions CSTANDARD = -std=gnu99 # Place -D or -U options here CDEFS = -DF_OSC=$(CONFIG_MCU_FOSC)UL # Place -I options here CINCS = # CPU-specific flags ifndef CPUFLAGS CPUFLAGS := -mthumb -mcpu=cortex-m3 endif ifndef ARCH ARCH := arm-none-eabi endif # Define programs and commands. # CC must be defined here to generate the correct CFLAGS SHELL = sh CC = $(ARCH)-gcc OBJCOPY = $(ARCH)-objcopy OBJDUMP = $(ARCH)-objdump SIZE = $(ARCH)-size NM = $(ARCH)-nm REMOVE = rm -f COPY = cp AWK = awk RLE = ../utils/rle BIN2H = utils/bin2h #---------------- Compiler Options ---------------- # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += $(CPUFLAGS) -nostartfiles #CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums CFLAGS += -Wall -Wstrict-prototypes -Werror CFLAGS += -Wa,-adhlns=$(OBJDIR)/$(<:.c=.lst) CFLAGS += -I$(OBJDIR) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) CFLAGS += -ffunction-sections -fdata-sections #---------------- Assembler Options ---------------- # -Wa,...: tell GCC to pass this to the assembler. # -ahlms: create listing # -gstabs: have the assembler create line number information; note that # for use in COFF files, additional information about filenames # and function names needs to be present in the assembler source # files -- see avr-libc docs [FIXME: not yet described there] ASFLAGS = $(CPUFLAGS) -Wa,-adhlns=$(OBJDIR)/$(<:.S=.lst),-gstabs -I$(OBJDIR) #---------------- Linker Options ---------------- # -Wl,...: tell GCC to pass this to linker. # -Map: create map file # --cref: add cross reference to map file LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -T$(LINKERSCRIPT) LDFLAGS += -Wl,--gc-sections ifeq ($(CONFIG_LINKER_RELAX),y) LDFLAGS += -Wl,-O9,--relax endif #============================================================================ # De-dupe the list of C source files CSRC := $(sort $(SRC)) # Define all object files. OBJ := $(patsubst %,$(OBJDIR)/%,$(CSRC:.c=.o) $(ASRC:.S=.o)) # Define all listing files. LST := $(patsubst %,$(OBJDIR)/%,$(CSRC:.c=.lst) $(ASRC:.S=.lst)) # Compiler flags to generate dependency files. GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d # Combine all necessary flags and optional flags. # Add target processor to flags. ALL_CFLAGS = -I. $(CFLAGS) $(GENDEPFLAGS) ALL_ASFLAGS = -I. -x assembler-with-cpp $(ASFLAGS) $(CDEFS) # Default target. all: build build: snesboot.h cfgware.h elf bin hex $(E) " SIZE $(TARGET).elf" $(Q)$(ELFSIZE)|grep -v debug cp $(TARGET).bin $(OBJDIR)/firmware.img utils/genhdr $(OBJDIR)/firmware.img SNSD $(CONFIG_FWVER) elf: $(TARGET).elf bin: $(TARGET).bin hex: $(TARGET).hex eep: $(TARGET).eep lss: $(TARGET).lss sym: $(TARGET).sym # # A little helper target for the maintainer =) # copy2card: # cp $(TARGET).bin /mbed/hw_LPC1768.bin program: build utils/lpcchksum $(TARGET).bin openocd -f interface/olimex-arm-usb-ocd.cfg -f lpc1754.cfg -f flash.cfg debug: build openocd -f interface/olimex-arm-usb-ocd.cfg -f lpc1754.cfg reset: openocd -f interface/olimex-arm-usb-ocd.cfg -f lpc1754.cfg -f reset.cfg # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex ELFSIZE = $(SIZE) -A $(TARGET).elf # Generate cfgware.h cfgware.h: $(OBJDIR)/fpga_rle.bit $(E) " BIN2H $@" $(Q) $(BIN2H) $< $@ cfgware $(OBJDIR)/fpga_rle.bit: ../verilog/sd2sneslite/main.bit $(E) " RLE $@" $(Q) $(RLE) $< $@ #generate snesboot.h snesboot.h: $(OBJDIR)/snesboot.rle $(E) " BIN2H $@" $(Q) $(BIN2H) $< $@ bootrle $(OBJDIR)/snesboot.rle: ../snes/boot/menu.bin $(E) " RLE $@" $(Q) $(RLE) $< $@ # Generate autoconf.h from config .PRECIOUS : $(OBJDIR)/autoconf.h $(OBJDIR)/autoconf.h: $(CONFIG) | $(OBJDIR) $(E) " CONF2H $(CONFIG)" $(Q)$(AWK) -f conf2h.awk $(CONFIG) > $(OBJDIR)/autoconf.h # Create final output files from ELF output file. $(OBJDIR)/%.bin: $(OBJDIR)/%.elf $(E) " BIN $@" $(Q)$(OBJCOPY) -O binary $< $@ $(OBJDIR)/%.hex: $(OBJDIR)/%.elf $(E) " HEX $@" $(Q)$(OBJCOPY) -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. $(OBJDIR)/%.lss: $(OBJDIR)/%.elf $(E) " LSS $<" $(Q)$(OBJDUMP) -h -S $< > $@ # Create a symbol table from ELF output file. $(OBJDIR)/%.sym: $(OBJDIR)/%.elf $(E) " SYM $<" $(E)$(NM) -n $< > $@ # Link: create ELF output file from object files. .SECONDARY : $(TARGET).elf .PRECIOUS : $(OBJ) $(TARGET).elf : $(OBJ) $(E) " LINK $@" $(Q)$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) # Compile: create object files from C source files. $(OBJDIR)/%.o : %.c | $(OBJDIR) $(OBJDIR)/autoconf.h $(E) " CC $<" $(Q)$(CC) -c $(ALL_CFLAGS) $< -o $@ # Compile: create assembler files from C source files. $(OBJDIR)/%.s : %.c | $(OBJDIR) $(OBJDIR)/autoconf.h $(CC) -S $(ALL_CFLAGS) $< -o $@ # Assemble: create object files from assembler source files. $(OBJDIR)/%.o : %.S | $(OBJDIR) $(OBJDIR)/autoconf.h $(E) " AS $<" $(Q)$(CC) -c $(ALL_ASFLAGS) $< -o $@ # Create preprocessed source for use in sending a bug report. $(OBJDIR)/%.i : %.c | $(OBJDIR) $(OBJDIR)/autoconf.h $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ # Create the output directory $(OBJDIR) : $(E) " MKDIR $(OBJDIR)" $(Q)mkdir $(OBJDIR) # Target: clean project. clean: begin clean_list end clean_list : $(E) " CLEAN" $(Q)$(REMOVE) $(TARGET).hex $(Q)$(REMOVE) $(TARGET).bin $(Q)$(REMOVE) $(TARGET).elf $(Q)$(REMOVE) $(TARGET).map $(Q)$(REMOVE) $(TARGET).sym $(Q)$(REMOVE) $(TARGET).lss $(Q)$(REMOVE) $(OBJ) $(Q)$(REMOVE) cfgware.h $(Q)$(REMOVE) $(OBJDIR)/autoconf.h $(Q)$(REMOVE) $(OBJDIR)/*.bin $(Q)$(REMOVE) $(LST) $(Q)$(REMOVE) $(CSRC:.c=.s) $(Q)$(REMOVE) $(CSRC:.c=.d) $(Q)$(REMOVE) .dep/* -$(Q)rmdir $(OBJDIR) # Include the dependency files. -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) # Listing of phony targets. .PHONY : all begin finish end sizebefore sizeafter \ build elf hex lss sym clean clean_list