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