-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
132 lines (109 loc) · 3.38 KB
/
Makefile
File metadata and controls
132 lines (109 loc) · 3.38 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
127
128
129
130
131
# Directories
INCLUDE_DIR := include
SRC_DIR := src
OBJ_DIR := obj
BIN_DIR := bin
TEST_DIR := tests
LIB_DIR := lib
# Detect platform
UNAME_S := $(shell uname -s)
ifeq ($(OS),Windows_NT)
PLATFORM := Windows
SHARED_EXT := .dll
SHARED_FLAGS := -shared
LIB_PREFIX :=
else ifeq ($(UNAME_S),Linux)
PLATFORM := Linux
SHARED_EXT := .so
SHARED_FLAGS := -shared -fPIC
LIB_PREFIX := lib
else ifeq ($(UNAME_S),Darwin)
PLATFORM := macOS
SHARED_EXT := .dylib
SHARED_FLAGS := -dynamiclib -fPIC
LIB_PREFIX := lib
else
PLATFORM := Unknown
SHARED_EXT := .so
SHARED_FLAGS := -shared -fPIC
LIB_PREFIX := lib
endif
# Compiler and flags
CC := gcc
CFLAGS := -std=gnu11 -Wall -Wextra -O2 -I$(INCLUDE_DIR)
SHARED_CFLAGS := $(CFLAGS) -fPIC
LDFLAGS := -lm
# Files
DEMO_DIR := demos
SRC := $(wildcard $(SRC_DIR)/*.c)
OBJ := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC))
SHARED_OBJ := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.shared.o,$(SRC))
TARGET := $(BIN_DIR)/bthread_demo
LIB_NAME := bthread
SHARED_LIB := $(LIB_DIR)/$(LIB_PREFIX)$(LIB_NAME)$(SHARED_EXT)
# Test files
TEST_SRC := $(wildcard $(TEST_DIR)/*_test.c)
TEST_OBJ := $(filter-out $(OBJ_DIR)/bthread_demo.o, $(OBJ))
TEST_BINS := $(patsubst $(TEST_DIR)/%.c,$(BIN_DIR)/%,$(TEST_SRC))
# Demo files
DEMO_SRC := $(wildcard $(DEMO_DIR)/*.c)
DEMO_BINS := $(patsubst $(DEMO_DIR)/%.c,$(BIN_DIR)/%,$(DEMO_SRC))
# Default target
all: $(BIN_DIR) $(OBJ_DIR) $(TARGET) $(SHARED_LIB)
# Build shared library
lib: $(OBJ_DIR) $(SHARED_LIB)
$(SHARED_LIB): $(SHARED_OBJ)
@mkdir -p $(LIB_DIR)
@echo "Building shared library for $(PLATFORM)..."
$(CC) $(SHARED_FLAGS) $(SHARED_OBJ) -o $@ $(LDFLAGS)
# Build binary
$(TARGET): $(DEMO_DIR)/bthread_demo.c $(OBJ)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
# Build object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Build shared object files
$(OBJ_DIR)/%.shared.o: $(SRC_DIR)/%.c
$(CC) $(SHARED_CFLAGS) -c $< -o $@
# Create bin, obj, and lib directories if they don't exist
$(BIN_DIR) $(OBJ_DIR) $(LIB_DIR):
mkdir -p $@
# Build binary
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
# Build object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Create bin and obj directories if they don't exist
$(BIN_DIR) $(OBJ_DIR):
mkdir -p $@
# Build test binaries
$(BIN_DIR)/%_test: $(TEST_DIR)/%_test.c $(TEST_OBJ)
$(CC) $(CFLAGS) $< $(TEST_OBJ) -o $@ $(LDFLAGS)
# Build demo binaries
$(BIN_DIR)/bthread_%: $(DEMO_DIR)/bthread_%.c $(OBJ)
$(CC) $(CFLAGS) $< $(OBJ) -o $@ $(LDFLAGS)
# Run all tests
test: $(BIN_DIR) $(OBJ_DIR) $(TEST_BINS)
@echo "Running all tests..."
@for test in $(TEST_BINS); do \
echo ""; \
$$test || exit 1; \
done
@echo ""
@echo "All tests passed!"
# Build all demos
demos: $(BIN_DIR) $(OBJ_DIR) $(DEMO_BINS)
# Individual demo targets
bthread_barber: $(BIN_DIR)/bthread_barber
bthread_demo: $(BIN_DIR)/bthread_demo
bthread_philosophers: $(BIN_DIR)/bthread_philosophers
bthread_prodcons: $(BIN_DIR)/bthread_prodcons
bthread_prodcons_cond: $(BIN_DIR)/bthread_prodcons_cond
bthread_rw_fair: $(BIN_DIR)/bthread_rw_fair
bthread_rw_r: $(BIN_DIR)/bthread_rw_r
bthread_rw_w: $(BIN_DIR)/bthread_rw_w
# Clean
clean:
rm -rf $(OBJ_DIR) $(BIN_DIR) $(LIB_DIR)
.PHONY: all clean test lib demos bthread_barber bthread_demo bthread_philosophers bthread_prodcons bthread_prodcons_cond bthread_rw_fair bthread_rw_r bthread_rw_w