diff --git a/Makefile b/Makefile index 820687f..b598665 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +export + SHELL = /usr/bin/env bash ROOT := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))) @@ -9,20 +11,22 @@ endif include $(ROOT)/config.mk # -# User config +# User settings # -BUILD_DIR_NAME = build +BUILD_DIR = build SOURCE_DIR = src CORE_DIR = core -HOST_DIR = host +ASSETS_DIR = assets +ASSET_BUILDER_DIR = asset_builder OUTPUT = 2D_Engine ASSET_OUTPUT = game.data +ASSET_BUILDER_OUTPUT = asset_builder/asset_builder ifneq ($(DEBUG),) -CFLAGS += -O1 -g -DDEBUG=$(DEBUG) -Wextra -Wall --pedantic -Wno-missing-braces \ +TARGET_HOST_CFLAGS += -O1 -g -DDEBUG=$(DEBUG) -Wextra -Wall --pedantic -Wno-missing-braces \ -Wno-missing-field-initializers -Wformat=2 -Wswitch-default -Wswitch \ -Wcast-align -Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \ -Wstrict-prototypes -Winline -Wundef -Wnested-externs -Wcast-qual \ @@ -34,11 +38,21 @@ endif # End # -# Relocate build dir -BUILD_DIR := $(ROOT)/$(BUILD_DIR_NAME)/$(HOST) +# Relocate vars +BUILD_DIR := $(ROOT)/$(BUILD_DIR)/$(TARGET_HOST) + +SOURCE_DIR := $(ROOT)/$(SOURCE_DIR) +CORE_DIR := $(ROOT)/$(CORE_DIR) +ASSETS_DIR := $(ROOT)/$(ASSETS_DIR) +ASSET_BUILDER_DIR := $(ROOT)/$(ASSET_BUILDER_DIR) + +OUTPUT := $(BUILD_DIR)/$(OUTPUT) +LIBCORE := $(BUILD_DIR)/$(LIBCORE) +ASSET_OUTPUT := $(BUILD_DIR)/$(ASSET_OUTPUT) +ASSET_BUILDER_OUTPUT := $(BUILD_DIR)/$(ASSET_BUILDER_OUTPUT) # Verbosity -Q := @ +export Q := @ ifeq ($(VERBOSE), 1) Q := endif @@ -49,21 +63,20 @@ YELLOW := \033[33m RESET := \033[m # Default targets -all: setup $(BUILD_DIR)/$(OUTPUT) +all: $(OUTPUT) $(ASSET_OUTPUT) -include $(ROOT)/$(SOURCE_DIR)/Makefile -include $(ROOT)/$(CORE_DIR)/Makefile +$(OUTPUT): + $(Q)cd $(SOURCE_DIR) && $(MAKE) $@ -setup: - $(eval export TOTAL_BUILD_FILES := $(shell echo $$(($$(make -n $(OBJECTS) $(CORE_OBJECTS) 2>/dev/null | grep -c $(CC)) + 2)))) - $(Q)mkdir -p $(dir $(OBJECTS) $(CORE_OBJECTS)) +$(ASSET_OUTPUT): + $(Q)cd $(ASSETS_DIR) && $(MAKE) $@ .PHONY: clean run print-var-% clean: $(Q)rm -rf $(dir $(BUILD_DIR)) run: all - $(Q)cd $(BUILD_DIR) && ./$(OUTPUT) + $(Q)cd $(BUILD_DIR) && ./$(notdir $(OUTPUT)) print-var-% : @echo $($*) diff --git a/assets/Makefile b/assets/Makefile index b6afc74..cd868c9 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -9,37 +9,22 @@ ASSETS := \ maps/dungeon_entry.map \ maps/dungeon_room_1.map -ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS)) +OBJECTS := $(ASSETS:%=$(BUILD_DIR)/$(notdir $(ASSETS_DIR))/%.o) -ASSETS_OBJECTS = $(ASSETS:%=$(BUILD_DIR)/%.o) +ifeq ($(TOTAL_BUILD_FILES),) +TOTAL_BUILD_FILES := $(shell echo $$(($$($(MAKE) -n $(OBJECTS) TOTAL_BUILD_FILES=1 2>/dev/null | grep -c Building) + 1))) +endif -ASSET_BUILDER_DIR = $(ASSETS_DIR)/asset_builder/src -ASSET_BUILDER_OUTPUT = $(BUILD_DIR)/$(ASSETS_DIR)/asset_builder/asset_builder -include $(ASSET_BUILDER_DIR)/Makefile - -build_assets: setup_asset build_asset_builder count_assets_build asset_end - -# Current file nb to process -CURRENT_ASSET_FILE := 0 - -# Count nb of files to build -count_assets_build: - $(eval export TOTAL_ASSETS_FILES := $(shell echo $$(($$(make -n $(ASSETS_OBJECTS) 2>/dev/null | grep -c "Building") + 1)))) - -setup_asset: - @echo "Building $(notdir $(ASSET_OUTPUT))" - $(Q)mkdir -p $(dir $(ASSETS_OBJECTS)) - -$(ASSET_OUTPUT): $(ASSETS_OBJECTS) $(ASSET_BUILDER_OUTPUT) +$(ASSET_OUTPUT): $(OBJECTS) $(ASSET_BUILDER_OUTPUT) @echo -e "[100%] $(YELLOW)Building $(notdir $(ASSET_OUTPUT))$(RESET)" - $(Q)$(ASSET_BUILDER_OUTPUT) $@ $(ASSETS_OBJECTS) + $(Q)$(ASSET_BUILDER_OUTPUT) $@ $(OBJECTS) -# Build .o files -$(BUILD_DIR)/$(ASSETS_DIR)/%.o: $(ASSETS_DIR)/% $(ASSET_BUILDER_OUTPUT) - $(eval CURRENT_ASSET_FILE := $(shell echo $$(($(CURRENT_ASSET_FILE)+1)))) - $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_FILE)*100/$(TOTAL_ASSETS_FILES))))) +$(BUILD_DIR)/$(notdir $(ASSETS_DIR))/%.o: $(ASSETS_DIR)/% $(ASSET_BUILDER_OUTPUT) + $(Q)mkdir -p $(dir $@) + $(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1)))) + $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES))))) @echo -e "[$(PERCENTAGE)%] $(GREEN)Building ASSET object $@$(RESET)" $(Q)$(ASSET_BUILDER_OUTPUT) $@ -c $< -asset_end: $(ASSET_OUTPUT) - @echo "Built target $(notdir $(ASSET_OUTPUT))" +$(ASSET_BUILDER_OUTPUT): + $(Q)cd $(ASSET_BUILDER_DIR) && $(MAKE) $@ diff --git a/configure b/configure index e7b4f05..78c084f 100755 --- a/configure +++ b/configure @@ -93,70 +93,84 @@ case "${OSTYPE}" in ;; esac -echo "Detected current host: ${CURRENT_HOST}" +echo "Configuring for current host: ${CURRENT_HOST}" if [ "${TARGET_HOST}" = "guess" ]; then TARGET_HOST=${CURRENT_HOST} fi -case "${TARGET_HOST}" in - linux|fxcg50) - echo "Configuring for target: ${TARGET_HOST}" +case "${CURRENT_HOST}" in + linux) + ASSET_BUILDER_CC="gcc" + ASSET_BUILDER_AR="ar" + ASSET_BUILDER_CFLAGS="--std=c17 -O2 \$(shell pkg-config --cflags libpng json-c)" + ASSET_BUILDER_LDFLAGS="\$(shell pkg-config --libs libpng json-c)" ;; *) - print_error "Unsupported target host: ${TARGET_HOST}" + print_error "Compiling from ${CURRENT_HOST} is not supported yet." ;; esac -echo +case "${TARGET_HOST}" in + linux) + echo "Configuring for target: ${TARGET_HOST}" -if [ "${CURRENT_HOST}" != "${TARGET_HOST}" ]; then - CROSS_COMPILE=TRUE -fi - -if [ -n "${CROSS_COMPILE}" ]; then - case "${TARGET_HOST}" in - fxcg50) - case "${CURRENT_HOST}" in - linux) - ;; - *) - print_error "Cross compiling from ${CURRENT_HOST} for ${TARGET_HOST} is not supported yet." - ;; - esac - - CC="sh-elf-gcc" - AR="sh-elf-ar" - LIBCORE="libcore.a" - ;; - esac -else - case "${TARGET_HOST}" in + case "${CURRENT_HOST}" in linux) - CC="gcc" - AR="ar" - CFLAGS="--std=c17 -Os -DASSET_FILE_NAME=\\\"\$(notdir \$(ASSET_OUTPUT))\\\" -D_GNU_SOURCE=1 \$(shell pkg-config --cflags sdl3)" - LDFLAGS="\$(shell pkg-config --libs sdl3) -lm" - - LIBCORE="libcore.a" ;; *) + print_error "Cross compiling from ${CURRENT_HOST} to ${TARGET_HOST} is not supported yet." ;; esac -fi + + TARGET_CC="gcc" + TARGET_AR="ar" + TARGET_CFLAGS="--std=c17 -Os -DASSET_FILE_NAME=\\\"\$(notdir \$(ASSET_OUTPUT))\\\" -D_GNU_SOURCE=1 \$(shell pkg-config --cflags sdl3)" + TARGET_LDFLAGS="\$(shell pkg-config --libs sdl3) -lm" + TARGET_LIBCORE="libcore.a" + ;; + + fxcg50) + echo "Configuring for target: ${TARGET_HOST}" + + case "${CURRENT_HOST}" in + linux) + ;; + *) + print_error "Cross compiling from ${CURRENT_HOST} to ${TARGET_HOST} is not supported yet." + ;; + esac + + TARGET_CC="sh-elf-gcc" + TARGET_AR="sh-elf-ar" + TARGET_CFLAGS="--std=c17 -O3" + TARGET_LDFLAGS="" + TARGET_LIBCORE="libcore.a" + ;; + *) + print_error "Unsupported target host: ${TARGET_HOST}" +esac echo "Writing config file." echo echo "${CONFIG_FILE}:" echo "\`\`\`" -echo "HOST = ${TARGET_HOST}" | tee ${CONFIG_FILE} -echo | tee -a ${CONFIG_FILE} -echo "CC = ${CC}" | tee -a ${CONFIG_FILE} -echo "AR = ${AR}" | tee -a ${CONFIG_FILE} -echo "CFLAGS = ${CFLAGS}" | tee -a ${CONFIG_FILE} -echo "LDFLAGS = ${LDFLAGS}" | tee -a ${CONFIG_FILE} -echo | tee -a ${CONFIG_FILE} -echo "LIBCORE = ${LIBCORE}" | tee -a ${CONFIG_FILE} +tee ${CONFIG_FILE} </dev/null | grep -c Building) + 1))) +endif + +$(LIBCORE): $(OBJECTS) $(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1)))) $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES))))) @echo -e "[$(PERCENTAGE)%] $(YELLOW)Creating Static Lib $@$(RESET)" - $(Q)$(AR) rcs $@ $(CORE_OBJECTS) + $(Q)$(TARGET_HOST_AR) rcs $@ $(OBJECTS) -$(BUILD_DIR)/$(CORE_DIR)/%.c.o: $(ROOT)/$(CORE_DIR)/%.c +$(BUILD_DIR)/$(notdir $(CORE_DIR))/%.o: $(CORE_DIR)/% + $(Q)mkdir -p $(dir $@) $(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1)))) $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES))))) @echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)" - $(Q)$(CC) $(CFLAGS) $(CORE_INCLUDES:%=-I%) -MMD -MP -c $< -o $@ + $(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@ --include $(CORE_OBJECTS:.o=.d) +-include $(OBJECTS:.o=.d) diff --git a/core/host/linux/Makefile b/core/host/linux/Makefile index 39f3124..7b7c188 100644 --- a/core/host/linux/Makefile +++ b/core/host/linux/Makefile @@ -1,7 +1,5 @@ -CORE_SOURCES += \ - $(HOST_DIR)/$(HOST)/display.c \ - $(HOST_DIR)/$(HOST)/vector2d.c \ - $(HOST_DIR)/$(HOST)/texture.c - -CORE_INCLUDES += \ - $(CORE_DIRE) \ No newline at end of file +SOURCES += $(addprefix host/$(TARGET_HOST)/, \ + display.c \ + vector2d.c \ + texture.c \ +) diff --git a/src/Makefile b/src/Makefile index feb2f79..153c168 100644 --- a/src/Makefile +++ b/src/Makefile @@ -14,18 +14,26 @@ SOURCES += \ INCLUDES += \ $(SOURCE_DIR)/components \ $(CORE_DIR) \ - $(CORE_DIR)/$(HOST_DIR)/$(HOST) + $(CORE_DIR)/host/$(TARGET_HOST) -OBJECTS := $(SOURCES:%=$(BUILD_DIR)/$(SOURCE_DIR)/%.o) +OBJECTS := $(SOURCES:%=$(BUILD_DIR)/$(notdir $(SOURCE_DIR))/%.o) -$(BUILD_DIR)/$(OUTPUT): $(BUILD_DIR)/$(LIBCORE) $(OBJECTS) - @echo -e "[100%] $(YELLOW)Linking $(OUTPUT)$(RESET)" - $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(BUILD_DIR)/$(LIBCORE) -o $@ +ifeq ($(TOTAL_BUILD_FILES),) +TOTAL_BUILD_FILES := $(shell echo $$(($$($(MAKE) -n $(OBJECTS) TOTAL_BUILD_FILES=1 2>/dev/null | grep -c Building) + 1))) +endif -$(BUILD_DIR)/$(SOURCE_DIR)/%.c.o: $(ROOT)/$(SOURCE_DIR)/%.c +$(OUTPUT): $(OBJECTS) $(LIBCORE) + @echo -e "[100%] $(YELLOW)Linking $(notdir $(OUTPUT))$(RESET)" + $(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(TARGET_HOST_LDFLAGS) $(OBJECTS) -L$(BUILD_DIR) -lcore -o $@ + +$(BUILD_DIR)/$(notdir $(SOURCE_DIR))/%.o: $(SOURCE_DIR)/% + $(Q)mkdir -p $(dir $@) $(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1)))) $(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES))))) @echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)" - $(Q)$(CC) $(CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@ + $(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@ + +$(LIBCORE): + $(Q)cd $(CORE_DIR) && $(MAKE) $@ -include $(OBJECTS:.o=.d)