APP := entropie VERSION := 2.50.0 PREFIX ?= /usr BINDIR ?= $(PREFIX)/bin DATADIR ?= $(PREFIX)/share/$(APP) DESTDIR ?= BUILD_DIR := build CC ?= cc PKG_CONFIG ?= pkg-config PKGS := sdl3 sdl3-ttf PKG_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(PKGS)) PKG_LIBS := $(shell $(PKG_CONFIG) --libs $(PKGS)) # C23 (GCC 14+, Clang 18+); older compilers know it as c2x (GCC 9+, Clang 9+) CSTD := $(shell echo 'int main(void){return 0;}' | $(CC) -std=c23 -x c -fsyntax-only - 2>/dev/null && echo c23 || echo c2x) CFLAGS ?= -O2 CFLAGS += -std=$(CSTD) -Wall -Wextra -Wpedantic -MMD -MP CPPFLAGS += -Isrc -I$(BUILD_DIR) $(PKG_CFLAGS) LDLIBS += $(PKG_LIBS) -lGL -lm SRCS := $(sort $(wildcard src/*.c src/*/*.c)) HDRS := $(sort $(wildcard src/*.h src/*/*.h)) ASSETS := $(sort $(wildcard assets/shaders/* assets/fonts/*)) OBJS := $(SRCS:src/%.c=$(BUILD_DIR)/%.o) # Short md5 over all sources and assets: changes whenever any file changes. BUILD_HASH := $(shell cat $(SRCS) $(HDRS) $(ASSETS) Makefile | md5sum | cut -c1-7) BUILD_INFO := $(BUILD_DIR)/build_info.h .PHONY: all clean install uninstall version FORCE all: $(APP) $(APP): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) @echo "$(APP) $(VERSION) (build $(BUILD_HASH))" $(BUILD_DIR)/%.o: src/%.c | $(BUILD_INFO) @mkdir -p $(dir $@) $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $< # Rewritten only when its content changes, so unrelated files don't rebuild. $(BUILD_INFO): FORCE @mkdir -p $(BUILD_DIR) @printf '#define APP_VERSION "%s"\n#define APP_BUILD "%s"\n#define ASSET_DIR "%s/"\n' \ "$(VERSION)" "$(BUILD_HASH)" "$(DATADIR)" > $@.tmp @if cmp -s $@.tmp $@; then rm -f $@.tmp; else mv $@.tmp $@; fi version: @echo "$(APP) $(VERSION) (build $(BUILD_HASH))" install: $(APP) install -Dm755 $(APP) $(DESTDIR)$(BINDIR)/$(APP) install -d $(DESTDIR)$(DATADIR)/shaders $(DESTDIR)$(DATADIR)/fonts install -m644 assets/shaders/* $(DESTDIR)$(DATADIR)/shaders/ install -m644 assets/fonts/* $(DESTDIR)$(DATADIR)/fonts/ uninstall: rm -f $(DESTDIR)$(BINDIR)/$(APP) rm -rf $(DESTDIR)$(DATADIR) clean: rm -rf $(BUILD_DIR) $(APP) -include $(OBJS:.o=.d)