xref: /optee_os/mk/subdir.mk (revision 316a94e710afc8dcb5b6ac991741ac6370af65fc)
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
60sub-dir := $1
61include $1/sub.mk
62sub-subdirs := $$(addprefix $1/,$$(subdirs-y))
63incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
64thissubdir-incdirs := $$(addprefix $1/,$$(incdirs-y))
65ifneq ($$(libname),)
66incdirs-lib$$(libname) := $$(incdirs-lib$$(libname)) $$(addprefix $1/,$$(incdirs-lib-y))
67cflags-lib$$(libname) := $$(cflags-lib$$(libname)) $$(cflags-lib-y)
68cppflags-lib$$(libname) := $$(cppflags-lib$$(libname)) $$(cppflags-lib-y)
69endif
70
71# Process files in current directory
72$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
73# Clear flags used when processing current directory
74srcs-y :=
75cflags-y :=
76cflags-lib-y :=
77cppflags-y :=
78cppflags-lib-y :=
79aflags-y :=
80cflags-remove-y :=
81subdirs-y :=
82global-incdirs-y :=
83incdirs-lib-y :=
84incdirs-y :=
85
86# Process subdirectories in current directory
87$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
88endef #process-subdir
89
90# Top subdirectories
91$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))
92