# Detect OS UNAME_S := $(shell uname -s) CFLAGS_COMMON = -MMD -MP -Wall -Wextra -I./shared $(shell pkg-config --cflags raylib) # Compiler ifeq ($(UNAME_S),Darwin) CC = gcc-15 CFLAGS = $(CFLAGS_COMMON) -pthread LDFLAGS = -pthread $(shell pkg-config --libs raylib) else ifeq ($(UNAME_S),Linux) CC = gcc CFLAGS = $(CFLAGS_COMMON) -pthread LDFLAGS = -pthread $(shell pkg-config --libs raylib) else # Windows (MSYS2 MinGW) CC = gcc CFLAGS = $(CFLAGS_COMMON) LDFLAGS = -lws2_32 $(shell pkg-config --libs raylib) endif SHARED_BUILD = build/shared SHARED_SRC = $(shell find shared -name "*.c") SHARED_OBJ = $(SHARED_SRC:shared/%.c=$(SHARED_BUILD)/%.o) # Directories SERVER_BUILD = build/server SERVER_TARGET = bin/server SERVER_SRC = $(shell find server -name "*.c") SERVER_OBJ = $(SERVER_SRC:server/%.c=$(SERVER_BUILD)/%.o) CLIENT_BUILD = build/client CLIENT_TARGET = bin/client CLIENT_SRC = $(shell find client -name "*.c") CLIENT_OBJ = $(CLIENT_SRC:client/%.c=$(CLIENT_BUILD)/%.o) # Raylib via pkg-config (works on macOS, Linux, MSYS2) CLIENT_CFLAGS = $(CFLAGS) CLIENT_LDFLAGS = $(LDFLAGS) # Windows needs extra libs sometimes ifeq ($(OS),Windows_NT) CLIENT_LDFLAGS += -lopengl32 -lgdi32 -lwinmm endif # Dependency files -include $(wildcard $(SHARED_BUILD)/*.d) -include $(wildcard $(SERVER_BUILD)/*.d) -include $(wildcard $(CLIENT_BUILD)/*.d) .PHONY: all clean server client all: $(SERVER_TARGET) $(CLIENT_TARGET) server: $(SERVER_TARGET) client: $(CLIENT_TARGET) # Create bin directory bin: mkdir -p bin $(SHARED_BUILD)/%.o: shared/%.c mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ # Link targets $(SERVER_TARGET): $(SERVER_OBJ) $(SHARED_OBJ) | bin $(CC) $(SERVER_OBJ) $(SHARED_OBJ) -o $(SERVER_TARGET) $(LDFLAGS) $(CLIENT_TARGET): $(CLIENT_OBJ) $(SHARED_OBJ) | bin $(CC) $(CLIENT_OBJ) $(SHARED_OBJ) -o $(CLIENT_TARGET) $(CLIENT_LDFLAGS) # Compile rules $(SERVER_BUILD)/%.o: server/%.c mkdir -p $(dir $@) $(CC) $(CFLAGS) -c $< -o $@ $(CLIENT_BUILD)/%.o: client/%.c mkdir -p $(dir $@) $(CC) $(CLIENT_CFLAGS) -c $< -o $@ # Clean clean: rm -rf build bin