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
|
#!/usr/bin/make -f
GPERF = gperf
PERF.orig := $(wildcard ${SOURCE.dir}/*.gperf)
PERF := $(PERF:${SOURCE.dir}/%=%)
PERF.h := $(addprefix ${OBJECT.dir}/,$(PERF:.gperf=.h))
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 ${PERF.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 := -I${INCLUDE.dir} -I${OBJECT.dir} -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-optimized
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}
vpath %.gperf ${SOURCE.dir}
${OBJECT.dir}/%.o: %.c
@echo "CC $<"
@${COMPILE.c} -o $@ $<
${OBJECT.dir}/%.h: %.gperf
${GPERF} --null-strings -tEIH $(shell basename $(basename $<))_hash -N $(shell basename $(basename $<))_lookup < $< > $@
# 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 object/options.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 ${OBJECT.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}
|