summaryrefslogtreecommitdiff
path: root/makefile
blob: 69fb0c1299b5754ca1f3b3f88cca82fb8d01fc9b (plain)
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
.SILENT:
.DEFAULT_GOAL := all

# ====== Configurations and Binaries ====== #
RELEASE ?= 0

CC := clang
CXX := clang++
CMAKE := cmake
RM := rm -f
PRINTF := printf

# ====== Sources ====== #
TOP_DIR := .
SRC_DIR := $(TOP_DIR)/src
MI_DIR := $(TOP_DIR)/mimalloc
MI_INCLUDE_DIR := $(MI_DIR)/include

ifeq ($(RELEASE),1)
MI_O := $(MI_DIR)/mimalloc.o
else
MI_O := $(MI_DIR)/mimalloc-debug.o
endif

VOIDC_CXX := $(SRC_DIR)/voidc.cc
VOIDC_O := $(VOIDC_CXX:.cc=.o)
VOIDC_D := $(VOIDC_CXX:.cc=.d)
VOIDC := $(TOP_DIR)/voidc

# ====== Flags ====== #
CXX_FLAGS := -std=c++17 \
	-Wall -Wextra -Werror -pedantic\
	-MMD -MP -fno-rtti -fno-exceptions \
	-I$(SRC_DIR)

LD_FLAGS := -lc -nostdlib++

MI_FLAGS := -G"Unix Makefiles" -DCMAKE_C_COMPILER=$(CC) \
	-DMI_BUILD_TESTS=OFF -DMI_BUILD_STATIC=OFF -DMI_BUILD_SHARED=OFF -DMI_BUILD_OBJECT=ON \
	-DMI_OVERRIDE=ON -DMI_NO_USE_CXX=ON

ifeq ($(RELEASE),1)
	CXX_FLAGS += -flto=auto -O2
	MI_FLAGS += -DCMAKE_BUILD_TYPE=Release -DMI_DEBUG=OFF
	LD_FLAGS += -flto=auto -O2
else
	CXX_FLAGS += -g3
	MI_FLAGS += -DCMAKE_BUILD_TYPE=Debug -DMI_DEBUG_INTERNAL=ON
endif

# ====== Rules ====== #
.PHONY: all
all: $(VOIDC)

$(MI_O): $(MI_DIR)
	$(CMAKE) $(MI_FLAGS) -S $(MI_DIR) -B $(MI_DIR)
	$(MAKE) -C $(MI_DIR)

$(VOIDC_O): CCXX_FLAGS += -I$(MI_INCLUDE_DIR)

$(VOIDC): $(VOIDC_O) $(MI_O)
	$(PRINTF) " CXXLD %s\n" $<
	$(CXX) $^ -o $@ $(LD_FLAGS) 

%.o: %.cc
	$(PRINTF) " CXX %s\n" $<
	$(CXX) $< -o $@ -c $(CXX_FLAGS)

.PHONY: clean
clean:
	$(MAKE) -C $(MI_DIR) clean
	$(RM) $(VOIDC_O) $(VOIDC_D) $(VOIDC)

-include $(VOIDC_D)