xref: /optee_os/mk/subdir.mk (revision 64cbf7ca6ad2cd036d355a094d12413e7ca845d4)
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# for each file found, oname is the name of the object file for corresponding
15# source file
16
17srcs :=
18
19define process-subdir-srcs-y
20ifeq ($$(sub-dir),.)
21srcs 				+= $1
22oname				:= $(out-dir)/$(base-prefix)$(basename $1).o
23else
24ifneq ($(filter /%,$(1)),)
25# $1 is an absolute path - start with "/"
26srcs 				+= $1
27oname				:= $(out-dir)/$(base-prefix)$(basename $1).o
28else
29srcs				+= $(sub-dir)/$1
30oname				:= $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
31endif
32endif
33cflags-$$(oname) 		:= $$(cflags-y) $$(cflags-$(1)-y)
34cflags-remove-$$(oname) 	:= $$(cflags-remove-y) \
35					$$(cflags-remove-$(1)-y)
36cppflags-$$(oname) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
37cppflags-remove-$$(oname) 	:= $$(cppflags-remove-y) \
38					$$(cppflags-remove-$(1)-y)
39aflags-$$(oname) 		:= $$(aflags-y) $$(aflags-$(1)-y)
40aflags-remove-$$(oname) 	:= $$(aflags-remove-y) \
41					$$(aflags-remove-$(1)-y)
42incdirs-$$(oname)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
43# Clear local filename specific variables to avoid accidental reuse
44# in another subdirectory
45cflags-$(1)-y 			:=
46cflags-remove-$(1)-y		:=
47cppflags-$(1)-y			:=
48cppflags-remove-$(1)-y		:=
49cppflags-lib-y			:=
50aflags-$(1)-y 			:=
51aflags-remove-$(1)-y		:=
52incdirs-$(1)-y			:=
53fname				:=
54oname				:=
55endef #process-subdir-srcs-y
56
57define process-subdir
58sub-dir := $1
59include $1/sub.mk
60sub-subdirs := $$(addprefix $1/,$$(subdirs-y))
61incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
62thissubdir-incdirs := $$(addprefix $1/,$$(incdirs-y))
63ifneq ($$(libname),)
64incdirs-lib$$(libname) := $$(incdirs-lib$$(libname)) $$(addprefix $1/,$$(incdirs-lib-y))
65cppflags-lib$$(libname) := $$(cppflags-lib$$(libname)) $$(cppflags-lib-y)
66endif
67
68# Process files in current directory
69$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
70# Clear flags used when processing current directory
71srcs-y :=
72cflags-y :=
73cppflags-y :=
74cppflags-lib-y :=
75aflags-y :=
76cflags-remove-y :=
77subdirs-y :=
78global-incdirs-y :=
79incdirs-lib-y :=
80incdirs-y :=
81
82# Process subdirectories in current directory
83$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
84endef #process-subdir
85
86# Top subdirectories
87$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))
88