aboutsummaryrefslogtreecommitdiff
path: root/Makefile
blob: 5e3dcdbfd731181e8b6db13ff8e2d760130a94c0 (plain) (blame)
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}: ${OBJECT} ${LIBRARY.dir}/libraylib.amd64.a
	@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}