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
|
# Child makefile fragment for libhubbub
#
# Toolchain is provided by top-level makefile
#
# Variables provided by top-level makefile
#
# COMPONENT The name of the component
# EXPORT The location of the export directory
# TOP The location of the source tree root
# RELEASEDIR The place to put release objects
# DEBUGDIR The place to put debug objects
#
# do_include Canned command sequence to include a child makefile
#
# Variables provided by parent makefile:
#
# DIR The name of the directory we're in, relative to $(TOP)
#
# Variables we can manipulate:
#
# ITEMS_CLEAN The list of items to remove for "make clean"
# ITEMS_DISTCLEAN The list of items to remove for "make distclean"
# TARGET_TESTS The list of target names to run for "make test"
#
# SOURCES The list of sources to build for $(COMPONENT)
#
# Plus anything from the toolchain
# Push parent directory onto the directory stack
sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(DIR)
# Extend toolchain settings
# We require the presence of libjson -- http://oss.metaparadigm.com/json-c/
CFLAGS := $(CFLAGS) -I$(TOP)/src/ -I$(d) \
$(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --cflags json) \
-Wno-unused-parameter
LDFLAGS := $(LDFLAGS) $(shell $(PKGCONFIG) $(PKGCONFIGFLAGS) --libs json)
ifdef PROFILE
CFLAGS := $(CFLAGS) -pg -fno-omit-frame-pointer
LDFLAGS := $(LDFLAGS) -pg
endif
# Tests
TESTS_$(d) := csdetect dict entities hubbub parser \
tokeniser tokeniser2 tokeniser3 tree tree2 tree-buf
# Items for top-level makefile to use
ITEMS_CLEAN := $(ITEMS_CLEAN) \
$(addprefix $(d), $(addsuffix $(EXEEXT), $(TESTS_$(d)))) \
$(addprefix $(d), $(addsuffix .gcda, $(TESTS_$(d)))) \
$(addprefix $(d), $(addsuffix .gcno, $(TESTS_$(d)))) \
$(addprefix $(d), $(addsuffix .d, $(TESTS_$(d))))
ITEMS_DISTCLEAN := $(ITEMS_DISTCLEAN) $(d)log
# Targets for top-level makefile to run
TARGET_TESTS := $(TARGET_TESTS) test_$(d)
# Now we get to hack around so that we know what directory we're in.
# $(d) no longer exists when running the commands for a target, so we can't
# simply use it verbatim. Assigning to a variable doesn't really help, as
# there's no guarantee that someone else hasn't overridden that variable.
# So, what we do is make the target depend on $(d), then pick it out of the
# dependency list when running commands. This isn't pretty, but is effective.
test_$(d): $(d) $(addprefix $(d), $(TESTS_$(d)))
@$(PERL) $(TOP)/$<testrunner.pl $(TOP)/$< $(EXEEXT)
DEP_$(d) :=
define dep_test
DEP_$(d) += $(2)
$(2): $(1)
@$$(RM) $$(RMFLAGS) $(2)
@$$(CC) $$(DEBUGCFLAGS) -MM -MT '$(2) $(3)' -MF $(2) $(1)
endef
# Build rules for each test binary -- they all depend on the debug library
# Except when building on RISC OS, of course because then make utterly fails to
# detect that the debug library exists.
define compile_test
ifeq ($(HOST),riscos)
$(2): $(3)
else
$(2): $(3) $(TOP)/$(COMPONENT)-debug.a
endif
@$$(ECHO) $$(ECHOFLAGS) "==> $(1)"
@$$(CC) -c -g $$(DEBUGCFLAGS) -o $$@.o $(1)
@$$(LD) -g -o $$@ $$@.o -lhubbub-debug $$(LDFLAGS) -lgcov
@$$(RM) $$(RMFLAGS) $$@.o
endef
$(eval $(foreach TEST,$(addprefix $(d), $(TESTS_$(d))), \
$(call dep_test,$(addsuffix .c, $(TEST)),$(addsuffix .d, $(TEST)),$(TEST))))
ifneq ($(findstring clean,$(MAKECMDGOALS)),clean)
-include $(sort $(DEP_$(d)))
endif
$(eval $(foreach TEST,$(addprefix $(d), $(TESTS_$(d))), \
$(call compile_test,$(addsuffix .c, $(TEST)),$(TEST),$(addsuffix .d, $(TEST)))))
# Now include any children we may have
MAKE_INCLUDES := $(wildcard $(d)*/Makefile)
$(eval $(foreach INC, $(MAKE_INCLUDES), $(call do_include,$(INC))))
# Finally, pop off the directory stack
d := $(dirstack_$(sp))
sp := $(basename $(sp))
|