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
|
# Top-level Makefile fragment for Hubbub
# Default target
all: release
# Name of component
COMPONENT := libhubbub
# Environment
EXPORT := $(CURDIR)/dist
TOP := $(CURDIR)
RELEASEDIR := build/Release
DEBUGDIR := build/Debug
# 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 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)
clean:
-@$(RM) $(RMFLAGS) $(ITEMS_CLEAN)
-@$(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)
export: release
@$(MKDIR) $(MKDIRFLAGS) $(TOP)/dist/lib
@$(CP) $(CPFLAGS) -r include $(EXPORT)/
@${CP} ${CPFLAGS} $(COMPONENT).a ${EXPORT}/lib/
install: release
@$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/lib/pkgconfig
@$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/include/hubbub
@$(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/hubbub $(filter %.h, $(wildcard include/hubbub/*))
uninstall:
@$(RM) $(RMFLAGS) $(PREFIX)/lib/$(COMPONENT).a
@$(RM) $(RMFLAGS) $(PREFIX)/lib/pkgconfig/$(COMPONENT).pc
@$(RM) $(RMFLAGS) -r $(PREFIX)/include/hubbub
# 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)))))
|