182 lines
4.7 KiB
Makefile
182 lines
4.7 KiB
Makefile
### Build Options ###
|
|
|
|
BASEROM := baserom.z64
|
|
TARGET := ogrebattle64
|
|
COMPARE ?= 1
|
|
NON_MATCHING ?= 0
|
|
CHECK ?= 1
|
|
VERBOSE ?= 1
|
|
PRETTY_PRINTING ?= 1
|
|
|
|
# Fail early if baserom does not exist
|
|
ifeq ($(wildcard $(BASEROM)),)
|
|
$(error Baserom `$(BASEROM)' not found.)
|
|
endif
|
|
|
|
# NON_MATCHING=1 implies COMPARE=0
|
|
ifeq ($(NON_MATCHING),1)
|
|
override COMPARE=0
|
|
endif
|
|
|
|
ifeq ($(VERBOSE),0)
|
|
V := @
|
|
endif
|
|
|
|
ifeq ($(PRETTY_PRINTING),0)
|
|
P := true ||
|
|
endif
|
|
|
|
### Output ###
|
|
BUILD_DIR := build
|
|
TOOLS_DIR := tools
|
|
|
|
BUILD_TOOLS_DIR := $(TOOLS_DIR)/build
|
|
|
|
ROM := $(BUILD_DIR)/$(TARGET).z64
|
|
ELF := $(BUILD_DIR)/$(TARGET).elf
|
|
LD_SCRIPT := $(TARGET).ld
|
|
LD_MAP := $(BUILD_DIR)/$(TARGET).map
|
|
|
|
PYTHON := python3
|
|
SPLAT_YAML := splat.yaml
|
|
SPLAT := $(PYTHON) $(TOOLS_DIR)/splat/split.py $(SPLAT_YAML)
|
|
DIFF := diff
|
|
|
|
CROSS := mips-linux-gnu-
|
|
|
|
LD := $(CROSS)ld
|
|
OBJDUMP := $(CROSS)objdump
|
|
AS := $(CROSS)as
|
|
|
|
OBJCOPY := $(CROSS)objcopy
|
|
STRIP := $(CROSS)strip
|
|
|
|
CC := $(BUILD_TOOLS_DIR)/gcc2.7.2/gcc -B $(BUILD_TOOLS_DIR)/gcc2.7.2/
|
|
CXX := $(BUILD_TOOLS_DIR)/gcc2.7.2/g++ -P
|
|
|
|
PRINT := printf '
|
|
ENDCOLOR := \033[0m
|
|
WHITE := \033[0m
|
|
ENDWHITE := $(ENDCOLOR)
|
|
GREEN := \033[0;32m
|
|
ENDGREEN := $(ENDCOLOR)
|
|
BLUE := \033[0;34m
|
|
ENDBLUE := $(ENDCOLOR)
|
|
YELLOW := \033[0;33m
|
|
ENDYELLOW := $(ENDCOLOR)
|
|
ENDLINE := \n'
|
|
|
|
### Compiler Options ###
|
|
|
|
IINC := -I include -I include/ultra -I include/ultra/PR
|
|
|
|
ASFLAGS := -I include -EB -mtune=vr4300 -march=vr4300
|
|
CPPFLAGS := $(IINC) -DBUILD_VERSION=VERSION_J -D_LANGUAGE_C -D_FINALROM -DF3DEX_GBI_2 -D_MIPS_SZLONG=32 -nostdinc -mgp32 -mfp32 -mips2
|
|
CFLAGS := -c -G0 -mgp32 -mfp32 -mips2
|
|
LDFLAGS := -T undefined_syms.txt -T undefined_syms_auto.txt -T undefined_funcs_auto.txt -T undefined_funcs.txt -T $(LD_SCRIPT) -Map $(LD_MAP) --no-check-sections
|
|
|
|
OPTFLAGS := -O2
|
|
|
|
### Sources ###
|
|
|
|
# Empty file used to track the time that splat was most recently run
|
|
SPLAT_TIMESTAMP := asm/splat_timestamp
|
|
|
|
# Object files
|
|
OBJECTS := $(shell $(PYTHON) tools/splat_objects.py $(SPLAT_YAML))
|
|
DEPENDS := $(OBJECTS:=.d)
|
|
|
|
### Targets ###
|
|
|
|
all: $(ROM)
|
|
|
|
-include $(DEPENDS)
|
|
|
|
clean:
|
|
$(V)rm -rf build
|
|
$(info $(MAKEFLAGS))
|
|
|
|
distclean: clean
|
|
$(V)rm -rf asm
|
|
$(V)rm -rf assets
|
|
$(V)rm -f *auto.txt
|
|
$(V)rm -f $(TARGET).ld
|
|
$(V)rm -f include/ld_addrs.h
|
|
|
|
setup: clean distclean split
|
|
|
|
split:
|
|
$(V)$(SPLAT)
|
|
@touch $(SPLAT_TIMESTAMP)
|
|
|
|
context:
|
|
$(V)$(PYTHON) tools/m2ctx.py ctx_includes.h
|
|
|
|
$(BUILD_DIR)/src/boot.c.o: OPTFLAGS = -O0
|
|
|
|
# Run splat and update the timestamp
|
|
$(SPLAT_TIMESTAMP) : $(SPLAT_YAML) | $(BUILD_DIR)
|
|
@$(P)$(PRINT)$(GREEN)Running splat$(ENDGREEN)$(ENDLINE)
|
|
$(V)$(SPLAT)
|
|
@touch $@
|
|
|
|
# Disassemble asm files with splat (just update the timestamp so it's newer than the time splat was run)
|
|
asm/%.s: $(SPLAT_TIMESTAMP)
|
|
@touch $@
|
|
|
|
# Extract bin files with splat (same as above)
|
|
assets/%.bin: $(SPLAT_TIMESTAMP)
|
|
@touch $@
|
|
|
|
# Create the build directory
|
|
$(BUILD_DIR):
|
|
@$(P)$(PRINT)$(GREEN)Making build folder$(ENDGREEN)$(ENDLINE)
|
|
@mkdir -p $@
|
|
|
|
# Compile .c files
|
|
$(BUILD_DIR)/src/%.c.o: src/%.c $(SPLAT_TIMESTAMP) | $(BUILD_DIR)
|
|
@$(P)$(PRINT)$(GREEN)Compiling C file: $(ENDGREEN)$(BLUE)$<$(ENDBLUE)$(ENDLINE)
|
|
@mkdir -p $(shell dirname $@)
|
|
$(V)$(CC) $(CFLAGS) $(OPTFLAGS) $(CPPFLAGS) -o $@ $<
|
|
|
|
# Assemble .s files with modern gnu as
|
|
$(BUILD_DIR)/asm/%.s.o: asm/%.s | $(BUILD_DIR)
|
|
@$(P)$(PRINT)$(GREEN)Assembling asm file: $(ENDGREEN)$(BLUE)$<$(ENDBLUE)$(ENDLINE)
|
|
@mkdir -p $(shell dirname $@)
|
|
$(V)$(AS) $(ASFLAGS) -o $@ $<
|
|
|
|
# Create .o files from .bin files.
|
|
$(BUILD_DIR)/%.bin.o: %.bin | $(BUILD_DIR)
|
|
@$(P)$(PRINT)$(GREEN)Objcopying binary file: $(ENDGREEN)$(BLUE)$<$(ENDBLUE)$(ENDLINE)
|
|
@mkdir -p $(shell dirname $@)
|
|
$(V)$(LD) -r -b binary -o $@ $<
|
|
|
|
# Link the .o files into the .elf
|
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS)
|
|
@$(P)$(PRINT)$(GREEN)Linking elf file: $(ENDGREEN)$(BLUE)$@$(ENDBLUE)$(ENDLINE)
|
|
$(V)$(LD) $(LDFLAGS) -o $@
|
|
|
|
# Convert the .elf to the final rom
|
|
$(ROM): $(BUILD_DIR)/$(TARGET).elf
|
|
@$(P)$(PRINT)$(GREEN)Creating z64: $(ENDGREEN)$(BLUE)$@$(ENDBLUE)$(ENDLINE)
|
|
$(V)$(OBJCOPY) $< $@ -O binary
|
|
$(V)$(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x1000000 $< $@
|
|
ifeq ($(COMPARE),1)
|
|
@$(DIFF) $(BASEROM) $(ROM) && $(PRINT)OK$(ENDLINE) || ($(PRINT)FAILED (ROM BUILT, BUT DIFFERS FROM BASEROM)$(ENDLINE) && false)
|
|
endif
|
|
|
|
### File-Specific Rules ###
|
|
# build/src/os/O1/%.o: OPTFLAGS := -O1
|
|
# build/src/%.o: CC := python3 tools/asm_processor/build.py $(CC) -- $(AS) $(ASFLAGS) --
|
|
|
|
### Make Settings ###
|
|
|
|
# Prevent removing intermediate files
|
|
.SECONDARY:
|
|
|
|
# Specify which targets don't have a corresponding file
|
|
.PHONY: all clean distclean test setup split
|
|
|
|
# Print target for debugging
|
|
print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true
|