-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
126 lines (87 loc) · 4.2 KB
/
Makefile
File metadata and controls
126 lines (87 loc) · 4.2 KB
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
CXX := g++
CC := gcc
AR := ar
CFLAGS := -Og -g -fPIE -pie -Werror -Wall -Wextra
CXXFLAGS := -Og -g -Werror -Wall -Wextra -std=gnu++23
LIBTPROC_CFLAGS := -Og -g -fPIC -Werror -Wall -Wextra
DEPFLAGS = -MMD -MP -MF $(@:.o=.d)
SPDLOG_INCLUDE := spdlog/include
SPDLOG_FLAGS := -I $(SPDLOG_INCLUDE) -Wno-dangling-reference
BUILD_DIR := buildout
OBJ_DIR := $(BUILD_DIR)/obj
SERVER_PCH := $(OBJ_DIR)/server/pch.h.gch
SERVER := $(BUILD_DIR)/server
LAUNCHER := $(BUILD_DIR)/launcher
LIBTPROC := $(BUILD_DIR)/libtproc.a
# --- Architecture detection -------------------------------------------
UNAME_M := $(shell uname -m)
ifeq ($(UNAME_M),x86_64)
ARCH := x86_64
else ifeq ($(UNAME_M),aarch64)
ARCH := aarch64
else
$(error Unsupported architecture: $(UNAME_M))
endif
# --- Server -----------------------------------------------------------
SERVER_SRCS := src/server/main.cpp src/server/elf_loader.cpp src/server/server.cpp
SERVER_ASM := src/server/trampoline_$(ARCH).S
SERVER_OBJS := $(SERVER_SRCS:src/server/%.cpp=$(OBJ_DIR)/server/%.o) \
$(SERVER_ASM:src/server/%.S=$(OBJ_DIR)/server/%.o)
# --- Launcher ---------------------------------------------------------
LAUNCHER_SRCS := src/launcher.cpp
LAUNCHER_OBJS := $(LAUNCHER_SRCS:src/%.cpp=$(OBJ_DIR)/launcher/%.o)
# --- libtproc ---------------------------------------------------------
LIBTPROC_SRCS := libtproc/tproc.c
LIBTPROC_OBJS := $(LIBTPROC_SRCS:libtproc/%.c=$(OBJ_DIR)/libtproc/%.o)
# --- Examples ----------------------------------------------------------
EXAMPLES := $(addprefix $(BUILD_DIR)/examples/, \
dummy_server dummy_client allocstr printstr detect)
# Collect all dependency files
ALL_DEPS := $(patsubst %.o,%.d,$(SERVER_OBJS) $(LAUNCHER_OBJS) $(LIBTPROC_OBJS))
# ======================================================================
.PHONY: all clean test examples
all: examples $(SERVER) $(LAUNCHER) $(LIBTPROC)
examples: $(EXAMPLES)
clean:
rm -rf $(BUILD_DIR)
# --- Link rules --------------------------------------------------------
$(SERVER): $(SERVER_OBJS) | $(BUILD_DIR)
$(CXX) $(CXXFLAGS) -o $@ $^ -luring
$(LAUNCHER): $(LAUNCHER_OBJS) | $(BUILD_DIR)
$(CXX) $(CXXFLAGS) -o $@ $^
$(LIBTPROC): $(LIBTPROC_OBJS) | $(BUILD_DIR)
$(AR) rcs $@ $^
# --- Compile rules (server) --------------------------------------------
$(SERVER_PCH): src/server/pch.h | $(OBJ_DIR)/server
$(CXX) $(CXXFLAGS) -I src -I libtproc $(SPDLOG_FLAGS) -x c++-header -o $@ $<
$(OBJ_DIR)/server/%.o: src/server/%.cpp $(SERVER_PCH) | $(OBJ_DIR)/server
$(CXX) $(CXXFLAGS) $(DEPFLAGS) -I src -I libtproc $(SPDLOG_FLAGS) -I $(OBJ_DIR)/server -include pch.h -c -o $@ $<
$(OBJ_DIR)/server/%.o: src/server/%.S | $(OBJ_DIR)/server
$(CXX) $(DEPFLAGS) -c -o $@ $<
# --- Compile rules (launcher) ------------------------------------------
$(OBJ_DIR)/launcher/%.o: src/%.cpp | $(OBJ_DIR)/launcher
$(CXX) $(CXXFLAGS) $(DEPFLAGS) -c -o $@ $<
# --- Compile rules (libtproc) ------------------------------------------
$(OBJ_DIR)/libtproc/%.o: libtproc/%.c | $(OBJ_DIR)/libtproc
$(CC) $(LIBTPROC_CFLAGS) $(DEPFLAGS) -c -o $@ $<
# --- Examples (single-file programs) ------------------------------------
$(BUILD_DIR)/examples/dummy_server: example/dummy/dummy_server.c | $(BUILD_DIR)/examples
$(CC) $(CFLAGS) -o $@ $<
$(BUILD_DIR)/examples/dummy_client: example/dummy/dummy_client.c | $(BUILD_DIR)/examples
$(CC) $(CFLAGS) -o $@ $<
$(BUILD_DIR)/examples/allocstr: example/sharedstr/allocstr.cpp | $(BUILD_DIR)/examples
$(CXX) $(CXXFLAGS) -o $@ $<
$(BUILD_DIR)/examples/printstr: example/sharedstr/printstr.cpp | $(BUILD_DIR)/examples
$(CXX) $(CXXFLAGS) -o $@ $<
$(BUILD_DIR)/examples/detect: example/registry/detect.c $(LIBTPROC) | $(BUILD_DIR)/examples
$(CC) $(CFLAGS) -I libtproc -o $@ $< -L $(BUILD_DIR) -ltproc
# --- Directory creation -------------------------------------------------
$(BUILD_DIR) $(BUILD_DIR)/examples $(OBJ_DIR)/server $(OBJ_DIR)/launcher $(OBJ_DIR)/libtproc:
mkdir -p $@
# --- Tests ---------------------------------------------------------------
test: examples $(SERVER) $(LAUNCHER)
test/dummy_prog1.sh
test/stringshare.sh
test/registry.sh
# --- Auto-generated header dependencies ----------------------------------
-include $(ALL_DEPS)