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
|
# Top-level Makefile fragment
# Default target
all: release
# Name of component
COMPONENT := libcss
# Environment
EXPORT := $(CURDIR)/dist
TOP := $(CURDIR)
RELEASEDIR := build/Release
DEBUGDIR := build/Debug
COVERAGEDIR := build/coverage
# List of items to delete on clean
ITEMS_CLEAN :=
# List of items to delete on distclean
ITEMS_DISTCLEAN :=
# List of targets to run for testing
TARGET_TESTS :=
# Source files
SOURCES :=
# Include Makefile fragments in subdirectories
define do_include
DIR := $$(dir $(1))
include $(1)
endef
MAKE_INCLUDES := $(wildcard */Makefile)
$(eval $(foreach INC, $(MAKE_INCLUDES), $(call do_include,$(INC))))
# Calculate objects to build
OBJECTS := $(subst /,_,$(subst .c,.o,$(SOURCES)))
.PHONY: release debug test coverage profile \
clean distclean setup export install uninstall
# Rules
release: setup $(addprefix $(RELEASEDIR)/,$(OBJECTS))
@$(AR) $(ARFLAGS) $(COMPONENT).a $(RELEASEDIR)/*
debug: setup $(addprefix $(DEBUGDIR)/,$(OBJECTS))
@$(AR) $(ARFLAGS) $(COMPONENT)-debug.a $(DEBUGDIR)/*
test: debug $(TARGET_TESTS)
coverage: clean
@$(LCOV) --directory . --zerocounters
@$(MAKE) test CFLAGS="$(CFLAGS) -fprofile-arcs -ftest-coverage" \
LDFLAGS="$(LDFLAGS) -lgcov"
@$(LCOV) --directory $(DEBUGDIR) --base-directory $(TOP) \
--capture --output-file $(COVERAGEDIR)/$(COMPONENT)_tmp.info
@$(LCOV) --extract $(COVERAGEDIR)/$(COMPONENT)_tmp.info "$(TOP)/src*" \
-o $(COVERAGEDIR)/$(COMPONENT).info
@$(RM) $(RMFLAGS) $(COVERAGEDIR)/$(COMPONENT)_tmp.info
@$(GENHTML) -o $(COVERAGEDIR) --num-spaces 2 \
$(COVERAGEDIR)/$(COMPONENT).info
profile: clean
@$(MAKE) test CFLAGS="$(CFLAGS) -pg" LDFLAGS="-pg $(LDFLAGS)"
clean:
-@$(RM) $(RMFLAGS) $(ITEMS_CLEAN)
-@$(RM) $(RMFLAGS) gmon.out
-@$(RM) $(RMFLAGS) -r $(COVERAGEDIR)
-@$(RM) $(RMFLAGS) -r $(RELEASEDIR)
-@$(RM) $(RMFLAGS) -r $(DEBUGDIR)
-@$(RM) $(RMFLAGS) $(COMPONENT).a
-@$(RM) $(RMFLAGS) $(COMPONENT)-debug.a
-@$(RM) $(RMFLAGS) $(COMPONENT).pc
distclean: clean
-@$(RM) $(RMFLAGS) $(ITEMS_DISTCLEAN)
-@$(RM) $(RMFLAGS) -r $(TOP)/dist
setup:
@$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR)
@$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)
@$(MKDIR) $(MKDIRFLAGS) $(COVERAGEDIR)
export:
@$(MKDIR) $(MKDIRFLAGS) -p $(TOP)/dist
@$(MAKE) install PREFIX="$(TOP)/dist"
install: release
@$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/lib/pkgconfig
@$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/include/libcss
@$(SED) -e 's#PREFIX#$(PREFIX)#' $(COMPONENT).pc.in >$(COMPONENT).pc
@$(INSTALL) --mode=644 -t $(PREFIX)/lib $(COMPONENT).a
@$(INSTALL) --mode=644 -t $(PREFIX)/lib/pkgconfig $(COMPONENT).pc
@$(INSTALL) --mode=644 -t $(PREFIX)/include/libcss $(filter %.h, $(wildcard include/libcss/*))
uninstall:
@$(RM) $(RMFLAGS) $(PREFIX)/lib/$(COMPONENT).a
@$(RM) $(RMFLAGS) $(PREFIX)/lib/pkgconfig/$(COMPONENT).pc
@$(RM) $(RMFLAGS) -r $(PREFIX)/include/libcss
# Finally, build rules for compilation
define do_compile
$$(RELEASEDIR)/$(2): $(1)
@$$(ECHO) $$(ECHOFLAGS) "==> $(1)"
@$$(CC) -c $$(RELEASECFLAGS) -o $$@ $(1)
$$(DEBUGDIR)/$(2): $(1)
@$$(ECHO) $$(ECHOFLAGS) "==> $(1)"
@$$(CC) -c $$(DEBUGCFLAGS) -o $$@ $(1)
endef
$(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \
$(call do_compile,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)))))
|