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
|
#!/usr/bin/make -f
SOURCE.dir := source
OBJECT.dir := object
INCLUDE.dir := include
LIBRARY.dir := library
LIBRARY := $(addprefix ${LIBRARY.dir}/, libraylib.amd64.a)
HEADER := $(wildcard ${SOURCE.dir}/*.h) $(wildcard ${INCLUDE.dir}/*.h) include/raygui.h include/raylib.h
HEADER.orig := $(HEADER:${SOURCE.dir}/%=%)
HEADER.orig := $(HEADER.orig:${INCLUDE.dir}/%=%)
HEADER.pch := $(filter-out ${OBJECT.dir}/style_dark.h,$(addprefix ${OBJECT.dir}/, ${HEADER.orig:.c=}))
SOURCE.orig := $(wildcard ${SOURCE.dir}/*.c)
SOURCE.orig := $(SOURCE.orig:${SOURCE.dir}/%=%)
SOURCE := $(addprefix ${SOURCE.dir}/, ${SOURCE.orig})
OBJECT := $(addprefix ${OBJECT.dir}/, ${SOURCE.orig:.c=.o})
DEPEND := $(wildcard ${OBJECT.dir}/*.d)
TARGET := $(shell basename $$PWD)
CFLAGS := -std=c23 -pthread -MMD -MP
CPPFLAGS := -Iinclude -D_GNU_SOURCE -I ${OBJECT.dir}
LDFLAGS := -lm -lbsd
ifneq ($(shell which mold 2> /dev/null),)
LDFLAGS += -fuse-ld=mold
LD := mold
endif
ifneq ($(shell which clang 2> /dev/null),)
CC := clang
else
ifneq ($(shell which gcc 2> /dev/null),)
CC := gcc
else
$(error GCC & Clang not available.)
endif
endif
ifeq (${CC},gcc)
HEADER.pch := $(addsuffix .gch,${HEADER.pch})
else
HEADER.pch := $(addsuffix .pch,${HEADER.pch})
endif
DEBUG ?= 0
SANITIZE ?= 0
VECTORIZED ?= 0
ifeq (${DEBUG},1)
CFLAGS += -O2 -ggdb -pg -fno-inline -Wall -Wextra -Wpedantic -Wshadow -Wundef
else
CFLAGS += -O0 -flto=auto -ftree-vectorize -march=x86-64 -mtune=generic
CPPFLAGS += -DNDEBUG -D_FORTIFY_SOURCE=2
endif
ifeq (${SANITIZE},1)
CFLAGS += -fsanitize=address,undefined
endif
ifeq (${VECTORIZED},1)
ifeq (${CC},clang)
CFLAGS += -Rpass=loop-vectorize
else
CFLAGS += -fopt-info-vec-all
endif
endif
ifeq (${VECTORIZED_ALL},1)
ifeq (${CC},clang)
CFLAGS += -Rpass=loop-vectorize -Rpass-missed=loop-vectorize
else
CFLAGS += -fopt-info-vec-all
endif
endif
vpath %.c ${SOURCE.dir}
vpath %.h ${SOURCE.dir} ${INCLUDE.dir}
${OBJECT.dir}/%.o: %.c
@echo "CC $<"
@${COMPILE.c} -o $@ $<
# The tree builds incorrectly if these two are merged
# at the target level at a bare build.
${OBJECT.dir}/%.h.pch: %.h
@echo "PCH $<"
@${COMPILE.c} ${PCHFLAGS} -x c-header -o $@ $<
${OBJECT.dir}/%.h.gch: %.h
@echo "GCH $<"
@${COMPILE.c} ${PCHFLAGS} -x c-header -o $@ $<
.PHONY: all clean
all: include/raylib.h include/raygui.h .WAIT ${HEADER.pch} ${TARGET}
${HEADER.pch}: ${LIBRARY.dir}/libraylib.amd64.a include/raygui.h include/style_dark.h
clean:
rm -f ${OBJECT.dir}/*.o ${OBJECT.dir}/*.pch ${OBJECT.dir}/*.gch ${OBJECT.dir}/*.d ${LIBRARY.dir}/*.a ${INCLUDE.dir}/*.h ${TARGET}
rm -f /tmp/raygui.tgz /tmp/raylib.tgz
${TARGET}: ${LIBRARY.dir}/libraylib.amd64.a ${OBJECT}
@echo "LD $@"
@${LINK.c} -o "$@" $+ ${LDFLAGS}
include/raylib.h ${LIBRARY.dir}/libraylib.amd64.a &:
@echo Updating Raylib
@[ ! -e /tmp/raylib.tgz ] && wget -qO /tmp/raylib.tgz "https://github.com/raysan5/raylib/releases/download/5.5/raylib-5.5_linux_amd64.tar.gz" || true
@tar xvC /tmp/ -f /tmp/raylib.tgz raylib-5.5_linux_amd64/lib/libraylib.a raylib-5.5_linux_amd64/LICENSE raylib-5.5_linux_amd64/include > /dev/null
@mv -f /tmp/raylib-5.5_linux_amd64/lib/libraylib.a library/libraylib.amd64.a
@mv -f /tmp/raylib-5.5_linux_amd64/include/* include/
@mv -f /tmp/raylib-5.5_linux_amd64/LICENSE library/libraylib.LICENSE.a
include/raygui.h include/style_dark.h &:
@echo Updating RayGUI
@[ ! -e /tmp/raygui.tgz ] && wget -qO /tmp/raygui.tgz https://github.com/raysan5/raygui/archive/refs/tags/4.0.tar.gz || true
@tar xvC /tmp/ -f /tmp/raygui.tgz raygui-4.0/src/raygui.h raygui-4.0/styles/dark/style_dark.h > /dev/null
@mv -f /tmp/raygui-4.0/src/raygui.h include/
@mv -f /tmp/raygui-4.0/styles/dark/style_dark.h include/
-include ${DEPEND}
|