tuxanci2-sdk
SDK for tuxanci2
Log | Files | Refs | README | LICENSE

sdk.mk (2822B)


      1 CROSS         ?= riscv32-unknown-elf-
      2 
      3 SDK_DIR       := $(dir $(lastword $(MAKEFILE_LIST)))
      4 
      5 CC            := $(CROSS)gcc
      6 OBJCOPY       := $(CROSS)objcopy
      7 
      8 BUILD         ?= build
      9 TABCONV_DIR   ?= $(SDK_DIR)../tabconv
     10 TABCONV       ?= $(BUILD)/tabconv
     11 FILES         ?= files
     12 
     13 OPT           := 2
     14 MARCH         := rv32im
     15 MABI          := ilp32
     16 
     17 LINKER_SCRIPT := linker.ld
     18 
     19 CFLAGS        := -O$(OPT) -march=$(MARCH) -mabi=$(MABI) -ffreestanding -nostdinc -fno-builtin -fno-pic -fno-stack-protector -fno-tree-loop-distribute-patterns -Wall -Wextra -I$(SDK_DIR)include -I$(SDK_DIR)../include -I$(BUILD)/include $(addprefix -I,$(INCLUDES))
     20 ASFLAGS       := -march=$(MARCH) -mabi=$(MABI) -I$(SDK_DIR)include -I$(SDK_DIR)../include
     21 LDFLAGS       := -march=$(MARCH) -mabi=$(MABI) -nostdlib -static -T $(SDK_DIR)$(LINKER_SCRIPT) -Wl,--gc-sections
     22 
     23 SDK_SRCS      := $(shell find $(SDK_DIR)src -type f \( -name '*.c' -o -name '*.S' \))
     24 SRCS          ?= src
     25 GAME_SRCS     := $(sort $(foreach s,$(SRCS),$(if $(wildcard $(s)/.),$(shell find $(patsubst %/,%,$(s)) -type f \( -name '*.c' -o -name '*.S' \)),$(s))))
     26 
     27 SDK_OBJS      := $(patsubst $(SDK_DIR)%, $(BUILD)/sdk/%, $(SDK_SRCS))
     28 GAME_OBJS     := $(patsubst %, $(BUILD)/game/%, $(GAME_SRCS))
     29 
     30 OBJS          := $(SDK_OBJS:.c=.o)
     31 OBJS          := $(OBJS:.S=.o)
     32 GAME_OBJS     := $(GAME_OBJS:.c=.o)
     33 GAME_OBJS     := $(GAME_OBJS:.S=.o)
     34 OBJS          += $(GAME_OBJS)
     35 
     36 ASSETS        := $(sort $(shell find $(FILES) -type f -not -name 'LICENSE' 2>/dev/null))
     37 FILES_HEADER  := $(BUILD)/include/ta_files.h
     38 
     39 DEPS          := $(OBJS:.o=.d)
     40 
     41 all: $(BUILD)/$(TARGET).tab
     42 
     43 $(BUILD)/$(TARGET).tab: $(BUILD)/$(TARGET).bin $(ASSETS) $(TABCONV)
     44 	$(TABCONV) $< $(ASSETS) $@
     45 
     46 $(BUILD)/$(TARGET).bin: $(BUILD)/$(TARGET).elf
     47 	$(OBJCOPY) -O binary $< $@
     48 
     49 $(TABCONV): $(TABCONV_DIR)/tabconv.c
     50 	mkdir -p $(@D)
     51 	$(MAKE) -C $(TABCONV_DIR) OUT=$(abspath $@)
     52 
     53 $(BUILD)/$(TARGET).elf: $(OBJS)
     54 	$(CC) $(LDFLAGS) $^ -o $@
     55 
     56 $(BUILD)/sdk/%.o: $(SDK_DIR)%.c
     57 	mkdir -p $(@D)
     58 	$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
     59 
     60 $(BUILD)/sdk/%.o: $(SDK_DIR)%.S
     61 	mkdir -p $(@D)
     62 	$(CC) $(ASFLAGS) -MMD -MP -c $< -o $@
     63 
     64 $(BUILD)/game/%.o: %.c $(FILES_HEADER)
     65 	mkdir -p $(@D)
     66 	$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
     67 
     68 $(BUILD)/game/%.o: %.S
     69 	mkdir -p $(@D)
     70 	$(CC) $(ASFLAGS) -MMD -MP -c $< -o $@
     71 
     72 $(FILES_HEADER): FORCE
     73 	mkdir -p $(@D)
     74 	{ \
     75 		printf '#ifndef TA_FILES_H\n#define TA_FILES_H\n\n'; \
     76 		id=2; \
     77 		for a in $(ASSETS); do \
     78 			name=$$(basename "$$a"); \
     79 			name=$${name%.*}; \
     80 			name=$$(printf '%s' "$$name" | tr 'a-z' 'A-Z' | sed 's/[^A-Z0-9_]/_/g'); \
     81 			printf '#define TA_FILE_%s %d\n' "$$name" "$$id"; \
     82 			id=$$((id + 1)); \
     83 		done; \
     84 		printf '\n#endif // TA_FILES_H\n'; \
     85 	} > $@.tmp
     86 	if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv $@.tmp $@; fi
     87 
     88 FORCE:
     89 
     90 clean:
     91 	rm -rf $(BUILD)
     92 
     93 -include $(DEPS)
     94 
     95 .PHONY: all clean FORCE