2016-12-12 19:31:02 +01:00
|
|
|
ifeq ($(strip $(DEVKITARM)),)
|
|
|
|
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(filter $(DEVKITARM)/bin,$(PATH)),)
|
|
|
|
export PATH:=$(DEVKITARM)/bin:$(PATH)
|
|
|
|
endif
|
|
|
|
|
|
|
|
CC = arm-none-eabi-gcc
|
|
|
|
LINK = arm-none-eabi-gcc
|
|
|
|
AS = arm-none-eabi-as
|
|
|
|
OBJCOPY = arm-none-eabi-objcopy
|
|
|
|
OBJDUMP = arm-none-eabi-objdump
|
|
|
|
CFLAGS += -Wall -mbig-endian -std=gnu11 -mcpu=arm926ej-s -msoft-float -mfloat-abi=soft -Os
|
|
|
|
LDFLAGS += -nostartfiles -nodefaultlibs -mbig-endian -Wl,-T,link.ld
|
|
|
|
LIBDIRS += -L$(CURDIR)/../libs
|
|
|
|
LIBS += -lgcc
|
|
|
|
|
|
|
|
CFILES = $(wildcard source/*.c)
|
2017-03-25 22:03:19 +01:00
|
|
|
FAT_CFILES += $(wildcard source/fat/*.c)
|
2016-12-12 19:31:02 +01:00
|
|
|
BINFILES = $(wildcard data/*.bin)
|
|
|
|
OFILES = $(BINFILES:data/%.bin=build/%.bin.o)
|
|
|
|
OFILES += $(CFILES:source/%.c=build/%.o)
|
2017-03-25 22:03:19 +01:00
|
|
|
OFILES += $(FAT_CFILES:source/fat/%.c=build/%.o)
|
2016-12-12 19:31:02 +01:00
|
|
|
DFILES = $(CFILES:source/%.c=build/%.d)
|
2017-03-25 22:03:19 +01:00
|
|
|
DFILES += $(FAT_CFILES:source/fat/%.c=build/%.d)
|
2016-12-12 19:31:02 +01:00
|
|
|
SFILES = $(wildcard source/*.s)
|
|
|
|
OFILES += $(SFILES:source/%.s=build/%.o)
|
|
|
|
PROJECTNAME = ${shell basename "$(CURDIR)"}
|
|
|
|
CWD = "$(CURDIR)""
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------
|
|
|
|
# canned command sequence for binary data, taken from devkitARM
|
|
|
|
#---------------------------------------------------------------------------------
|
|
|
|
define bin2o
|
|
|
|
bin2s $< | $(AS) -EB -o $(@)
|
|
|
|
endef
|
|
|
|
|
|
|
|
.PHONY:=all dirs
|
|
|
|
|
|
|
|
all: dirs $(PROJECTNAME).bin $(PROJECTNAME)_syms.h $(PROJECTNAME).bin $(PROJECTNAME).bin.h
|
|
|
|
|
|
|
|
dirs:
|
|
|
|
@mkdir -p build
|
|
|
|
|
|
|
|
$(PROJECTNAME).elf: $(OFILES)
|
|
|
|
@echo "LD $@"
|
|
|
|
@$(LINK) $(LDFLAGS) -o $(PROJECTNAME).elf $(sort $(filter-out build/crt0.o, $(OFILES))) $(LIBDIRS) $(LIBS)
|
|
|
|
|
|
|
|
$(PROJECTNAME).bin: $(PROJECTNAME).elf
|
|
|
|
@echo "OBJCOPY $@\n"
|
|
|
|
@$(OBJCOPY) -j .text -j .rodata -j .data -O binary $(PROJECTNAME).elf $@
|
|
|
|
|
|
|
|
$(PROJECTNAME).bin.h: $(PROJECTNAME).bin
|
|
|
|
@xxd -i $< | sed "s/unsigned/static const unsigned/g;s/$(PROJECTNAME)$*/$(PROJECTNAME)/g" > $@
|
|
|
|
|
|
|
|
$(PROJECTNAME)_syms.h:
|
|
|
|
@echo "#ifndef $(PROJECTNAME)_SYMS_H" > $@
|
|
|
|
@echo "#define $(PROJECTNAME)_SYMS_H" >> $@
|
|
|
|
@$(OBJDUMP) -EB -t -marm $(PROJECTNAME).elf | grep 'g F .text' | grep -v '.hidden' | awk '{print "#define " $$6 " 0x" $$1}' >> $@
|
|
|
|
@$(OBJDUMP) -EB -t -marm $(PROJECTNAME).elf | grep -e 'g .text' -e '_bss_' | awk '{print "#define " $$5 " 0x" $$1}' >> $@
|
2017-03-27 21:59:03 +02:00
|
|
|
@$(OBJDUMP) -EB -t -marm $(PROJECTNAME).elf | grep -e 'g O .dumper_config' | awk '{print "#define " $$6 " 0x" $$1}' >> $@
|
2016-12-12 19:31:02 +01:00
|
|
|
@echo "#endif" >> $@
|
|
|
|
|
|
|
|
clean:
|
|
|
|
@rm -f build/*.o build/*.d
|
|
|
|
@rm -f $(PROJECTNAME).elf $(PROJECTNAME).bin $(PROJECTNAME)_syms.h $(PROJECTNAME).bin $(PROJECTNAME).bin.h
|
|
|
|
@echo "all cleaned up !"
|
|
|
|
|
|
|
|
-include $(DFILES)
|
|
|
|
|
|
|
|
build/%.o: source/%.c
|
|
|
|
@echo "CC $(notdir $<)"
|
|
|
|
@$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
@$(CC) -MM $< > build/$*.d
|
|
|
|
|
2017-03-25 22:03:19 +01:00
|
|
|
build/%.o: source/fat/%.c
|
|
|
|
@echo "CC $(notdir $<)"
|
|
|
|
@$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
@$(CC) -MM $< > build/$*.d
|
|
|
|
|
2016-12-12 19:31:02 +01:00
|
|
|
build/%.o: source/%.s
|
|
|
|
@echo "CC $(notdir $<)"
|
|
|
|
@$(CC) $(CFLAGS) -xassembler-with-cpp -c $< -o $@
|
|
|
|
@$(CC) -MM $< > build/$*.d
|
|
|
|
|
|
|
|
build/%.bin.o: data/%.bin
|
|
|
|
@echo "BIN $(notdir $<)"
|
|
|
|
@$(bin2o)
|