new/Makefile
2025-12-18 18:44:36 -06:00

144 lines
3.4 KiB
Makefile

.SUFFIXES:
.INTERMEDIATE:
.SECONDARY:
.PHONY: all clean
ifndef GLFW
$(error GLFW undefined)
endif
MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST)))))
DEBUG = -g
CSTD += -std=gnu11
CXXSTD += -std=gnu++14
CFLAGS += -Wall -Werror -Wfatal-errors
CFLAGS += -Wno-error=unused-function
CFLAGS += -Wno-error=unused-variable
CFLAGS += -I$(MAKEFILE_PATH)/include
CFLAGS += -I$(dir $(GLFW))../include
CXXFLAGS += -fno-exceptions
LDFLAGS += -lm -static-libgcc
ifeq ($(shell uname),Linux)
LDFLAGS += -nostdlib++
endif
ifeq ($(OS),Windows_NT)
LDFLAGS += -Wl,--subsystem,windows -mwindows
endif
ifeq ($(shell uname),Darwin)
LDFLAGS += -framework Foundation -framework IOKit -framework AppKit
endif
DEPFLAGS = -MMD -MP
OPT = -Og
all: main
makefile_path := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
as_obj_binary = $(subst -,_,$(subst .,_,$(subst /,_,$(subst .h,,$(1)))))
as_obj_binary_p = _binary_$(call as_obj_binary,$(1))
define BUILD_BINARY_S
@echo build_binary_s $@
@echo '.section .rodata.$(call as_obj_binary_p,$<)' > $@
@echo '.global $(call as_obj_binary_p,$<)_start' >> $@
@echo '.global $(call as_obj_binary_p,$<)_end' >> $@
@echo '$(call as_obj_binary_p,$<)_start:' >> $@
@printf '\t.incbin "$<"\n' >> $@
@echo '$(call as_obj_binary_p,$<)_end:' >> $@
endef
define BUILD_BINARY_H
@echo build_binary_h $@
@echo '#pragma once' > $@
@echo '' >> $@
@echo '#include <stdint.h>' >> $@
@echo '' >> $@
@echo '#ifdef __cplusplus' >> $@
@echo 'extern "C" {' >> $@
@echo '#endif' >> $@
@echo '' >> $@
@echo 'extern uint32_t $(call as_obj_binary_p,$<)_start __asm("$(call as_obj_binary_p,$<)_start");' >> $@
@echo 'extern uint32_t $(call as_obj_binary_p,$<)_end __asm("$(call as_obj_binary_p,$<)_end");' >> $@
@echo '' >> $@
@echo '#define $(call as_obj_binary,$<)_start ((const char *)&$(call as_obj_binary_p,$<)_start)' >> $@
@echo '#define $(call as_obj_binary,$<)_end ((const char *)&$(call as_obj_binary_p,$<)_end)' >> $@
@echo '#define $(call as_obj_binary,$<)_size ((uintptr_t)$(call as_obj_binary,$<)_end - (uintptr_t)$(call as_obj_binary,$<)_start)' >> $@
@echo '' >> $@
@echo '#ifdef __cplusplus' >> $@
@echo '}' >> $@
@echo '#endif' >> $@
endef
%.glsl.s: %.glsl
$(BUILD_BINARY_S)
%.data.s: %.data
$(BUILD_BINARY_S)
%.data.pal.s: %.data.pal
$(BUILD_BINARY_S)
include/%.glsl.h: src/%.glsl
$(BUILD_BINARY_H)
include/%.data.h: %.data
$(BUILD_BINARY_H)
include/%.data.pal.h: %.data.pal
$(BUILD_BINARY_H)
include/model/%.h: model/%.obj
python $(HOME)/model_generator2/generate_indexed_cpp2.py \
$< $(notdir $(subst .obj,,$<)) > $@
clean:
rm -f *.o *.d *.gch
rm -f main
%.o: %.s
$(AS) $(AFLAGS) $< -o $@ $(TARGET)
%.o: %.cpp
$(CXX) $(CXXSTD) $(ARCH) $(CFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
%.o: %.c
$(CC) $(CSTD) $(ARCH) $(CFLAGS) $(CXXFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
SHADERS = $(shell find src/ -type f -name '*.glsl')
SHADER_OBJS = $(patsubst %,%.o,$(SHADERS))
SHADER_HEADERS = $(subst src/,include/,$(patsubst %,%.h,$(SHADERS)))
shaders: $(SHADER_HEADERS)
MAIN_OBJS = \
src/main.o \
src/gl.o \
src/make.o \
src/shader.o \
src/render.o \
src/state.o \
src/input.o \
model/palette.data.o \
$(SHADER_OBJS) \
$(GLFW)
main: $(MAIN_OBJS) | shaders
$(CXX) $^ $(CXXFLAGS) $(ARCH) -o $@ $(LDFLAGS)
-include $(shell find src/ -type f -name '*.d')
.SUFFIXES:
.INTERMEDIATE:
.SECONDARY:
.PHONY: all clean shaders
%: RCS/%,v
%: RCS/%
%: %,v
%: s.%
%: SCCS/s.%