.SUFFIXES: .INTERMEDIATE: .SECONDARY: .PHONY: all clean MAKEFILE_PATH := $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))) DEBUG = -g CSTD += -std=gnu23 CXXSTD += -std=gnu++23 CFLAGS += -Wall -Werror -Wfatal-errors CFLAGS += -Wno-error=unused-function CFLAGS += -Wno-error=unused-const-variable CFLAGS += -Wno-error=unused-but-set-variable CFLAGS += -Wno-error=unused-variable CFLAGS += -I$(MAKEFILE_PATH)/include CFLAGS += -I$(MAKEFILE_PATH)/puzzle CXXFLAGS += -fno-exceptions #CFLAGS += -DDEBUG_BUTTONS #CFLAGS += -DDEBUG_AXES LDFLAGS += -nostdlib++ -lm -static-libgcc ifeq ($(OS),Windows_NT) LDFLAGS += -Wl,--subsystem,windows -mwindows endif ifndef GLFW $(error GLFW undefined) endif ifdef I386 ARCH='-m32' endif ifeq ($(shell uname),Linux) LDFLAGS += -z noexecstack ifdef I386 OBJARCH = -O elf32-i386 -B i386 else OBJARCH = -O elf64-x86-64 -B i386:x86-64 endif else ifdef I386 OBJARCH += -O pe-i386 -B i386 else OBJARCH += -O pe-x86-64 -B i386:x86-64 endif endif # ifeq ($(shell uname),Linux) DEPFLAGS = -MMD -MP OPT = -Og all: main define BUILD_BINARY_O objcopy \ -I binary $(OBJARCH) \ --rename-section .data=.data.$(basename $@) \ $< $@ endef makefile_path := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) makefile_relative = $(shell realpath --relative-to $(makefile_path) $(1)) as_obj_binary = $(subst -,_,$(subst .,_,$(subst /,_,$(subst .h,,$(call makefile_relative,$(1)))))) as_obj_binary_p = _binary_$(call as_obj_binary,$(1)) define BUILD_BINARY_H @echo gen $(call makefile_relative,$@) @echo '#pragma once' > $@ @echo '' >> $@ @echo '#include ' >> $@ @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 'extern uint32_t $(call as_obj_binary_p,$<)_size __asm("$(call as_obj_binary_p,$<)_size");' >> $@ @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 ($(call as_obj_binary,$<)_end - $(call as_obj_binary,$<)_start)' >> $@ @echo '' >> $@ @echo '#ifdef __cplusplus' >> $@ @echo '}' >> $@ @echo '#endif' >> $@ endef %.glsl.o: %.glsl $(BUILD_BINARY_O) include/%.glsl.h: src/%.glsl $(BUILD_BINARY_H) %.data.o: %.data $(BUILD_BINARY_O) include/%.data.h: src/%.data $(BUILD_BINARY_H) %.data.pal.o: %.data.pal $(BUILD_BINARY_O) include/%.data.pal.h: src/%.data.pal $(BUILD_BINARY_H) %/input.o: %/input $(BUILD_BINARY_O) %/input.h: %/input $(BUILD_BINARY_H) clean: rm -f *.o *.d *.gch rm -f main %.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 $@ MAIN_OBJS = \ src/main.o \ src/glad.o \ src/opengl.o \ $(patsubst %.glsl,%.glsl.o,$(wildcard src/shader/*.glsl)) \ $(GLFW) main: $(MAIN_OBJS) $(CXX) $^ $(CXXFLAGS) $(ARCH) -o $@ $(LDFLAGS) #-include $(shell find -type f -name 'src/*.d') .SUFFIXES: .INTERMEDIATE: .SECONDARY: .PHONY: all clean %: RCS/%,v %: RCS/% %: %,v %: s.% %: SCCS/s.%