xref: /optee_os/mk/subdir.mk (revision 4010618f8dbfd8c894bfb7fc4be696de80499c9b)
1b0104773SPascal Brand# Input
2b0104773SPascal Brand#
3b0104773SPascal Brand# subdirs	tells the subdirectories to descend
4b0104773SPascal Brand#
5b0104773SPascal Brand# Output
6b0104773SPascal Brand#
713301e12SJens Wiklander# set     srcs gen-srcs
8b0104773SPascal Brand# set     cflags-$(oname) cflags-remove-$(oname)
9*4010618fSJerome Forissier#         cxxflags-$(oname) cxxflags-remove-$(oname)
10b0104773SPascal Brand#         aflags-$(oname) aflags-remove-$(oname)
11b0104773SPascal Brand#         cppflags-$(oname) cppflags-remove-$(oname)
1273dc728dSJerome Forissier#         incdirs-$(oname)
13606f378cSJerome Forissier#         incdirs-lib$(libname)-$(sm)  [if libname is defined]
14606f378cSJerome Forissier#         cppflags-lib$(libname)-$(sm) [if libname is defined]
15606f378cSJerome Forissier#         cflags-lib$(libname)-$(sm)   [if libname is defined]
16*4010618fSJerome Forissier#         cxxflags-lib$(libname)-$(sm) [if libname is defined]
17b0104773SPascal Brand# for each file found, oname is the name of the object file for corresponding
18b0104773SPascal Brand# source file
19b0104773SPascal Brand
20b0104773SPascal Brandsrcs :=
2113301e12SJens Wiklandergen-srcs :=
22070168e2SJerome Forissierasm-defines-files :=
23b0104773SPascal Brand
24b0104773SPascal Branddefine process-subdir-srcs-y
25b0104773SPascal Brandifeq ($$(sub-dir),.)
26565e42f9SPascal Brandsrcs 				+= $1
274334e8d7SJerome Forissieroname				:= $(out-dir)/$(base-prefix)$(basename $1).o
28b0104773SPascal Brandelse
29565e42f9SPascal Brandifneq ($(filter /%,$(1)),)
30565e42f9SPascal Brand# $1 is an absolute path - start with "/"
31565e42f9SPascal Brandsrcs 				+= $1
324334e8d7SJerome Forissieroname				:= $(out-dir)/$(base-prefix)$(basename $1).o
33565e42f9SPascal Brandelse
34565e42f9SPascal Brandsrcs				+= $(sub-dir)/$1
354334e8d7SJerome Forissieroname				:= $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
36b0104773SPascal Brandendif
37565e42f9SPascal Brandendif
38b0104773SPascal Brandcflags-$$(oname) 		:= $$(cflags-y) $$(cflags-$(1)-y)
39b0104773SPascal Brandcflags-remove-$$(oname) 	:= $$(cflags-remove-y) \
40b0104773SPascal Brand					$$(cflags-remove-$(1)-y)
41*4010618fSJerome Forissiercxxflags-$$(oname) 		:= $$(cxxflags-y) $$(cxxflags-$(1)-y)
42*4010618fSJerome Forissiercxxflags-remove-$$(oname) 	:= $$(cxxflags-remove-y) \
43*4010618fSJerome Forissier					$$(cxxflags-remove-$(1)-y)
44b0104773SPascal Brandcppflags-$$(oname) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
45b0104773SPascal Brandcppflags-remove-$$(oname) 	:= $$(cppflags-remove-y) \
46b0104773SPascal Brand					$$(cppflags-remove-$(1)-y)
47b0104773SPascal Brandaflags-$$(oname) 		:= $$(aflags-y) $$(aflags-$(1)-y)
48b0104773SPascal Brandaflags-remove-$$(oname) 	:= $$(aflags-remove-y) \
49b0104773SPascal Brand					$$(aflags-remove-$(1)-y)
5073dc728dSJerome Forissierincdirs-$$(oname)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
51b0104773SPascal Brand# Clear local filename specific variables to avoid accidental reuse
52b0104773SPascal Brand# in another subdirectory
53b0104773SPascal Brandcflags-$(1)-y 			:=
54b0104773SPascal Brandcflags-remove-$(1)-y		:=
553d34e125SJerome Forissiercflags-lib-y			:=
56*4010618fSJerome Forissiercxxflags-$(1)-y 		:=
57*4010618fSJerome Forissiercxxflags-remove-$(1)-y		:=
58*4010618fSJerome Forissiercxxflags-lib-y			:=
59b0104773SPascal Brandcppflags-$(1)-y			:=
60b0104773SPascal Brandcppflags-remove-$(1)-y		:=
6173dc728dSJerome Forissiercppflags-lib-y			:=
62b0104773SPascal Brandaflags-$(1)-y 			:=
63b0104773SPascal Brandaflags-remove-$(1)-y		:=
6473dc728dSJerome Forissierincdirs-$(1)-y			:=
65b0104773SPascal Brandfname				:=
66b0104773SPascal Brandoname				:=
67b0104773SPascal Brandendef #process-subdir-srcs-y
68b0104773SPascal Brand
6936a06054SJens Wiklanderdefine process-subdir-gensrcs-helper
7036a06054SJens Wiklander# $1 gensrc-y element
7136a06054SJens Wiklander# $2 full path and name of generated source file
7236a06054SJens Wiklander# $3 full path and name of object file compiled from source file
7336a06054SJens Wiklander# $4 full path to out directory
74cba8ca1cSJerome Forissier# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file)
7536a06054SJens Wiklander
76c95ce41fSJens Wiklandergen-srcs			+= $2
7727fd7c71SJerome Forissiercleanfiles			+= $2
7836a06054SJens Wiklanderoname				:= $3
7936a06054SJens Wiklander
80cba8ca1cSJerome ForissierFORCE-GENSRC$(sm): $(if $(filter y,$5),$2,)
8136a06054SJens Wiklander
8236a06054SJens Wiklander$$(addprefix $4,$$(produce-additional-$1)): $2
8336a06054SJens Wiklander
8436a06054SJens Wiklandersubdir-$2 := $$(sub-dir)
8536a06054SJens Wiklanderrecipe-$2 := $$(recipe-$1)
8636a06054SJens Wiklander$2: $$(depends-$1)
8736a06054SJens Wiklander	@$(cmd-echo-silent) '  GEN     $2'
8836a06054SJens Wiklander	$(q)mkdir -p $4
8936a06054SJens Wiklander	$(q)$$(recipe-$2)
9036a06054SJens Wiklander
9136a06054SJens Wiklandercflags-$$(oname) 		:= $$(cflags-y) $$(cflags-$(1)-y)
9236a06054SJens Wiklandercflags-remove-$$(oname) 	:= $$(cflags-remove-y) \
9336a06054SJens Wiklander					$$(cflags-remove-$(1)-y)
94*4010618fSJerome Forissiercxxflags-$$(oname) 		:= $$(cxxflags-y) $$(cxxflags-$(1)-y)
95*4010618fSJerome Forissiercxxflags-remove-$$(oname) 	:= $$(cxxflags-remove-y) \
96*4010618fSJerome Forissier					$$(cxxflags-remove-$(1)-y)
9736a06054SJens Wiklandercppflags-$$(oname) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
9836a06054SJens Wiklandercppflags-remove-$$(oname) 	:= $$(cppflags-remove-y) \
9936a06054SJens Wiklander					$$(cppflags-remove-$(1)-y)
10036a06054SJens Wiklanderaflags-$$(oname) 		:= $$(aflags-y) $$(aflags-$(1)-y)
10136a06054SJens Wiklanderaflags-remove-$$(oname) 	:= $$(aflags-remove-y) \
10236a06054SJens Wiklander					$$(aflags-remove-$(1)-y)
10336a06054SJens Wiklanderincdirs-$$(oname)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
10436a06054SJens Wiklander# Clear local filename specific variables to avoid accidental reuse
10536a06054SJens Wiklander# in another subdirectory
10636a06054SJens Wiklandercflags-$(1)-y 			:=
10736a06054SJens Wiklandercflags-remove-$(1)-y		:=
10836a06054SJens Wiklandercflags-lib-y			:=
109*4010618fSJerome Forissiercxxflags-$(1)-y 			:=
110*4010618fSJerome Forissiercxxflags-remove-$(1)-y		:=
111*4010618fSJerome Forissiercxxflags-lib-y			:=
11236a06054SJens Wiklandercppflags-$(1)-y			:=
11336a06054SJens Wiklandercppflags-remove-$(1)-y		:=
11436a06054SJens Wiklandercppflags-lib-y			:=
11536a06054SJens Wiklanderaflags-$(1)-y 			:=
11636a06054SJens Wiklanderaflags-remove-$(1)-y		:=
11736a06054SJens Wiklanderincdirs-$(1)-y			:=
11836a06054SJens Wiklanderfname				:=
11936a06054SJens Wiklanderoname				:=
12036a06054SJens Wiklander
12136a06054SJens Wiklanderendef #process-subdir-gensrcs-helper
12236a06054SJens Wiklander
12336a06054SJens Wiklanderdefine process-subdir-gensrcs-y
124cba8ca1cSJerome Forissier$$(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)))
12536a06054SJens Wiklanderendef #process-subdir-gensrcs-y
12636a06054SJens Wiklander
127070168e2SJerome Forissierdefine process-subdir-asm-defines-y
128070168e2SJerome Forissierasm-defines-files += $(sub-dir)/$1
129070168e2SJerome Forissierendef #process-subdir-asm-defines-y
130070168e2SJerome Forissier
131b0104773SPascal Branddefine process-subdir
132b0104773SPascal Brandsub-dir := $1
13336a06054SJens Wiklanderifeq ($1,.)
1343e3182abSJerome Forissiersub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix))
13536a06054SJens Wiklanderelse
13636a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix)$1
13736a06054SJens Wiklanderendif
13836a06054SJens Wiklander
139b0104773SPascal Brandinclude $1/sub.mk
140b0104773SPascal Brandsub-subdirs := $$(addprefix $1/,$$(subdirs-y))
141b0104773SPascal Brandincdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
14236a06054SJens Wiklanderthissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y))
14373dc728dSJerome Forissierifneq ($$(libname),)
144606f378cSJerome Forissierincdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y))
145606f378cSJerome Forissiercflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y)
146*4010618fSJerome Forissiercxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y)
147606f378cSJerome Forissiercppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y)
14873dc728dSJerome Forissierendif
149b0104773SPascal Brand
150b0104773SPascal Brand# Process files in current directory
15136a06054SJens Wiklander$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
152b0104773SPascal Brand$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
153070168e2SJerome Forissier$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a))))
154b0104773SPascal Brand# Clear flags used when processing current directory
155b0104773SPascal Brandsrcs-y :=
156b0104773SPascal Brandcflags-y :=
1573d34e125SJerome Forissiercflags-lib-y :=
158*4010618fSJerome Forissiercxxflags-y :=
159*4010618fSJerome Forissiercxxflags-lib-y :=
160b0104773SPascal Brandcppflags-y :=
16173dc728dSJerome Forissiercppflags-lib-y :=
162b0104773SPascal Brandaflags-y :=
163b0104773SPascal Brandcflags-remove-y :=
164*4010618fSJerome Forissiercxxflags-remove-y :=
165098883e8SJens Wiklanderaflags-remove-y :=
166b0104773SPascal Brandsubdirs-y :=
167b0104773SPascal Brandglobal-incdirs-y :=
16873dc728dSJerome Forissierincdirs-lib-y :=
16973dc728dSJerome Forissierincdirs-y :=
17036a06054SJens Wiklandergensrcs-y :=
17136a06054SJens Wiklanderthis-out-dir :=
172070168e2SJerome Forissierasm-defines-y :=
173b0104773SPascal Brand
174b0104773SPascal Brand# Process subdirectories in current directory
175b0104773SPascal Brand$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
176b0104773SPascal Brandendef #process-subdir
177b0104773SPascal Brand
178b0104773SPascal Brand# Top subdirectories
179b0104773SPascal Brand$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))
180