dreamcast/base.mk

158 lines
3.3 KiB
Makefile

DEBUG = -g -gdwarf-4
AFLAGS += --fatal-warnings
CSTD ?= -std=gnu23
CXXSTD ?= -std=c++23
CFLAGS += -falign-functions=4 -ffunction-sections -fdata-sections -fshort-enums -ffreestanding -nostdlib -fno-builtin
CFLAGS += -Wall -Werror -Wfatal-errors
CFLAGS += -Wno-array-bounds
#CFLAGS += -Wno-error=narrowing -Wno-error=unused-variable -Wno-error=array-bounds=
CFLAGS += -Wno-error=maybe-uninitialized
CFLAGS += -Wno-error=unused-but-set-variable
CFLAGS += -Wno-error=unused-variable
CFLAGS += -Wno-error=unused-function
CFLAGS += -D__dreamcast__
CXXFLAGS += -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics
# --print-gc-sections
LDFLAGS += --gc-sections --no-warn-rwx-segment --print-memory-usage --entry=_start --orphan-handling=error
DEPFLAGS = -MMD -MP
CC = $(TARGET)gcc
CXX = $(TARGET)g++
AS = $(TARGET)as
LD = $(TARGET)ld
OBJCOPY = $(TARGET)objcopy
OBJDUMP = $(TARGET)objdump
LIBGCC = $(shell $(CC) -print-file-name=libgcc.a)
define BUILD_BINARY_O
$(OBJCOPY) \
-I binary $(OBJARCH) \
--rename-section .data=.data.$(basename $@) \
$< $@
endef
makefile_path := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
makefile_relative = $(shell realpath --relative-to $(makefile_path) $(1))
as_obj_binary = _binary_$(subst -,_,$(subst .,_,$(subst /,_,$(subst .h,,$(call makefile_relative,$(1))))))
define BUILD_BINARY_H
@echo gen $(call makefile_relative,$@)
@echo '#pragma once' > $@
@echo '' >> $@
@echo '#include <stdint.h>' >> $@
@echo '' >> $@
@echo '#ifdef __cplusplus' >> $@
@echo 'extern "C" {' >> $@
@echo '#endif' >> $@
@echo '' >> $@
@echo 'extern uint32_t $(call as_obj_binary,$@)_start __asm("$(call as_obj_binary,$@)_start");' >> $@
@echo 'extern uint32_t $(call as_obj_binary,$@)_end __asm("$(call as_obj_binary,$@)_end");' >> $@
@echo 'extern uint32_t $(call as_obj_binary,$@)_size __asm("$(call as_obj_binary,$@)_size");' >> $@
@echo '' >> $@
@echo '#ifdef __cplusplus' >> $@
@echo '}' >> $@
@echo '#endif' >> $@
endef
%.txt.o: %.txt
$(BUILD_BINARY_O)
%.txt.h: %.txt
$(BUILD_BINARY_H)
%.bin.o: %.bin
$(BUILD_BINARY_O)
%.bin.h: %.bin
$(BUILD_BINARY_H)
%.pcm.o: %.pcm
$(BUILD_BINARY_O)
%.pcm.h: %.pcm
$(BUILD_BINARY_H)
%.adpcm.o: %.adpcm
$(BUILD_BINARY_O)
%.adpcm.h: %.adpcm
$(BUILD_BINARY_H)
%.data.o: %.data
$(BUILD_BINARY_O)
%.data.h: %.data
$(BUILD_BINARY_H)
%.data.pal.o: %.data.pal
$(BUILD_BINARY_O)
%.data.pal.h: %.data.pal
$(BUILD_BINARY_H)
%.alpha.h: %.alpha
$(BUILD_BINARY_H)
%.alpha.o: %.alpha
$(BUILD_BINARY_O)
%.alpha.pal.h: %.alpha.pal
$(BUILD_BINARY_H)
%.alpha.pal.o: %.alpha.pal
$(BUILD_BINARY_O)
%.vq.h: %.vq
$(BUILD_BINARY_H)
%.vq.o: %.vq
$(BUILD_BINARY_O)
%.mod.h: %.mod
$(BUILD_BINARY_H)
%.mod.o: %.mod
$(BUILD_BINARY_O)
%.bsp.h: %.bsp
$(BUILD_BINARY_H)
%.bsp.o: %.bsp
$(BUILD_BINARY_O)
%.glm.h: %.glm
$(BUILD_BINARY_H)
%.glm.o: %.glm
$(BUILD_BINARY_O)
%.xm.h: %.xm
$(BUILD_BINARY_H)
%.xm.o: %.xm
$(BUILD_BINARY_O)
%.o: %.s
$(AS) $(AARCH) $(AFLAGS) $(DEBUG) $< -o $@
%.o: %.c
$(CC) $(CARCH) $(CFLAGS) $(CSTD) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
%.o: %.cpp
$(CXX) $(CARCH) $(CFLAGS) $(CXXSTD) $(CXXFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
%.elf:
$(LD) $(LDFLAGS) -L $(LIB) -T $(LDSCRIPT) $^ -o $@
%.bin: %.elf
$(OBJCOPY) -O binary $< $@
du -b $@
-include $(shell find -type f -name '*.d')