fxengine/Makefile

149 lines
2.6 KiB
Makefile

include Makefile.cfg
target=fx9860g
CONFIG.TARGET = fx
CONFIG.TARGET.LONG = fx9860g
PREFIX = /usr/lib/gcc/sh3eb-elf/9.1.0/
toolchain = sh3eb-elf
CONFIG.MACROS = -DFX9860G
machine := -m3 -mb
# Compiler flags, assembler flags, dependency generation, archiving
cflags := $(machine) -ffreestanding -nostdlib -Wall -Wextra -std=c11 -Os \
-fstrict-volatile-bitfields -I include $(CONFIG.MACROS) \
$(CONFIG.CFLAGS) $(PROFILING)
sflags := $(CONFIG.MACROS)
dflags = -MMD -MT $@ -MF $(@:.o=.d) -MP
arflags :=
# Target file
target := libfxengine.a
# Automatic names for object and dependency files
src2obj = $(1:src/%=build/%).o
src2dep = $(1:src/%=build/%).d
# Source files
src := $(shell find src \
-name '*.[csS]' -print)
src_obj := $(foreach s,$(src),$(call src2obj,$s))
# All object files
obj := $(src_obj) $(spe_obj)
#
# Toolchain
#
gcc = $(toolchain)-gcc
as = $(toolchain)-as
ld = $(toolchain)-ld
ar = $(toolchain)-ar
objcopy = $(toolchain)-objcopy
#
# Version management
#
# Version symbol is obtained by using the last commit hash on 7 nibbles
version_hash = 0x0$(shell git rev-parse --short HEAD)
#
# Build rules
#
all: $(target)
$(target): $(obj)
$(call cmd_l,ar,$@) $(ar) rcs $(arflags) $@ $^
# Assembler sources
build/%.s.o: src/%.s build/%.s.d
@ mkdir -p $(dir $@)
$(call cmd_b,as,$*.s) $(gcc) -c $< -o $@ $(sflags)
build/%.S.o: src/%.S build/%.S.d
@ mkdir -p $(dir $@)
$(call cmd_b,as,$*.S) $(gcc) -c $< -o $@ $(sflags)
# C sources
build/%.c.o: src/%.c build/%.c.d
@ mkdir -p $(dir $@)
$(call cmd_b,gcc,$*.c) $(gcc) -c $< -o $@ $(dflags) $(cflags)
# Version symbol. ld generates a .stack section for unknown reasons; I remove
# it in the linker script.
version.o: ../.git/HEAD
@ mkdir -p $(dir $@)
@ echo "_FXENGINE_VERSION = $(version_hash);" > $@.txt
$(call cmd_b,ld,$@) $(ld) -r -R $@.txt -o $@
#
# Installing
#
m644 := -m 644
# Disable -m on Mac OS
ifeq "$(shell uname)" "Darwin"
m644 :=
endif
uninstall:
rm -f $(PREFIX)/$(target)
rm -rf $(PREFIX)/include/fxengine
install: $(target)
@make uninstall
install -d $(PREFIX)
install $(target) $(m644) $(PREFIX)
cp -r include/fxengine $(PREFIX)/include
#
# Utilities
#
# Directories: make conveniently leaves a '/' at the end of $(dir ...)
%/:
@ mkdir -p $@
# Don't try to unlink directories once they're built (that wouldn't work =p)
.PRECIOUS: %/
# Dependency information
-include $(shell [ -d src ] && find src -name *.d)
build/%.d: ;
.PRECIOUS: build/%.d
.PHONY: all clean distclean
# Do not output full commands by default
VERBOSE ?=