144 lines
4.4 KiB
Makefile
144 lines
4.4 KiB
Makefile
# Recursive Directory Digesting Makefile V1.0
|
|
# === Project Settings ===
|
|
# Change PROJECT and VERSION here — VERSION flows into the about screen and archive names.
|
|
PROJECT := soundThing
|
|
VERSION := 0.9.8-RC
|
|
CFLAGS := -Wall -Wextra -std=c11 -O2 -DAPP_VERSION=\"$(VERSION)\"
|
|
# Preprocessor flags (deps only here)
|
|
CPPFLAGS := -MMD -MP
|
|
|
|
# === Platform Selection ===
|
|
# Build for Linux (default): make
|
|
# Cross-compile for Windows: make PLATFORM=windows
|
|
PLATFORM ?= linux
|
|
|
|
ifeq ($(PLATFORM),windows)
|
|
CC := x86_64-w64-mingw32-gcc
|
|
BIN_NAME := $(PROJECT).exe
|
|
# Point RAYLIB_WIN at the extracted raylib-*_win64_mingw-w64 directory, e.g.:
|
|
# make PLATFORM=windows RAYLIB_WIN=/opt/raylib-win64
|
|
# RAYLIB_WIN ?=
|
|
RAYLIB_WIN = /home/qwhilla/projects/externalLibraries/win64/raylib
|
|
ifneq ($(RAYLIB_WIN),)
|
|
CPPFLAGS += -I$(RAYLIB_WIN)/include
|
|
LDFLAGS := -L$(RAYLIB_WIN)/lib -lraylib -lm -lpthread -lopengl32 -lwinmm -lgdi32 -lws2_32 -static
|
|
else
|
|
LDFLAGS := -lraylib -lm -lpthread -lopengl32 -lwinmm -lgdi32 -lws2_32 -static
|
|
endif
|
|
MIDI_SRC := midi_windows.c
|
|
WINDRES := x86_64-w64-mingw32-windres
|
|
WIN_RES = $(OBJ_DIR)/icon_res.o
|
|
else
|
|
CC := gcc
|
|
BIN_NAME := $(PROJECT)
|
|
LDFLAGS := -lraylib -lm -ldl -lpthread -lGL -lrt -lX11 -lasound
|
|
MIDI_SRC := midi_linux.c
|
|
WIN_RES :=
|
|
endif
|
|
|
|
# === Distribution ===
|
|
DIST_NAME := SoundThing-$(PLATFORM)-v$(VERSION)
|
|
ifeq ($(PLATFORM),windows)
|
|
ARCHIVE_CMD = zip -r "$(DIST_NAME).zip" "$(DIST_NAME)"
|
|
ARCHIVE_EXT = zip
|
|
else
|
|
ARCHIVE_CMD = tar czf "$(DIST_NAME).tar.gz" "$(DIST_NAME)"
|
|
ARCHIVE_EXT = tar.gz
|
|
endif
|
|
|
|
# === Directory Structure ===
|
|
SRC_DIR := source
|
|
OBJ_DIR := build
|
|
BIN_DIR := bin
|
|
INC_DIR := include
|
|
|
|
# === Discover headers recursively ===
|
|
INC_SUBDIRS := $(shell find $(INC_DIR) -type d)
|
|
CPPFLAGS += $(addprefix -I,$(INC_SUBDIRS))
|
|
|
|
# === Discover sources (exclude platform-split MIDI files, add the right one) ===
|
|
SRC_AUTO := $(shell find $(SRC_DIR) -type f -name '*.c' ! -name 'midi_*.c' ! -name '*.old')
|
|
SRC := $(SRC_AUTO) $(SRC_DIR)/$(MIDI_SRC)
|
|
# Map source paths to object paths (mirror folders under build/)
|
|
OBJ := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC))
|
|
DEP := $(OBJ:.o=.d)
|
|
BIN := $(BIN_DIR)/$(BIN_NAME)
|
|
|
|
# === Embedded assets ===
|
|
SPRITES_DATA := $(SRC_DIR)/sprites_data.c
|
|
FONT_DATA := $(SRC_DIR)/font_data.c
|
|
ICON_DATA := $(SRC_DIR)/icon_data.c
|
|
|
|
# === Rules ===
|
|
.PHONY: all clean run dirs dist
|
|
|
|
all: dirs $(SPRITES_DATA) $(FONT_DATA) $(ICON_DATA) $(BIN)
|
|
|
|
dirs:
|
|
@mkdir -p $(BIN_DIR)
|
|
@mkdir -p $(sort $(dir $(OBJ))) # create object subdirs that mirror source/
|
|
|
|
# Link objects into final executable
|
|
$(BIN): $(OBJ) $(WIN_RES)
|
|
$(CC) $(OBJ) $(WIN_RES) -o $@ $(LDFLAGS)
|
|
@echo "Linked -> $@"
|
|
|
|
# Compile each .c into a .o, with auto header deps
|
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
|
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
|
@echo "Compiled -> $@"
|
|
|
|
# Run the program
|
|
run: all
|
|
@echo "Running $(BIN)..."
|
|
@$(BIN)
|
|
|
|
# Clean build artifacts
|
|
clean:
|
|
@rm -rf $(OBJ_DIR) $(BIN)
|
|
@echo "Clean complete."
|
|
|
|
# Package a release archive: make dist / make dist PLATFORM=windows
|
|
dist: all
|
|
rm -rf "$(DIST_NAME)"
|
|
mkdir -p "$(DIST_NAME)"
|
|
cp "$(BIN)" "$(DIST_NAME)/"
|
|
cp -r patches "$(DIST_NAME)/"
|
|
rm -f "$(DIST_NAME)/patches/favorites.txt"
|
|
$(ARCHIVE_CMD)
|
|
rm -rf "$(DIST_NAME)"
|
|
@echo "Packaged -> $(DIST_NAME).$(ARCHIVE_EXT)"
|
|
|
|
# Include auto-generated dependency files (if present)
|
|
-include $(DEP)
|
|
|
|
# Regenerate embedded sprite data when the PNG changes
|
|
$(SPRITES_DATA): assets/sprites.png
|
|
xxd -i $< | sed 's/assets_sprites_png/sprites_png/g' > $@
|
|
@echo "Generated -> $@"
|
|
|
|
# Regenerate embedded font data when the PNG changes
|
|
$(FONT_DATA): assets/myFont.png
|
|
xxd -i $< | sed 's/assets_myFont_png/font_png/g' > $@
|
|
@echo "Generated -> $@"
|
|
|
|
# Regenerate embedded icon data when the PNG changes
|
|
$(ICON_DATA): assets/NPNGear.png
|
|
xxd -i $< | sed 's/assets_NPNGear_png/icon_png/g' > $@
|
|
@echo "Generated -> $@"
|
|
|
|
# Generate .ico from PNG using pure Python3 stdlib (no Pillow required)
|
|
assets/NPNGear.ico: assets/NPNGear.png
|
|
python3 -c "import struct; d=open('$<','rb').read(); \
|
|
hdr=struct.pack('<HHH',0,1,1); \
|
|
ent=struct.pack('<BBBBHHII',128,128,0,0,1,32,len(d),22); \
|
|
open('$@','wb').write(hdr+ent+d)"
|
|
@echo "Generated -> $@"
|
|
|
|
# Compile Windows resource (icon.rc -> icon_res.o), only when cross-compiling
|
|
ifeq ($(PLATFORM),windows)
|
|
$(WIN_RES): icon.rc assets/NPNGear.ico
|
|
$(WINDRES) $< -o $@
|
|
@echo "Compiled resource -> $@"
|
|
endif
|