-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
144 lines (108 loc) · 3.12 KB
/
Copy pathMakefile
File metadata and controls
144 lines (108 loc) · 3.12 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
132
133
134
135
136
137
138
139
140
141
142
143
144
.DEFAULT_GOAL := all
# =========================
# Project configuration
# =========================
LIB_NAME := cdatastructures
# --- Platform Detection ---
UNAME_S := $(shell uname -s)
PLATFORM := linux
SHARED_EXT := so
PC_FILE := cdatastructures.pc
$(PC_FILE): cdatastructures.pc.in
sed 's|@PREFIX@|$(PREFIX)|g' $< > $@
ifneq (,$(findstring MINGW,$(UNAME_S)))
PLATFORM := windows
SHARED_EXT := dll
endif
ifeq ($(UNAME_S),Darwin)
PLATFORM := macos
SHARED_EXT := dylib
endif
ifeq ($(PLATFORM),windows)
PREFIX ?= /mingw64
else
PREFIX ?= /usr/local
endif
# --- Artifact Names ---
LIB_STATIC := lib$(LIB_NAME).a
ifeq ($(PLATFORM),windows)
SHARED_LIB := $(LIB_NAME).$(SHARED_EXT)
IMPORT_LIB := lib$(LIB_NAME).dll.a
SHARED_LDFLAGS := -shared
else ifeq ($(PLATFORM),macos)
SHARED_LIB := lib$(LIB_NAME).$(SHARED_EXT)
SHARED_LDFLAGS := -dynamiclib -install_name $(LIBDIR)/$(SHARED_LIB)
else
SHARED_LIB := lib$(LIB_NAME).$(SHARED_EXT)
SHARED_LDFLAGS := -shared
endif
# --- Toolchain ---
CC ?= gcc
AR ?= ar
CFLAGS := -Wall -Wextra -Wpedantic -std=c11 -O2
ifeq ($(PLATFORM),windows)
# no -fPIC on Windows
else
CFLAGS += -fPIC
endif
INCLUDEDIR := $(PREFIX)/include
LIBDIR := $(PREFIX)/lib
PKGCONFIGDIR:= $(LIBDIR)/pkgconfig
SRC_DIR := src
INC_DIR := include
TEST_DIR := tests
# =========================
# Source discovery
# =========================
SOURCES := $(shell find $(SRC_DIR) -name "*.c" ! -name "*_ll.c")
OBJECTS := $(SOURCES:.c=.o)
# =========================
# Build rules
# =========================
all: $(LIB_STATIC) $(SHARED_LIB)
$(LIB_STATIC): $(OBJECTS)
$(AR) rcs $@ $^
$(SHARED_LIB): $(OBJECTS)
ifeq ($(PLATFORM),windows)
$(CC) $(SHARED_LDFLAGS) -o $@ $^ \
-Wl,--out-implib,$(IMPORT_LIB)
else
$(CC) $(SHARED_LDFLAGS) -o $@ $^
endif
%.o: %.c
$(CC) $(CFLAGS) -I$(INC_DIR) -c $< -o $@
# =========================
# Install / uninstall
# =========================
install: all $(PC_FILE)
install -d $(DESTDIR)$(PKGCONFIGDIR)
install -m 644 $(PC_FILE) $(DESTDIR)$(PKGCONFIGDIR)
@echo "Installing libraries..."
install -d $(DESTDIR)$(LIBDIR)
install -m 644 $(LIB_STATIC) $(DESTDIR)$(LIBDIR)
install -m 755 $(SHARED_LIB) $(DESTDIR)$(LIBDIR)
ifeq ($(PLATFORM),windows)
install -m 644 $(IMPORT_LIB) $(DESTDIR)$(LIBDIR)
endif
@echo "Installing headers..."
install -d $(DESTDIR)$(INCLUDEDIR)/cdatastructures
install -m 644 $(INC_DIR)/*.h $(DESTDIR)$(INCLUDEDIR)/cdatastructures
@echo "Installing pkg-config file..."
install -d $(DESTDIR)$(PKGCONFIGDIR)
install -m 644 cdatastructures.pc $(DESTDIR)$(PKGCONFIGDIR)
uninstall:
rm -f -- $(DESTDIR)$(LIBDIR)/$(LIB_STATIC)
rm -f -- $(DESTDIR)$(LIBDIR)/$(SHARED_LIB)
ifeq ($(PLATFORM),windows)
rm -f -- $(DESTDIR)$(LIBDIR)/$(IMPORT_LIB)
endif
rm -rf -- $(DESTDIR)$(INCLUDEDIR)/cdatastructures
rm -f -- $(DESTDIR)$(PKGCONFIGDIR)/cdatastructures.pc
# =========================
# Tests & cleanup
# =========================
test:
$(MAKE) -C $(TEST_DIR)
clean:
rm -f -- $(OBJECTS) $(LIB_STATIC) $(SHARED_LIB) $(IMPORT_LIB)
.PHONY: all install uninstall clean test