Newer
Older
uwuboot / Makefile.arm9
.SUFFIXES:

ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif

# Sources and defines
TARGET   := code9
BUILD    := build9
INCLUDES := include thirdparty
SOURCES  := source source/arm9 thirdparty/fatfs thirdparty/fatfs/option
DEFINES  := -DARM9 -D_3DS
DATA     := data


# Compiler settings
ARCH     := -march=armv5te -mtune=arm946e-s -mfloat-abi=soft -marm -mthumb-interwork
CFLAGS   := $(ARCH) -std=c11 -O2 -g -fstrict-aliasing -mword-relocations -fomit-frame-pointer \
			-ffast-math -ffunction-sections -Wall -Wextra
CXXFLAGS := $(ARCH) -std=c++11 -O2 -g -fstrict-aliasing -mword-relocations -fomit-frame-pointer \
			-ffast-math -ffunction-sections -Wall -Wextra
ASFLAGS  :=
LDFLAGS  := $(CFLAGS) -Wl,--use-blx,--gc-sections -nostartfiles -T arm9.ld

PREFIX   := arm-none-eabi-
CC       := $(PREFIX)gcc
CXX      := $(PREFIX)g++
AS       := $(PREFIX)as
OBJCOPY  := $(PREFIX)objcopy


# Do not change anything after this
VPATH    := $(DATA) $(SOURCES)

BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
CFILES   := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES   := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

OFILES   := $(foreach file,$(BINFILES),$(BUILD)/$(file).o) \
			$(foreach file,$(CFILES:.c=.o),$(BUILD)/$(file)) \
			$(foreach file,$(CPPFILES:.cpp=.o),$(BUILD)/$(file)) \
			$(foreach file,$(SFILES:.s=.o),$(BUILD)/$(file))

INCLUDE  := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) -I$(BUILD)

ifeq ($(strip $(CPPFILES)),)
	LD := $(CC)
else
	LD := $(CXX)
endif


ifneq ($(strip $(NO_DEBUG)),)
	DEFINES += -DNDEBUG
endif

ifeq ($(strip $(NO_COMMIT_HASH)),)
	DEFINES += -DCOMMIT_HASH="\" $(shell git rev-parse --short=8 HEAD)\""
else
	DEFINES += -DCOMMIT_HASH=\"\"
endif


.PHONY: clean release

# Main target
$(TARGET).bin: $(TARGET).elf
	@$(OBJCOPY) -O binary $< $@
	@echo built ... $(notdir $@)

$(TARGET).elf: $(BUILD) $(OFILES)

clean:
	@echo clean ...
	@rm -rf $(BUILD) $(TARGET).bin $(TARGET).elf

release:
	@$(MAKE) --no-print-directory -f Makefile.arm9 NO_DEBUG=1 NO_COMMIT_HASH=1


$(BUILD):
	@mkdir -p $(BUILD)

%.elf:
	@echo linking $(notdir $@)
	$(LD) $(LDFLAGS) $(OFILES) -o $@

$(BUILD)/%.bin.o: %.bin
	@echo $(notdir $<)
	bin2s $< | $(AS) -o $(@)
	echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > $(BUILD)/`(echo $(<F) | tr . _)`.h
	echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> $(BUILD)/`(echo $(<F) | tr . _)`.h
	echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> $(BUILD)/`(echo $(<F) | tr . _)`.h

$(BUILD)/%.o: %.c
	@echo $(notdir $<)
	$(CC) $(CFLAGS) $(DEFINES) $(INCLUDE) -c $< -o $@

$(BUILD)/%.o: %.cpp
	@echo $(notdir $<)
	$(CXX) $(CXXFLAGS) $(DEFINES) $(INCLUDE) -c $< -o $@

$(BUILD)/%.o: %.s
	@echo $(notdir $<)
	$(CC) $(CFLAGS) -x assembler-with-cpp $(DEFINES) $(INCLUDE) -c $< -o $@