xref: /optee_os/mk/subdir.mk (revision 2e4805197955e0d12994088634b07e1bbece096f)
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)
94010618fSJerome 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]
164010618fSJerome 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
24001524d4SJerome Forissieruniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
25001524d4SJerome Forissier
26*2e480519SJens Wiklanderdefine process-file-vars-helper
27*2e480519SJens Wiklander# $1 is local source file name
2843d2c044SJens Wiklander# $2 is output file name
2943d2c044SJens Wiklandercflags-$(2) 		:= $$(cflags-y) $$(cflags-$(1)-y)
3043d2c044SJens Wiklandercflags-remove-$(2) 	:= $$(cflags-remove-y) $$(cflags-remove-$(1)-y)
3143d2c044SJens Wiklandercxxflags-$(2) 		:= $$(cxxflags-y) $$(cxxflags-$(1)-y)
3243d2c044SJens Wiklandercxxflags-remove-$(2) 	:= $$(cxxflags-remove-y) $$(cxxflags-remove-$(1)-y)
3343d2c044SJens Wiklandercppflags-$(2) 		:= $$(cppflags-y) $$(cppflags-$(1)-y)
3443d2c044SJens Wiklandercppflags-remove-$(2) 	:= $$(cppflags-remove-y) $$(cppflags-remove-$(1)-y)
3543d2c044SJens Wiklanderaflags-$(2) 		:= $$(aflags-y) $$(aflags-$(1)-y)
3643d2c044SJens Wiklanderaflags-remove-$(2) 	:= $$(aflags-remove-y) $$(aflags-remove-$(1)-y)
3743d2c044SJens Wiklanderincdirs-$(2)		:= $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
38b0104773SPascal Brand# Clear local filename specific variables to avoid accidental reuse
39b0104773SPascal Brand# in another subdirectory
40b0104773SPascal Brandcflags-$(1)-y 			:=
41b0104773SPascal Brandcflags-remove-$(1)-y		:=
423d34e125SJerome Forissiercflags-lib-y			:=
434010618fSJerome Forissiercxxflags-$(1)-y 		:=
444010618fSJerome Forissiercxxflags-remove-$(1)-y		:=
454010618fSJerome Forissiercxxflags-lib-y			:=
46b0104773SPascal Brandcppflags-$(1)-y			:=
47b0104773SPascal Brandcppflags-remove-$(1)-y		:=
4873dc728dSJerome Forissiercppflags-lib-y			:=
49b0104773SPascal Brandaflags-$(1)-y 			:=
50b0104773SPascal Brandaflags-remove-$(1)-y		:=
5173dc728dSJerome Forissierincdirs-$(1)-y			:=
52*2e480519SJens Wiklanderendef #process-file-vars-helper
53*2e480519SJens Wiklander
54*2e480519SJens Wiklanderdefine process-file-vars
55*2e480519SJens Wiklander# $1 is local source file name
56*2e480519SJens Wiklander# $2 is output file name
57*2e480519SJens Wiklander# $3 is tree source file name
58*2e480519SJens Wiklanderoname-$(sm)-$3	:= $$(if $$(oname-$1-y),$(out-dir)/$(base-prefix)/$$(oname-$1-y),$2)
59*2e480519SJens Wiklander$$(eval $$(call process-file-vars-helper,$1,$$(oname-$(sm)-$3)))
60*2e480519SJens Wiklanderendef
6143d2c044SJens Wiklander
6243d2c044SJens Wiklanderdefine process-subdir-srcs-y
6343d2c044SJens Wiklanderifeq ($$(sub-dir),.)
6443d2c044SJens Wiklandersrcs 		+= $1
65*2e480519SJens Wiklanderfname		:= $1
6643d2c044SJens Wiklanderoname		:= $(out-dir)/$(base-prefix)$(basename $1).o
6743d2c044SJens Wiklanderelse
6843d2c044SJens Wiklanderifneq ($(filter /%,$(1)),)
6943d2c044SJens Wiklander# $1 is an absolute path - start with "/"
7043d2c044SJens Wiklandersrcs 		+= $1
71*2e480519SJens Wiklanderfname		:= $1
7243d2c044SJens Wiklanderoname		:= $(out-dir)/$(base-prefix)$(basename $1).o
7343d2c044SJens Wiklanderelse
7443d2c044SJens Wiklandersrcs		+= $(sub-dir)/$1
75*2e480519SJens Wiklanderfname		:= $(sub-dir)/$1
7643d2c044SJens Wiklanderoname		:= $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
7743d2c044SJens Wiklanderendif
7843d2c044SJens Wiklanderendif
79*2e480519SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname),$$(fname)))
80*2e480519SJens Wiklanderendef #process-subdir-srcs-y
81*2e480519SJens Wiklander
82*2e480519SJens Wiklanderdefine process-subdir-srcs_ext-y
83*2e480519SJens Wiklanderifneq ($(filter /%,$(1)),)
84*2e480519SJens Wiklander$$(error Absolute path not supported for srcs_ext-y: $(1))
85*2e480519SJens Wiklanderendif
86*2e480519SJens Wiklandersrcs		+= $2/$1
87*2e480519SJens Wiklanderfname		:= $2/$1
88*2e480519SJens Wiklanderifeq ($$(sub-dir),.)
89*2e480519SJens Wiklanderoname		:= $(out-dir)/$(base-prefix)$(basename $1).o
90*2e480519SJens Wiklanderelse
91*2e480519SJens Wiklanderoname		:= $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
92*2e480519SJens Wiklanderendif
93*2e480519SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname),$$(fname)))
94b0104773SPascal Brandendef #process-subdir-srcs-y
95b0104773SPascal Brand
9636a06054SJens Wiklanderdefine process-subdir-gensrcs-helper
9736a06054SJens Wiklander# $1 gensrc-y element
9836a06054SJens Wiklander# $2 full path and name of generated source file
9936a06054SJens Wiklander# $3 full path and name of object file compiled from source file
10036a06054SJens Wiklander# $4 full path to out directory
101cba8ca1cSJerome Forissier# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file)
10236a06054SJens Wiklander
103c95ce41fSJens Wiklandergen-srcs			+= $2
10427fd7c71SJerome Forissiercleanfiles			+= $2
10536a06054SJens Wiklanderoname				:= $3
10636a06054SJens Wiklander
107cba8ca1cSJerome ForissierFORCE-GENSRC$(sm): $(if $(filter y,$5),$2,)
10836a06054SJens Wiklander
10936a06054SJens Wiklander$$(addprefix $4,$$(produce-additional-$1)): $2
11036a06054SJens Wiklander
11136a06054SJens Wiklandersubdir-$2 := $$(sub-dir)
11236a06054SJens Wiklanderrecipe-$2 := $$(recipe-$1)
11336a06054SJens Wiklander$2: $$(depends-$1)
11436a06054SJens Wiklander	@$(cmd-echo-silent) '  GEN     $2'
11536a06054SJens Wiklander	$(q)mkdir -p $4
11636a06054SJens Wiklander	$(q)$$(recipe-$2)
11736a06054SJens Wiklander
11843d2c044SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname)))
11936a06054SJens Wiklanderendef #process-subdir-gensrcs-helper
12036a06054SJens Wiklander
12136a06054SJens Wiklanderdefine process-subdir-gensrcs-y
122cba8ca1cSJerome 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)))
12336a06054SJens Wiklanderendef #process-subdir-gensrcs-y
12436a06054SJens Wiklander
125070168e2SJerome Forissierdefine process-subdir-asm-defines-y
126070168e2SJerome Forissierasm-defines-files += $(sub-dir)/$1
127070168e2SJerome Forissierendef #process-subdir-asm-defines-y
128070168e2SJerome Forissier
129b0104773SPascal Branddefine process-subdir
130b0104773SPascal Brandsub-dir := $1
13136a06054SJens Wiklanderifeq ($1,.)
1323e3182abSJerome Forissiersub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix))
13336a06054SJens Wiklanderelse
13436a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix)$1
13536a06054SJens Wiklanderendif
13636a06054SJens Wiklander
137b0104773SPascal Brandinclude $1/sub.mk
138d50ff941SJorge Ramirez-Ortizsub-subdirs := $$(addprefix $1/,$$(subdirs-y)) $$(subdirs_ext-y)
1395db2cbd7SJens Wiklanderincdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) $$(global-incdirs_ext-y)
140b7c039ebSJens Wiklandercppflags$(sm) := $$(cppflags$(sm)) $$(global-cppflags-y)
141d50ff941SJorge Ramirez-Ortizthissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) $$(incdirs_ext-y)
14273dc728dSJerome Forissierifneq ($$(libname),)
143606f378cSJerome Forissierincdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y))
144606f378cSJerome Forissiercflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y)
1454010618fSJerome Forissiercxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y)
146606f378cSJerome Forissiercppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y)
14773dc728dSJerome Forissierendif
148b0104773SPascal Brand
149b0104773SPascal Brand# Process files in current directory
15036a06054SJens Wiklander$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
151b0104773SPascal Brand$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
152*2e480519SJens Wiklander$$(foreach s, $$(srcs_ext-y), $$(eval $$(call \
153*2e480519SJens Wiklander	process-subdir-srcs_ext-y,$$(s),$$(firstword $$(srcs_ext_base-y)))))
154070168e2SJerome Forissier$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a))))
155b0104773SPascal Brand# Clear flags used when processing current directory
156b0104773SPascal Brandsrcs-y :=
157*2e480519SJens Wiklandersrcs_ext-y :=
158*2e480519SJens Wiklandersrcs_ext_base-y :=
159b0104773SPascal Brandcflags-y :=
1603d34e125SJerome Forissiercflags-lib-y :=
1614010618fSJerome Forissiercxxflags-y :=
1624010618fSJerome Forissiercxxflags-lib-y :=
163b0104773SPascal Brandcppflags-y :=
16473dc728dSJerome Forissiercppflags-lib-y :=
165b0104773SPascal Brandaflags-y :=
166b0104773SPascal Brandcflags-remove-y :=
1674010618fSJerome Forissiercxxflags-remove-y :=
168098883e8SJens Wiklanderaflags-remove-y :=
169b0104773SPascal Brandsubdirs-y :=
170d50ff941SJorge Ramirez-Ortizsubdirs_ext-y :=
171b0104773SPascal Brandglobal-incdirs-y :=
1725db2cbd7SJens Wiklanderglobal-incdirs_ext-y :=
173b7c039ebSJens Wiklanderglobal-cppflags-y :=
17473dc728dSJerome Forissierincdirs-lib-y :=
17573dc728dSJerome Forissierincdirs-y :=
176d50ff941SJorge Ramirez-Ortizincdirs_ext-y :=
17736a06054SJens Wiklandergensrcs-y :=
17836a06054SJens Wiklanderthis-out-dir :=
179070168e2SJerome Forissierasm-defines-y :=
180b0104773SPascal Brand
181b0104773SPascal Brand# Process subdirectories in current directory
182001524d4SJerome Forissier$$(foreach sd, $$(call uniq,$$(sub-subdirs)), $$(eval $$(call process-subdir,$$(sd))))
183b0104773SPascal Brandendef #process-subdir
184b0104773SPascal Brand
185b0104773SPascal Brand# Top subdirectories
186001524d4SJerome Forissier$(foreach sd, $(call uniq,$(subdirs)), $(eval $(call process-subdir,$(sd))))
187