# Makefile for DOOM (doomgeneric) on MontaukOS # Copyright (c) 2025 Daniel Hammer MAKEFLAGS += -rR .SUFFIXES: # ---- Toolchain ---- TOOLCHAIN_PREFIX := $(shell cd ../../.. && pwd)/toolchain/local/bin/x86_64-elf- ifneq ($(wildcard $(TOOLCHAIN_PREFIX)gcc),) CC := $(TOOLCHAIN_PREFIX)gcc CXX := $(TOOLCHAIN_PREFIX)g++ LD := $(TOOLCHAIN_PREFIX)gcc else CC := gcc CXX := g++ LD := gcc endif # ---- Paths ---- DOOM_SRC := ../../../doomgeneric/doomgeneric LIBC_INC := ../../include/libc PROG_INC := ../../include LIBDIR := ../../lib LOADER_LIB := ../../lib/libloader LINK_LD := ../../link.ld BINDIR := ../../bin OBJDIR := obj # ---- Compiler flags ---- CFLAGS := \ -std=gnu11 \ -g -O2 -pipe \ -Wall \ -Wno-unused-parameter \ -Wno-unused-variable \ -Wno-missing-field-initializers \ -Wno-sign-compare \ -Wno-pointer-sign \ -nostdinc \ -ffreestanding \ -fno-stack-protector \ -fno-stack-check \ -fno-PIC \ -ffunction-sections \ -fdata-sections \ -m64 \ -march=x86-64 \ -msse \ -msse2 \ -mno-red-zone \ -mcmodel=small \ -DNORMALUNIX \ -DLINUX \ -DFEATURE_SOUND \ -isystem $(LIBC_INC) \ -I . \ -I $(PROG_INC) \ -I $(DOOM_SRC) \ -isystem $(shell $(CC) -print-file-name=include) CXXFLAGS := \ -std=gnu++20 \ -g -O2 -pipe \ -Wall \ -Wno-unused-parameter \ -nostdinc \ -ffreestanding \ -fno-stack-protector \ -fno-stack-check \ -fno-PIC \ -fno-rtti \ -fno-exceptions \ -ffunction-sections \ -fdata-sections \ -m64 \ -march=x86-64 \ -msse \ -msse2 \ -mno-red-zone \ -mcmodel=small \ -isystem $(LIBC_INC) \ -I . \ -I $(PROG_INC) \ -isystem ../../../kernel/freestnd-c-hdrs/x86_64/include \ -isystem ../../../kernel/freestnd-cxx-hdrs/x86_64/include # ---- Linker flags ---- LDFLAGS := \ -nostdlib \ -static \ -Wl,--build-id=none \ -Wl,--gc-sections \ -Wl,-m,elf_x86_64 \ -z max-page-size=0x1000 \ -T $(LINK_LD) # ---- DOOM source files (excluding platform-specific ports and sound backends) ---- DOOM_SRCS := \ am_map.c \ d_event.c \ d_items.c \ d_iwad.c \ d_loop.c \ d_main.c \ d_mode.c \ d_net.c \ doomdef.c \ doomgeneric.c \ doomstat.c \ dstrings.c \ dummy.c \ f_finale.c \ f_wipe.c \ g_game.c \ gusconf.c \ hu_lib.c \ hu_stuff.c \ i_cdmus.c \ i_endoom.c \ i_input.c \ i_joystick.c \ i_scale.c \ i_sound.c \ i_system.c \ i_timer.c \ i_video.c \ info.c \ m_argv.c \ m_bbox.c \ m_cheat.c \ m_config.c \ m_controls.c \ m_fixed.c \ m_menu.c \ m_misc.c \ m_random.c \ memio.c \ mus2mid.c \ p_ceilng.c \ p_doors.c \ p_enemy.c \ p_floor.c \ p_inter.c \ p_lights.c \ p_map.c \ p_maputl.c \ p_mobj.c \ p_plats.c \ p_pspr.c \ p_saveg.c \ p_setup.c \ p_sight.c \ p_spec.c \ p_switch.c \ p_telept.c \ p_tick.c \ p_user.c \ r_bsp.c \ r_data.c \ r_draw.c \ r_main.c \ r_plane.c \ r_segs.c \ r_sky.c \ r_things.c \ s_sound.c \ sha1.c \ sounds.c \ st_lib.c \ st_stuff.c \ statdump.c \ tables.c \ v_video.c \ w_checksum.c \ w_file.c \ w_file_stdc.c \ w_main.c \ w_wad.c \ wi_stuff.c \ z_zone.c # Local source files LOCAL_SRCS := doomgeneric_montauk.c i_sound_montauk.c LOCAL_CXX_SRCS := doom_wad_check.cpp # ---- Object files ---- DOOM_OBJS := $(addprefix $(OBJDIR)/,$(DOOM_SRCS:.c=.o)) LOCAL_OBJS := $(addprefix $(OBJDIR)/,$(LOCAL_SRCS:.c=.o)) LOCAL_CXX_OBJS := $(addprefix $(OBJDIR)/,$(LOCAL_CXX_SRCS:.cpp=.o)) ALL_OBJS := $(DOOM_OBJS) $(LOCAL_OBJS) $(LOCAL_CXX_OBJS) # ---- Target ---- TARGET := $(BINDIR)/apps/doom/doom.elf .PHONY: all clean all: $(TARGET) $(TARGET): $(ALL_OBJS) $(LINK_LD) Makefile mkdir -p $(BINDIR)/apps/doom $(LD) $(CFLAGS) $(LDFLAGS) $(ALL_OBJS) $(LOADER_LIB)/liblibloader.a $(LIBDIR)/libc/liblibc.a -o $@ # DOOM source files (from doomgeneric directory) $(OBJDIR)/%.o: $(DOOM_SRC)/%.c Makefile mkdir -p $(OBJDIR) $(CC) $(CFLAGS) -MMD -MP -c $< -o $@ # Local source files $(OBJDIR)/%.o: %.c Makefile mkdir -p $(OBJDIR) $(CC) $(CFLAGS) -MMD -MP -c $< -o $@ # Local C++ source files $(OBJDIR)/%.o: %.cpp Makefile mkdir -p $(OBJDIR) $(CXX) $(CXXFLAGS) -MMD -MP -c $< -o $@ clean: rm -rf $(OBJDIR) $(TARGET) # Auto-generated header dependency tracking (-MMD -MP). -include $(ALL_OBJS:.o=.d)