roo_e/Makefile
2025-12-21 19:39:05 -06:00

142 lines
4.2 KiB
Makefile

#
# Roo/E, the Kangaroo Punch Portable GUI Toolkit
# Copyright (C) 2026 Scott Duensing
#
# http://kangaroopunch.com
#
#
# This file is part of Roo/E.
#
# Roo/E is free software: you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# Roo/E is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Roo/E. If not, see <https://www.gnu.org/licenses/>.
#
# This Makefile is terrible. I have no idea what I'm doing.
# Tools
CC := gcc
AR := ar
DXE3GEN := dxe3gen
EXE2COFF := exe2coff
# Compiler Settings
CFLAGS := -DPLATFORM_DOS -Wall -MD
LDFLAGS :=
# Output Directories
OBJ := obj
BIN := bin
DYN := $(BIN)/dyn
APP := $(BIN)/app
SDK := $(BIN)/sdk
FNT := $(BIN)/fonts
FIN := font/in
# Include Paths
INC := include 3rdparty 3rdparty/pthreads/include roo_e
# Font Compiler Source and Target - NOTE: This is a Linux binary!
FONT_ELF := font
FONT_SRC := $(shell find font/src -name '*.c')
FONT_OBJ := $(FONT_SRC:%=$(OBJ)/%.o)
FONT_LIB := -lm
# Roo/E Source and Target
ROOE_EXE := roo_e.exe
ROOE_SRC := $(shell find roo_e -name '*.c')
ROOE_OBJ := $(ROOE_SRC:%=$(OBJ)/%.o)
ROOE_LIB := 3rdparty/pthreads/lib/libgthreads.a -lgcc -lm
# MultiPlayer Game Client
MPGC_EXE := kpsmpgc.app
MPGC_SRC := $(shell find kpsmpgc -name '*.c')
MPGC_OBJ := $(MPGC_SRC:%=$(OBJ)/%.o)
MPGC_LIB :=
DYNS := kpsvideo stbimage
FONTS := vga4x8 vga8x8 vga8x14 vga8x16
# Wiring
INC_FLAGS := $(addprefix -I,$(INC))
CFLAGS += $(INC_FLAGS)
APP_OBJS := $(ROOE_OBJ) $(MPGC_OBJ)
FONTS := $(addprefix $(FNT)/,$(addsuffix .fnt,$(FONTS)))
FONT_PNGS := $(subst .fnt,.png,$(subst $(FNT),$(FIN),$(FONTS)))
DYN_FILES := $(foreach DIR,$(DYNS),$(DYN)/$(DIR).dyn)
DYN_SOURCE := $(foreach DIR,$(DYNS),$(shell find dyn/$(DIR) -name '*.c' -or -name '*.h'))
# Force User to Run This Using Toolchains
.PHONY: use_build_script
use_build_script:
@echo "Use build.sh to cross-compile, not make."
# Build Everything
.PHONY: dos
dos: $(BIN)/$(ROOE_EXE) $(APP)/$(MPGC_EXE) $(DYN_FILES) sdk_extra
.PHONY: linux
linux: $(FONTS)
# Remove Everything
.PHONY: clean
clean:
rm -rf $(OBJ) $(BIN)
# Font Compiler Target
$(BIN)/$(FONT_ELF): $(FONT_OBJ) Makefile
mkdir -p $(dir $@) $(BIN)/fonts
$(CC) $(FONT_OBJ) -o $@ $(LDFLAGS) $(FONT_LIB)
$(FONTS) &: $(FONT_PNGS) $(BIN)/$(FONT_ELF)
cd $(BIN) && ./$(FONT_ELF)
# Roo/E Target
$(BIN)/$(ROOE_EXE): $(ROOE_OBJ) Makefile
mkdir -p $(dir $@)
$(CC) $(ROOE_OBJ) -o $@ $(LDFLAGS) $(ROOE_LIB)
# Embed the DPMI Server
$(EXE2COFF) $(BIN)/$(ROOE_EXE)
cat 3rdparty/CWSDPMI/CWSDSTUB.EXE $(basename $(BIN)/$(ROOE_EXE)) > $(BIN)/$(ROOE_EXE)
rm $(basename $(BIN)/$(ROOE_EXE))
# MPGC Target
$(APP)/$(MPGC_EXE): $(MPGC_OBJ) Makefile
mkdir -p $(dir $@)
$(DXE3GEN) -o $@ $(MPGC_OBJ) -U $(LDFLAGS) $(MPGC_LIB)
# DYN Targets - This is NOT how make should be used.
.PHONY: dyns
$(DYN_FILES): $(DYN_SOURCE) Makefile
echo $(DYN_SOURCE)
mkdir -p $(DYN) $(OBJ)/dyn/$(basename $(notdir $@)) $(SDK)/lib $(SDK)/include
$(foreach CFILE,$(shell find dyn/$(basename $(notdir $@)) -name '*.c'),$(CC) $(CFLAGS) -o $(OBJ)/dyn/$(basename $(notdir $@))/$(subst dyn/$(basename $(notdir $@))/,,$(CFILE).o) -c $(CFILE) && ) true
$(AR) rcs $(OBJ)/dyn/$(basename $(notdir $@)).a $(OBJ)/dyn/$(basename $(notdir $@))/*.o
$(DXE3GEN) -o $@ -Y $@.a --whole-archive -U $(OBJ)/dyn/$(basename $(notdir $@)).a $(LDFLAGS)
mv $@.a $(SDK)/lib/.
if [ ! -z "$(shell find dyn/$(basename $(notdir $@)) -name '*.h')" ]; then cp $(shell find dyn/$(basename $(notdir $@)) -name '*.h') $(SDK)/include/.; fi
# Extra SDK Files
.PHONEY: sdk_extra
sdk_extra: 3rdparty/stbds.h 3rdparty/stbimage.h Makefile
cp 3rdparty/stbds.h 3rdparty/stbimage.h ${SDK}/include/.
cp roo_e/*.h ${SDK}/include/.
# Build C Files
$(OBJ)/%.c.o: %.c
mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
# Track Header Changes in APPs and Roo/E
-include $(APP_OBJS:.o=.d)