-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGNUmakefile
107 lines (88 loc) · 2.88 KB
/
GNUmakefile
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
.PHONY: all clean run debug
PROJECT := volumetric-ray-tracer
VERSION := 0.1.0
CC := clang
CXX := clang++
DEBUGGER := lldb
MKDIR := mkdir -p
SRCDIR := src
LIBDIR := libs
BUILDDIR := build
INCDIRS := include
SRCS := $(shell find $(SRCDIR) $(LIBDIR) -type f -iname '*.c' -o -iname '*.cpp')
OBJS := $(SRCS:%=$(BUILDDIR)/%.o)
DEPS := $(SRCS:%=$(BUILDDIR)/%.d)
BIN := $(BUILDDIR)/$(PROJECT)-$(VERSION)
CPPFLAGS := $(foreach INCDIR,$(INCDIRS),-I $(INCDIR)) $(CPPFLAGS)
CFLAGS := -pipe $(CFLAGS)
CXXFLAGS := -pipe $(CXXFLAGS)
LDFLAGS := -fuse-ld=mold -lm $(LDFLAGS)
LIBS := glfw3
ifneq ($(strip $(LIBS)),)
ifeq ($(strip $(STATIC)),1)
CPPFLAGS += $(shell pkg-config --static --cflags-only-I $(LIBS))
CFLAGS += $(shell pkg-config --static --cflags-only-other $(LIBS))
CXXFLAGS += $(shell pkg-config --static --cflags-only-other $(LIBS))
LDFLAGS += $(shell pkg-config --static --libs $(LIBS))
else
CPPFLAGS += $(shell pkg-config --cflags-only-I $(LIBS))
CFLAGS += $(shell pkg-config --cflags-only-other $(LIBS))
CXXFLAGS += $(shell pkg-config --cflags-only-other $(LIBS))
LDFLAGS += $(shell pkg-config --libs $(LIBS))
endif
endif
OWNCFLAGS ?= -std=c17 -Wall -Wextra -Wpedantic
OWNCXXFLAGS ?= -std=c++20 -Wall -Wextra -Wpedantic
DEBUGFLAGS ?= -g
SANFLAGS ?= -fsanitize=undefined,address
OPTIFLAGS ?= -O2
LTOFLAGS ?= -flto
STATICFLAGS ?= -static
ifeq ($(strip $(DEBUG)),1)
CFLAGS += $(DEBUGFLAGS)
CXXFLAGS += $(DEBUGFLAGS)
endif
ifeq ($(strip $(SANITIZE)),1)
CFLAGS += $(SANFLAGS)
CXXFLAGS += $(SANFLAGS)
endif
ifeq ($(strip $(OPTI)),1)
CFLAGS += $(OPTIFLAGS)
CXXFLAGS += $(OPTIFLAGS)
endif
ifeq ($(strip $(LTO)),1)
CFLAGS += $(LTOFLAGS)
CXXFLAGS += $(LTOFLAGS)
endif
ifeq ($(strip $(STATIC)),1)
LDFLAGS += $(STATICFLAGS)
endif
all: $(BIN)
$(BUILDDIR)/%.c.d: %.c
@$(MKDIR) $(@D)
@$(CC) $(CPPFLAGS) -M $< | tr -s '[:space:]\\\n' ' ' | sed 's,\s*$(*F)\.o[: ]*$<\s*\(.*\)\s*$$,$(BUILDDIR)/$<.o $(BUILDDIR)/$<.d: $< \1\n\1\n,' | sed '2,$$s,\s*\(\S*\)\s*,\n\n\1:,g' > $@
$(BUILDDIR)/%.cpp.d: %.cpp
@$(MKDIR) $(@D)
@$(CXX) $(CPPFLAGS) -M $< | tr -s '[:space:]\\\n' ' ' | sed 's,\s*$(*F)\.o[: ]*$<\s*\(.*\)\s*$$,$(BUILDDIR)/$<.o $(BUILDDIR)/$<.d: $< \1\n\1\n,' | sed '2,$$s,\s*\(\S*\)\s*,\n\n\1:,g' > $@
include $(DEPS)
$(BUILDDIR)/$(SRCDIR)/%.c.o: $(SRCDIR)/%.c
@$(MKDIR) $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) $(OWNCFLAGS) -c $< -o $@
$(BUILDDIR)/$(SRCDIR)/%.cpp.o: $(SRCDIR)/%.cpp
@$(MKDIR) $(@D)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(OWNCXXFLAGS) -c $< -o $@
$(BUILDDIR)/$(LIBDIR)/%.c.o: $(LIBDIR)/%.c
@$(MKDIR) $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
$(BUILDDIR)/$(LIBDIR)/%.cpp.o: $(LIBDIR)/%.cpp
@$(MKDIR) $(@D)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
$(BIN): $(OBJS)
@$(MKDIR) $(@D)
$(CXX) $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) $(OWNCFLAGS) $(OWNCXXFLAGS) $(LDFLAGS) $^ -o $@
clean:
@$(RM) $(shell find $(BUILDDIR) -type f -iname '*.o' -o -iname '*.d') $(BIN)
run: $(BIN)
./$(BIN) $(ARGS)
debug: $(BIN)
@$(DEBUGGER) ./$(BIN)