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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# Child makefile fragment
#
# Inputs (reset on exit)
#
# DIR_SOURCES List of source files in this directory
# DIR_TEST_ITEMS List of test items in this directory
# DIR_INSTALL_ITEMS Items to install in form <destination>:<file1>;<file2>
#
# Toolchain is provided by top-level makefile
#
# Variables provided by top-level makefile
#
# BUILDDIR The location of the build tree root
# COMPONENT The name of the component
# CURDIR The location of the source tree root
# EXPORTDIR The location of the export directory
# WANT_TEST Whether to build testcases
#
# 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 CURDIR
#
# Variables we can manipulate:
#
# CLEAN_ITEMS The list of items to remove for "make clean"
# DISTCLEAN_ITEMS The list of items to remove for "make distclean"
# TEST_ITEMS The list of items to build for "make test"
# TEST_TARGETS The list of target names to run for "make test"
# INSTALL_ITEMS The list of items to (un)install
#
# 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)
# Sources
SRCS_$(d) := $(DIR_SOURCES)
TEST_ITEMS_$(d) :=
INSTALL_ITEMS_$(d) :=
# Append to sources for component
SOURCES := $(SOURCES) $(addprefix $(d), $(SRCS_$(d)))
# Test sources
ifeq ($(WANT_TEST),yes)
ifneq ($(DIR_TEST_ITEMS),)
# Extract the binary name from the ITEM
binary = $(subst /,_,$(addprefix $(d),$(firstword $(subst :, ,$(ITEM)))))
# Extract the list of sources from the ITEM
sources = $(subst ;, ,$(lastword $(subst :, ,$(ITEM))))
# We can't simply use the output of foreach here,
# as it space separates its output, which kinda defeats the point.
define append_test_src
TEST_ITEMS_$(d) := $$(TEST_ITEMS_$(d))$1;
endef
define append_test
TEST_ITEMS_$(d) := $$(TEST_ITEMS_$(d)) $1:
$$(eval $$(foreach TSRC,$2, \
$$(call append_test_src,$$(addprefix $$(d),$$(TSRC)))))
endef
# Append test items, prepending $(d) to each source file
$(eval $(foreach ITEM,$(DIR_TEST_ITEMS), \
$(call append_test,$(binary),$(sources))))
TEST_ITEMS := $(TEST_ITEMS) $(TEST_ITEMS_$(d))
TEST_TARGETS := $(TEST_TARGETS) test_$(d)
# Extract the binary name from the TEST
binary_name = $(firstword $(subst :, ,$(TEST)))
# Target for tests in this directory
test_$(d): $(d) $(addprefix $(BUILDDIR)/, \
$(foreach TEST,$(TEST_ITEMS_$(d)),$(binary_name)))
$(Q)$(SHAREDLDPATH) $(TESTRUNNER) $(BUILDDIR) \
$(CURDIR)/$< $(subst /,_,$<) $(EXEEXT)
endif
endif
# Install items
ifneq ($(DIR_INSTALL_ITEMS),)
# Extract the destination directory from the variable
dest_dir = $(firstword $(subst :, ,$(ITEM)))
# Extract the list of files to install
files = $(subst ;, ,$(lastword $(subst :, ,$(ITEM))))
define append_install_file
INSTALL_ITEMS_$(d) := $$(INSTALL_ITEMS_$(d))$1;
endef
define append_install_item
INSTALL_ITEMS_$(d) := $$(INSTALL_ITEMS_$(d)) $1:
$$(eval $$(foreach FILE,$2, \
$$(call append_install_file,$$(addprefix $$(d),$$(FILE)))))
endef
# Append items to install (along with install location), prepending $(d)
# to each item in the file list
$(eval $(foreach ITEM,$(DIR_INSTALL_ITEMS), \
$(call append_install_item,$(dest_dir),$(files))))
INSTALL_ITEMS := $(INSTALL_ITEMS) $(INSTALL_ITEMS_$(d))
endif
# Reset the inputs
DIR_SOURCES :=
DIR_TEST_ITEMS :=
DIR_INSTALL_ITEMS :=
# Now include any children we may have
MAKE_INCLUDES := $(wildcard $(d)*/Makefile)
$(eval $(foreach INC, $(MAKE_INCLUDES), $(call do_include,$(INC))))
# Pop off the directory stack
d := $(dirstack_$(sp))
sp := $(basename $(sp))
|