xref: /optee_os/mk/subdir.mk (revision f46a4a4a678bec681cb33f368646bc7f21d7440c)
1# Input
2#
3# subdirs	tells the subdirectories to descend
4#
5# Output
6#
7# set srcs
8# set     cflags-$(oname) cflags-remove-$(oname)
9#         aflags-$(oname) aflags-remove-$(oname)
10#         cppflags-$(oname) cppflags-remove-$(oname)
11#         incdirs-$(oname)
12#         incdirs-lib$(libname)  [if libname is defined]
13#         cppflags-lib$(libname) [if libname is defined]
14#         cflags-lib$(libname)   [if libname is defined]
15# for each file found, oname is the name of the object file for corresponding
16# source file
17
18srcs :=
19
20define process-subdir-srcs-y
21ifeq ($$(sub-dir),.)
22srcs 				+= $1
23oname				:= $(out-dir)/$(base-prefix)$(basename $1).o
24else
25ifneq ($(filter /%,$(1)),)
26# $1 is an absolute path - start with "/"
27srcs 				+= $1
28oname				:= $(out-dir)/$(base-prefix)$(basename $1).o
29else
30srcs				+= $(sub-dir)/$1
31oname				:= $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
32endif
33endif
34cflags-$$(oname) 		:= $$(cflags-y) $$(cflags-$(1)-y)
35cflags-remove-$$(oname) 	:= $$(cflags-remove-y) \
36					$$(cflags-remove-$(1)-y)
37cppflags-$$(oname) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
38cppflags-remove-$$(oname) 	:= $$(cppflags-remove-y) \
39					$$(cppflags-remove-$(1)-y)
40aflags-$$(oname) 		:= $$(aflags-y) $$(aflags-$(1)-y)
41aflags-remove-$$(oname) 	:= $$(aflags-remove-y) \
42					$$(aflags-remove-$(1)-y)
43incdirs-$$(oname)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
44# Clear local filename specific variables to avoid accidental reuse
45# in another subdirectory
46cflags-$(1)-y 			:=
47cflags-remove-$(1)-y		:=
48cflags-lib-y			:=
49cppflags-$(1)-y			:=
50cppflags-remove-$(1)-y		:=
51cppflags-lib-y			:=
52aflags-$(1)-y 			:=
53aflags-remove-$(1)-y		:=
54incdirs-$(1)-y			:=
55fname				:=
56oname				:=
57endef #process-subdir-srcs-y
58
59define process-subdir-gensrcs-helper
60# $1 gensrc-y element
61# $2 full path and name of generated source file
62# $3 full path and name of object file compiled from source file
63# $4 full path to out directory
64
65gen-srcs			+= $2
66oname				:= $3
67
68FORCE-GENSRC: $2
69
70$$(addprefix $4,$$(produce-additional-$1)): $2
71
72subdir-$2 := $$(sub-dir)
73recipe-$2 := $$(recipe-$1)
74$2: $$(depends-$1)
75	@$(cmd-echo-silent) '  GEN     $2'
76	$(q)mkdir -p $4
77	$(q)$$(recipe-$2)
78
79cflags-$$(oname) 		:= $$(cflags-y) $$(cflags-$(1)-y)
80cflags-remove-$$(oname) 	:= $$(cflags-remove-y) \
81					$$(cflags-remove-$(1)-y)
82cppflags-$$(oname) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
83cppflags-remove-$$(oname) 	:= $$(cppflags-remove-y) \
84					$$(cppflags-remove-$(1)-y)
85aflags-$$(oname) 		:= $$(aflags-y) $$(aflags-$(1)-y)
86aflags-remove-$$(oname) 	:= $$(aflags-remove-y) \
87					$$(aflags-remove-$(1)-y)
88incdirs-$$(oname)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
89# Clear local filename specific variables to avoid accidental reuse
90# in another subdirectory
91cflags-$(1)-y 			:=
92cflags-remove-$(1)-y		:=
93cflags-lib-y			:=
94cppflags-$(1)-y			:=
95cppflags-remove-$(1)-y		:=
96cppflags-lib-y			:=
97aflags-$(1)-y 			:=
98aflags-remove-$(1)-y		:=
99incdirs-$(1)-y			:=
100fname				:=
101oname				:=
102
103endef #process-subdir-gensrcs-helper
104
105define process-subdir-gensrcs-y
106$$(eval $$(call process-subdir-gensrcs-helper,$1,$(sub-dir-out)/$$(produce-$1),$(sub-dir-out)/$(basename $(produce-$1)).o,$(sub-dir-out)))
107endef #process-subdir-gensrcs-y
108
109define process-subdir
110sub-dir := $1
111ifeq ($1,.)
112sub-dir-out := $(out-dir)/$(base-prefix)
113else
114sub-dir-out := $(out-dir)/$(base-prefix)$1
115endif
116
117include $1/sub.mk
118sub-subdirs := $$(addprefix $1/,$$(subdirs-y))
119incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
120thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y))
121ifneq ($$(libname),)
122incdirs-lib$$(libname) := $$(incdirs-lib$$(libname)) $$(addprefix $1/,$$(incdirs-lib-y))
123cflags-lib$$(libname) := $$(cflags-lib$$(libname)) $$(cflags-lib-y)
124cppflags-lib$$(libname) := $$(cppflags-lib$$(libname)) $$(cppflags-lib-y)
125endif
126
127# Process files in current directory
128$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
129$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
130# Clear flags used when processing current directory
131srcs-y :=
132cflags-y :=
133cflags-lib-y :=
134cppflags-y :=
135cppflags-lib-y :=
136aflags-y :=
137cflags-remove-y :=
138subdirs-y :=
139global-incdirs-y :=
140incdirs-lib-y :=
141incdirs-y :=
142gensrcs-y :=
143this-out-dir :=
144
145# Process subdirectories in current directory
146$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
147endef #process-subdir
148
149# Top subdirectories
150$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))
151