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