tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE

engine.mk (4074B)


      1 ENGINE    ?= engine
      2 BUILD_DIR ?= build
      3 
      4 XXD ?= xxd
      5 CC  ?= gcc
      6 AR  ?= ar
      7 
      8 BITS ?= 32
      9 
     10 SRC          ?= $(SRCS)
     11 CLEAN_SRC    := $(patsubst ./%,%,$(SRC))
     12 RUNTIME_SRCS := $(sort $(foreach s,$(CLEAN_SRC),$(if $(wildcard $(s)/.),$(shell find $(patsubst %/,%,$(s)) -type f \( -name '*.c' -o -name '*.S' -o -name '*.s' \)),$(s))))
     13 RUNTIME_SRCS := $(patsubst ./%,%,$(RUNTIME_SRCS))
     14 
     15 RUNTIME_OBJS := $(patsubst %, $(BUILD_DIR)/runtime/%, $(RUNTIME_SRCS))
     16 RUNTIME_OBJS := $(RUNTIME_OBJS:.c=.o)
     17 RUNTIME_OBJS := $(RUNTIME_OBJS:.S=.o)
     18 RUNTIME_OBJS := $(RUNTIME_OBJS:.s=.o)
     19 
     20 ENGINE_DIR  := $(ENGINE)
     21 ENGINE_SRCS := $(shell find $(ENGINE_DIR)/src -type f -name '*.c' | sort)
     22 ENGINE_OBJS := $(patsubst $(ENGINE_DIR)/src/%.c, $(BUILD_DIR)/engine/src/%.o, $(ENGINE_SRCS))
     23 
     24 CONFIG_HEADER := $(BUILD_DIR)/engine/include/config.h
     25 FILES_HEADER  := $(BUILD_DIR)/engine/include/files.h
     26 
     27 ASSETS    := $(shell find $(ENGINE_DIR)/font $(ENGINE_DIR)/images $(ENGINE_DIR)/files -type f -not -name 'LICENSE' 2>/dev/null | sort)
     28 asset_sym  = $(shell printf '%s' 'ta_file_$(notdir $(basename $(1)))' | sed 's/[^a-zA-Z0-9_]/_/g')
     29 
     30 ASSET_GEN_SRCS := $(foreach a,$(ASSETS),$(BUILD_DIR)/engine/assets/$(notdir $(basename $(a))).c)
     31 ASSET_OBJS     := $(ASSET_GEN_SRCS:.c=.o)
     32 
     33 EMBED_GAME ?= 0
     34 GAME_TAB   ?= $(BUILD_DIR)/game/tuxanci2.tab
     35 
     36 ifeq ($(EMBED_GAME),1)
     37 GAME_EMBED_SRC := $(BUILD_DIR)/engine/embed/ta_game_tab.c
     38 GAME_EMBED_OBJ := $(GAME_EMBED_SRC:.c=.o)
     39 CFLAGS         += -DTA_EMBED_GAME
     40 endif
     41 
     42 ALL_ENGINE_OBJS := $(ENGINE_OBJS) $(ASSET_OBJS) $(GAME_EMBED_OBJ)
     43 ENGINE_LIB      := $(BUILD_DIR)/engine/libtuxanci2-engine.a
     44 
     45 OUT ?= $(BUILD_DIR)/tuxanci2
     46 
     47 all: $(OUT)
     48 
     49 .PHONY: all clean FORCE
     50 
     51 define ASSET_RULE
     52 $(BUILD_DIR)/engine/assets/$(notdir $(basename $(1))).c: $(1)
     53 	mkdir -p $$(@D)
     54 	$$(XXD) -i -n $(call asset_sym,$(1)) $$< $$@
     55 endef
     56 $(foreach a,$(ASSETS),$(eval $(call ASSET_RULE,$(a))))
     57 
     58 EMBED_STAMP := $(BUILD_DIR)/engine/embed-$(EMBED_GAME).stamp
     59 
     60 $(EMBED_STAMP):
     61 	mkdir -p $(@D)
     62 	rm -f $(BUILD_DIR)/engine/embed-*.stamp
     63 	touch $@
     64 
     65 $(BUILD_DIR)/engine/src/tab.o: $(EMBED_STAMP)
     66 
     67 ifeq ($(EMBED_GAME),1)
     68 $(GAME_EMBED_SRC): $(GAME_TAB)
     69 	mkdir -p $(@D)
     70 	$(XXD) -i -n ta_game_tab $< $@
     71 
     72 $(BUILD_DIR)/engine/embed/%.o: $(BUILD_DIR)/engine/embed/%.c $(CONFIG_HEADER)
     73 	mkdir -p $(@D)
     74 	$(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
     75 endif
     76 
     77 $(CONFIG_HEADER): $(ENGINE_DIR)/include/config.h.in
     78 	mkdir -p $(@D)
     79 	sed 's/\$$BITS/$(BITS)/g' $< > $@
     80 
     81 $(FILES_HEADER): FORCE
     82 	mkdir -p $(@D)
     83 	{ \
     84 		printf '#ifndef TA_FILES_H\n#define TA_FILES_H\n\n'; \
     85 		$(foreach a,$(ASSETS),printf 'extern unsigned char %s[];\nextern unsigned int %s_len;\n' '$(call asset_sym,$(a))' '$(call asset_sym,$(a))';) \
     86 		printf '\n#endif // TA_FILES_H\n'; \
     87 	} > $@.tmp
     88 	if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv $@.tmp $@; fi
     89 
     90 FORCE:
     91 
     92 $(BUILD_DIR)/engine/src/%.o: $(ENGINE_DIR)/src/%.c $(CONFIG_HEADER) $(FILES_HEADER)
     93 	mkdir -p $(@D)
     94 	$(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
     95 
     96 $(BUILD_DIR)/engine/assets/%.o: $(BUILD_DIR)/engine/assets/%.c $(CONFIG_HEADER)
     97 	mkdir -p $(@D)
     98 	$(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
     99 
    100 $(BUILD_DIR)/runtime/%.o: %.c $(CONFIG_HEADER)
    101 	mkdir -p $(@D)
    102 	$(CC) $(CFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
    103 
    104 $(BUILD_DIR)/runtime/%.o: %.S $(CONFIG_HEADER)
    105 	mkdir -p $(@D)
    106 	$(CC) $(CFLAGS) $(ASFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
    107 
    108 $(BUILD_DIR)/runtime/%.o: %.s $(CONFIG_HEADER)
    109 	mkdir -p $(@D)
    110 	$(CC) $(CFLAGS) $(ASFLAGS) -I$(ENGINE_DIR)/include -I$(BUILD_DIR)/engine/include -MMD -MP -c $< -o $@
    111 
    112 $(ENGINE_LIB): $(ALL_ENGINE_OBJS)
    113 	mkdir -p $(@D)
    114 	rm -f $@
    115 	$(AR) rcs $@ $^
    116 
    117 ifneq ($(NO_DEFAULT_LINK),1)
    118 $(OUT): $(RUNTIME_OBJS) $(ENGINE_LIB)
    119 	mkdir -p $(@D)
    120 	$(CC) $(CFLAGS) $(RUNTIME_OBJS) $(ENGINE_LIB) $(LDFLAGS) $(LDLIBS) -o $@
    121 endif
    122 
    123 clean:
    124 	rm -rf $(BUILD_DIR)/engine $(BUILD_DIR)/runtime $(OUT)
    125 
    126 DEPS := $(ALL_ENGINE_OBJS:.o=.d) $(RUNTIME_OBJS:.o=.d)
    127 -include $(DEPS)