1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
|
# Simple Makefile for glamac - SDL3 version
# Supports: Arch Linux native, Windows cross-compilation
CC=gcc
MINGW_CC=x86_64-w64-mingw32-gcc
# Directories
SRCDIR=src
BINDIR=bin
BINDIR_WIN=bin/win
INCDIR=include
# SDL3 paths for cross-compilation
CROSS_WIN_SDL3_PREFIX ?= /usr/x86_64-w64-mingw32
CROSS_WIN_SDL3_INCLUDE ?= $(CROSS_WIN_SDL3_PREFIX)/include
CROSS_WIN_SDL3_LIB ?= $(CROSS_WIN_SDL3_PREFIX)/lib
# DLL cache directory
DLL_CACHE_DIR = $(HOME)/.cache/glamac-dlls
# Common flags
CFLAGS_BASE=-I$(INCDIR) -O2 -flto
CFLAGS_NATIVE=$(CFLAGS_BASE) -march=native
CFLAGS_CROSS=$(CFLAGS_BASE) -I$(CROSS_WIN_SDL3_INCLUDE)
# OS Detection
ifeq ($(OS),Windows_NT)
# Windows host
EXE_EXT=.exe
MKDIR=mkdir
RM=del /Q
RMDIR=rmdir /s /q
SDL3_LDFLAGS=-lSDL3 -lSDL3_ttf -mwindows
NATIVE_CC=$(CC)
NATIVE_CFLAGS=$(CFLAGS_BASE)
NATIVE_LDFLAGS=$(SDL3_LDFLAGS)
NATIVE_EXT=.exe
else
# Linux host (Arch)
EXE_EXT=
MKDIR=mkdir -p
RM=rm -f
RMDIR=rm -rf
SDL3_LDFLAGS=$(shell pkg-config --cflags --libs sdl3 SDL3_ttf 2>/dev/null || echo -lSDL3 -lSDL3_ttf) -lm
NATIVE_CC=$(CC)
NATIVE_CFLAGS=$(CFLAGS_NATIVE)
NATIVE_LDFLAGS=$(SDL3_LDFLAGS)
NATIVE_EXT=
# Cross-compilation flags
CROSS_LDFLAGS=-L$(CROSS_WIN_SDL3_LIB) -lmingw32 -lSDL3 -lSDL3_ttf -mwindows -static-libgcc
endif
# Source files
GLAMAC_SRC_LIST=$(SRCDIR)/glamac/glamac.c \
$(SRCDIR)/glamac/glamac_view.c \
$(SRCDIR)/glamac/glamac_render.c \
$(SRCDIR)/glamac/glamac_events.c \
$(SRCDIR)/glamac/glass_data.c
GLAMAC_SRC=$(wildcard $(GLAMAC_SRC_LIST))
EXPECTED_GLAMAC_FILES=5
FOUND_GLAMAC_FILES=$(words $(GLAMAC_SRC))
GLA_SRCS=$(wildcard $(SRCDIR)/glautils/*.c)
GLA_EXES_NATIVE=$(patsubst $(SRCDIR)/glautils/%.c, $(BINDIR)/%$(NATIVE_EXT), $(GLA_SRCS))
GLA_EXES_WIN=$(patsubst $(SRCDIR)/glautils/%.c, $(BINDIR_WIN)/%.exe, $(GLA_SRCS))
# Setup targets
setup:
$(MKDIR) $(BINDIR)
setup-cross:
$(MKDIR) $(BINDIR) $(BINDIR_WIN)
# Check source files
check-files:
@echo "Checking for glamac source files..."
@echo "Expected $(EXPECTED_GLAMAC_FILES) files, found $(FOUND_GLAMAC_FILES)"
@if [ $(FOUND_GLAMAC_FILES) -ne $(EXPECTED_GLAMAC_FILES) ]; then \
echo "ERROR: Missing glamac source files!"; \
exit 1; \
fi
@echo "All glamac source files found."
# Default: build for current platform
all: check-files setup glamac glautils
# Native compilation
glamac: check-files $(BINDIR)/glamac$(NATIVE_EXT)
glautils: $(GLA_EXES_NATIVE)
$(BINDIR)/glamac$(NATIVE_EXT): $(GLAMAC_SRC)
@echo "Compiling glamac..."
$(NATIVE_CC) $^ $(NATIVE_CFLAGS) $(NATIVE_LDFLAGS) -o $@
$(BINDIR)/%$(NATIVE_EXT): $(SRCDIR)/glautils/%.c
$(NATIVE_CC) $< $(NATIVE_CFLAGS) -o $@
# Windows cross-compilation (Linux only)
ifeq ($(OS),Windows_NT)
# Windows host - no cross-compilation needed
glamac-win all-win:
@echo "Cross-compilation not needed on Windows. Use 'make all' instead."
install-sdl3-cross download-dlls install-dlls copy-dlls-win:
@echo "Cross-compilation operations not available on Windows host."
else
# Linux host - cross-compilation available
# Check cross-compilation dependencies
check-cross-deps:
@echo "Checking cross-compilation dependencies..."
@which $(MINGW_CC) >/dev/null 2>&1 || (echo "ERROR: $(MINGW_CC) not found. Install with: sudo pacman -S mingw-w64-gcc" && exit 1)
@test -f $(CROSS_WIN_SDL3_INCLUDE)/SDL3/SDL.h || (echo "ERROR: SDL3 headers not found. Run 'make install-sdl3-cross'" && exit 1)
@test -f $(CROSS_WIN_SDL3_LIB)/libSDL3.dll.a || (echo "ERROR: SDL3 libraries not found. Run 'make install-sdl3-cross'" && exit 1)
@echo "Cross-compilation dependencies OK"
# Windows targets
glamac-win: check-files check-cross-deps setup-cross $(BINDIR_WIN)/glamac.exe copy-dlls-win
all-win: glamac-win $(GLA_EXES_WIN)
$(BINDIR_WIN)/glamac.exe: $(GLAMAC_SRC)
@echo "Cross-compiling glamac for Windows..."
$(MINGW_CC) $^ $(CFLAGS_CROSS) $(CROSS_LDFLAGS) -o $@
$(BINDIR_WIN)/%.exe: $(SRCDIR)/glautils/%.c
$(MINGW_CC) $< $(CFLAGS_CROSS) -static-libgcc -o $@
# DLL Management
# Download DLLs to cache (only once)
download-dlls:
@echo "Downloading SDL3 DLLs to cache..."
@$(MKDIR) $(DLL_CACHE_DIR)
@if [ ! -f "$(DLL_CACHE_DIR)/SDL3.dll" ]; then \
echo "Downloading SDL3.dll..."; \
cd $(DLL_CACHE_DIR) && \
wget -q https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-3.2.10-win32-x64.zip && \
unzip -j SDL3-3.2.10-win32-x64.zip SDL3.dll && \
rm SDL3-3.2.10-win32-x64.zip; \
else \
echo "SDL3.dll already cached"; \
fi
@if [ ! -f "$(DLL_CACHE_DIR)/SDL3_ttf.dll" ]; then \
echo "Downloading SDL3_ttf.dll..."; \
cd $(DLL_CACHE_DIR) && \
wget -q https://github.com/libsdl-org/SDL_ttf/releases/download/release-3.2.2/SDL3_ttf-3.2.2-win32-x64.zip && \
unzip -j SDL3_ttf-3.2.2-win32-x64.zip SDL3_ttf.dll && \
rm SDL3_ttf-3.2.2-win32-x64.zip; \
else \
echo "SDL3_ttf.dll already cached"; \
fi
@echo "DLLs cached in $(DLL_CACHE_DIR)/"
# Install DLLs to system location (optional, for system-wide access)
install-dlls: download-dlls
@echo "Installing DLLs to system location..."
sudo cp $(DLL_CACHE_DIR)/SDL3.dll $(CROSS_WIN_SDL3_PREFIX)/bin/ 2>/dev/null || \
(sudo mkdir -p $(CROSS_WIN_SDL3_PREFIX)/bin && sudo cp $(DLL_CACHE_DIR)/SDL3.dll $(CROSS_WIN_SDL3_PREFIX)/bin/)
sudo cp $(DLL_CACHE_DIR)/SDL3_ttf.dll $(CROSS_WIN_SDL3_PREFIX)/bin/
@echo "DLLs installed to $(CROSS_WIN_SDL3_PREFIX)/bin/"
# Copy DLLs to Windows build directory
copy-dlls-win: download-dlls
@echo "Copying DLLs for Windows distribution..."
@$(MKDIR) $(BINDIR_WIN)
cp $(DLL_CACHE_DIR)/SDL3.dll $(BINDIR_WIN)/
cp $(DLL_CACHE_DIR)/SDL3_ttf.dll $(BINDIR_WIN)/
@echo ""
@echo "Windows distribution ready in $(BINDIR_WIN)/"
@ls -la $(BINDIR_WIN)/
@echo ""
@echo "Copy the entire $(BINDIR_WIN)/ directory to your Windows machine."
# Install SDL3 for cross-compilation
install-sdl3-cross:
@echo "Installing SDL3 development libraries for MinGW cross-compilation..."
@echo "Latest versions: SDL3 3.2.10, SDL3_ttf 3.2.2"
@read -p "Continue? [y/N] " confirm && [ "$$confirm" = "y" ] || exit 1
@which wget >/dev/null 2>&1 || (echo "ERROR: wget not found. Install with: sudo pacman -S wget" && exit 1)
@which $(MINGW_CC) >/dev/null 2>&1 || (echo "ERROR: MinGW not found. Install with: sudo pacman -S mingw-w64-gcc" && exit 1)
sudo mkdir -p $(CROSS_WIN_SDL3_PREFIX)/include $(CROSS_WIN_SDL3_PREFIX)/lib
@echo "Downloading SDL3 development libraries..."
cd /tmp && \
wget -q https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz && \
wget -q https://github.com/libsdl-org/SDL_ttf/releases/download/release-3.2.2/SDL3_ttf-devel-3.2.2-mingw.tar.gz && \
tar -xzf SDL3-devel-3.2.10-mingw.tar.gz && \
tar -xzf SDL3_ttf-devel-3.2.2-mingw.tar.gz && \
sudo cp -r SDL3-3.2.10/x86_64-w64-mingw32/include/* $(CROSS_WIN_SDL3_PREFIX)/include/ && \
sudo cp -r SDL3-3.2.10/x86_64-w64-mingw32/lib/* $(CROSS_WIN_SDL3_PREFIX)/lib/ && \
sudo cp -r SDL3_ttf-3.2.2/x86_64-w64-mingw32/include/* $(CROSS_WIN_SDL3_PREFIX)/include/ && \
sudo cp -r SDL3_ttf-3.2.2/x86_64-w64-mingw32/lib/* $(CROSS_WIN_SDL3_PREFIX)/lib/ && \
rm -rf SDL3-3.2.10* SDL3_ttf-3.2.2*
@echo "SDL3 cross-compilation libraries installed successfully!"
endif
# Arch Linux SDL3 installation
install-sdl3-arch:
@echo "Installing SDL3 on Arch Linux..."
sudo pacman -S sdl3
@echo "Installing SDL3_ttf from AUR (using yay)..."
yay -S sdl3_ttf
@echo "SDL3 installation complete!"
# Clean targets
clean:
ifeq ($(OS),Windows_NT)
@if exist $(BINDIR) $(RMDIR) $(BINDIR)
else
$(RMDIR) $(BINDIR) 2>/dev/null || true
endif
clean-dlls:
ifneq ($(OS),Windows_NT)
$(RMDIR) $(DLL_CACHE_DIR) 2>/dev/null || true
@echo "DLL cache cleared"
else
@echo "DLL cache operations not available on Windows"
endif
rebuild: clean all
# Help
help:
@echo "GlaMaC Build System - SDL3"
@echo ""
@echo "Native targets (any platform):"
@echo " all - Build for current platform"
@echo " glamac - Build glamac only"
@echo " glautils - Build utilities only"
@echo " clean - Clean build artifacts"
@echo " rebuild - Clean and rebuild"
@echo ""
ifeq ($(OS),Windows_NT)
@echo "Windows host - use native targets above"
else
@echo "Cross-compilation targets (Arch Linux → Windows):"
@echo " glamac-win - Build glamac for Windows (includes DLLs)"
@echo " all-win - Build everything for Windows"
@echo ""
@echo "Setup and maintenance:"
@echo " install-sdl3-arch - Install SDL3 on Arch Linux"
@echo " install-sdl3-cross - Install SDL3 for cross-compilation"
@echo " download-dlls - Download Windows DLLs to cache"
@echo " install-dlls - Install DLLs to system location"
@echo " copy-dlls-win - Copy DLLs to Windows build directory"
@echo " clean-dlls - Clear DLL cache"
@echo " check-cross-deps - Check cross-compilation setup"
endif
@echo ""
@echo "Quick start:"
ifeq ($(OS),Windows_NT)
@echo " 1. Install SDL3: (install SDL3 development libraries)"
@echo " 2. make all"
else
@echo " 1. sudo pacman -S mingw-w64-gcc # Install cross-compiler"
@echo " 2. make install-sdl3-cross # Install SDL3 for Windows"
@echo " 3. make glamac-win # Build for Windows (auto-downloads DLLs)"
endif
.PHONY: all setup setup-cross glamac glautils glamac-win all-win check-files check-cross-deps download-dlls install-dlls copy-dlls-win install-sdl3-cross install-sdl3-arch clean clean-dlls rebuild help
|