blob: df3856d74ad22251e2eb05d06eabc09df3138950 (
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Compilation Options
# Debug mode [yes/no] (allowing to debug the library via gdb):
DEBUG ?= no
# Specify build directory:
BUILD ?= build
# Optional modules (remove unwanted ones):
MODULES ?= cgi fastcgi loadfile urlenc
# Specify your favourite C compiler here:
CC ?= gcc
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Preparations
LIB = libmagi.a
# Compile under the most strict conditions:
CFLAGS = -xc -ansi -pedantic -Wall -Wextra
# Debug and optimisation are not compatible:
ifeq '$(DEBUG)' 'yes'
CFLAGS += -g -O0
else
CFLAGS += -O3 -static
endif
# Interfacial files to compile:
INTER = cookie error file param request response $(MODULES)
# Object files listing:
INC_DIR = include/magi
SRC_DIR = src
INTER_H = $(foreach name,$(INTER),$(INC_DIR)/$(name).h)
INTER_C = $(foreach name,$(INTER),$(SRC_DIR)/$(name).c)
INNER_H = $(wildcard $(SRC_DIR)/*.h)
INNER_C = $(INNER_H:.h=.c)
SRC = $(INTER_C) $(INNER_C)
NAMES = $(notdir $(SRC:.c=))
OBJ = $(foreach name,$(NAMES),$(BUILD)/$(SRC_DIR)/$(name).o)
EXDIR = examples
EXSRC = $(wildcard $(EXDIR)/*.c)
EXNAMES = $(notdir $(EXSRC:.c=))
EXAMPLES = $(foreach ex,$(EXNAMES),$(BUILD)/$(EXDIR)/$(ex))
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Targets
.PHONY: default clean examples
# 'make' produces library by default:
default: $(BUILD)/$(LIB)
examples: $(EXAMPLES)
# Cleaning means removing everything automatically produced:
clean:
rm -rf $(BUILD)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Compilation
# Compile object files from corresponding source and header:
$(BUILD)/$(SRC_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -I $(INC_DIR) -c $< -o $@
# Packing object files into library:
$(BUILD)/$(LIB): $(OBJ)
ar rcs $@ $^
# Compile executables from corresponding sources and library:
$(BUILD)/$(EXDIR)/%: $(EXDIR)/%.c $(BUILD)/$(LIB)
$(CC) $(CFLAGS) -I include $< -L$(BUILD) -lmagi -o $@
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Dependencies
$(BUILD)/deps.mk: $(SRC) $(EXSRC)
mkdir $(BUILD) $(BUILD)/$(SRC_DIR) $(BUILD)/$(EXDIR); echo '' > $@
for t in $(NAMES); do \
$(CC) -I $(INC_DIR) \
-MT $(BUILD)/$(SRC_DIR)/$${t}.o \
-MM $(SRC_DIR)/$${t}.c >> $@; \
done
for t in $(EXNAMES); do \
$(CC) -I include \
-MT $(BUILD)/$(EXDIR)/$${t}.o \
-MM $(EXDIR)/$${t}.c >> $@; \
done
ifneq (clean, $(MAKECMDGOALS))
-include $(BUILD)/deps.mk
endif
|