aboutsummaryrefslogtreecommitdiff
path: root/Makefile
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