blob: 39a3f4556e36a0cbb52523225624d5f0a8a37d61 [file] [log] [blame]
Pascal Brandb0104772014-06-12 15:56:20 +02001# Input
2#
3# subdirs tells the subdirectories to descend
4#
5# Output
6#
Jens Wiklander13301e12017-04-06 09:07:08 +02007# set srcs gen-srcs
Pascal Brandb0104772014-06-12 15:56:20 +02008# set cflags-$(oname) cflags-remove-$(oname)
Jerome Forissier40106182020-08-14 09:53:03 +02009# cxxflags-$(oname) cxxflags-remove-$(oname)
Pascal Brandb0104772014-06-12 15:56:20 +020010# aflags-$(oname) aflags-remove-$(oname)
11# cppflags-$(oname) cppflags-remove-$(oname)
Jerome Forissier73dc7282014-09-25 16:04:03 +020012# incdirs-$(oname)
Jerome Forissier606f3782016-10-13 14:26:54 +020013# incdirs-lib$(libname)-$(sm) [if libname is defined]
14# cppflags-lib$(libname)-$(sm) [if libname is defined]
15# cflags-lib$(libname)-$(sm) [if libname is defined]
Jerome Forissier40106182020-08-14 09:53:03 +020016# cxxflags-lib$(libname)-$(sm) [if libname is defined]
Pascal Brandb0104772014-06-12 15:56:20 +020017# for each file found, oname is the name of the object file for corresponding
18# source file
19
20srcs :=
Jens Wiklander13301e12017-04-06 09:07:08 +020021gen-srcs :=
Jerome Forissier070168e2018-03-12 14:45:16 +010022asm-defines-files :=
Pascal Brandb0104772014-06-12 15:56:20 +020023
24define process-subdir-srcs-y
25ifeq ($$(sub-dir),.)
Pascal Brand565e42f2014-08-07 13:42:57 +020026srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020027oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brandb0104772014-06-12 15:56:20 +020028else
Pascal Brand565e42f2014-08-07 13:42:57 +020029ifneq ($(filter /%,$(1)),)
30# $1 is an absolute path - start with "/"
31srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020032oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brand565e42f2014-08-07 13:42:57 +020033else
34srcs += $(sub-dir)/$1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020035oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
Pascal Brandb0104772014-06-12 15:56:20 +020036endif
Pascal Brand565e42f2014-08-07 13:42:57 +020037endif
Pascal Brandb0104772014-06-12 15:56:20 +020038cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
39cflags-remove-$$(oname) := $$(cflags-remove-y) \
40 $$(cflags-remove-$(1)-y)
Jerome Forissier40106182020-08-14 09:53:03 +020041cxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y)
42cxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \
43 $$(cxxflags-remove-$(1)-y)
Pascal Brandb0104772014-06-12 15:56:20 +020044cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
45cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
46 $$(cppflags-remove-$(1)-y)
47aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
48aflags-remove-$$(oname) := $$(aflags-remove-y) \
49 $$(aflags-remove-$(1)-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +020050incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
Pascal Brandb0104772014-06-12 15:56:20 +020051# Clear local filename specific variables to avoid accidental reuse
52# in another subdirectory
53cflags-$(1)-y :=
54cflags-remove-$(1)-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +010055cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +020056cxxflags-$(1)-y :=
57cxxflags-remove-$(1)-y :=
58cxxflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020059cppflags-$(1)-y :=
60cppflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020061cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020062aflags-$(1)-y :=
63aflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020064incdirs-$(1)-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020065fname :=
66oname :=
67endef #process-subdir-srcs-y
68
Jens Wiklander36a06052016-06-02 13:52:12 +020069define process-subdir-gensrcs-helper
70# $1 gensrc-y element
71# $2 full path and name of generated source file
72# $3 full path and name of object file compiled from source file
73# $4 full path to out directory
Jerome Forissiercba8ca12019-09-13 18:01:48 +020074# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file)
Jens Wiklander36a06052016-06-02 13:52:12 +020075
Jens Wiklanderc95ce412016-05-30 16:06:35 +020076gen-srcs += $2
Jerome Forissier27fd7c72019-10-23 17:59:07 +020077cleanfiles += $2
Jens Wiklander36a06052016-06-02 13:52:12 +020078oname := $3
79
Jerome Forissiercba8ca12019-09-13 18:01:48 +020080FORCE-GENSRC$(sm): $(if $(filter y,$5),$2,)
Jens Wiklander36a06052016-06-02 13:52:12 +020081
82$$(addprefix $4,$$(produce-additional-$1)): $2
83
84subdir-$2 := $$(sub-dir)
85recipe-$2 := $$(recipe-$1)
86$2: $$(depends-$1)
87 @$(cmd-echo-silent) ' GEN $2'
88 $(q)mkdir -p $4
89 $(q)$$(recipe-$2)
90
91cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
92cflags-remove-$$(oname) := $$(cflags-remove-y) \
93 $$(cflags-remove-$(1)-y)
Jerome Forissier40106182020-08-14 09:53:03 +020094cxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y)
95cxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \
96 $$(cxxflags-remove-$(1)-y)
Jens Wiklander36a06052016-06-02 13:52:12 +020097cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
98cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
99 $$(cppflags-remove-$(1)-y)
100aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
101aflags-remove-$$(oname) := $$(aflags-remove-y) \
102 $$(aflags-remove-$(1)-y)
103incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
104# Clear local filename specific variables to avoid accidental reuse
105# in another subdirectory
106cflags-$(1)-y :=
107cflags-remove-$(1)-y :=
108cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200109cxxflags-$(1)-y :=
110cxxflags-remove-$(1)-y :=
111cxxflags-lib-y :=
Jens Wiklander36a06052016-06-02 13:52:12 +0200112cppflags-$(1)-y :=
113cppflags-remove-$(1)-y :=
114cppflags-lib-y :=
115aflags-$(1)-y :=
116aflags-remove-$(1)-y :=
117incdirs-$(1)-y :=
118fname :=
119oname :=
120
121endef #process-subdir-gensrcs-helper
122
123define process-subdir-gensrcs-y
Jerome Forissiercba8ca12019-09-13 18:01:48 +0200124$$(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)))
Jens Wiklander36a06052016-06-02 13:52:12 +0200125endef #process-subdir-gensrcs-y
126
Jerome Forissier070168e2018-03-12 14:45:16 +0100127define process-subdir-asm-defines-y
128asm-defines-files += $(sub-dir)/$1
129endef #process-subdir-asm-defines-y
130
Pascal Brandb0104772014-06-12 15:56:20 +0200131define process-subdir
132sub-dir := $1
Jens Wiklander36a06052016-06-02 13:52:12 +0200133ifeq ($1,.)
Jerome Forissier3e3182a2020-05-13 13:16:02 +0200134sub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix))
Jens Wiklander36a06052016-06-02 13:52:12 +0200135else
136sub-dir-out := $(out-dir)/$(base-prefix)$1
137endif
138
Pascal Brandb0104772014-06-12 15:56:20 +0200139include $1/sub.mk
140sub-subdirs := $$(addprefix $1/,$$(subdirs-y))
141incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
Jens Wiklander36a06052016-06-02 13:52:12 +0200142thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y))
Jerome Forissier73dc7282014-09-25 16:04:03 +0200143ifneq ($$(libname),)
Jerome Forissier606f3782016-10-13 14:26:54 +0200144incdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y))
145cflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y)
Jerome Forissier40106182020-08-14 09:53:03 +0200146cxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y)
Jerome Forissier606f3782016-10-13 14:26:54 +0200147cppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +0200148endif
Pascal Brandb0104772014-06-12 15:56:20 +0200149
150# Process files in current directory
Jens Wiklander36a06052016-06-02 13:52:12 +0200151$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
Pascal Brandb0104772014-06-12 15:56:20 +0200152$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
Jerome Forissier070168e2018-03-12 14:45:16 +0100153$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a))))
Pascal Brandb0104772014-06-12 15:56:20 +0200154# Clear flags used when processing current directory
155srcs-y :=
156cflags-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +0100157cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200158cxxflags-y :=
159cxxflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200160cppflags-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200161cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200162aflags-y :=
163cflags-remove-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200164cxxflags-remove-y :=
Jens Wiklander098883e2020-07-17 09:32:45 +0200165aflags-remove-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200166subdirs-y :=
167global-incdirs-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200168incdirs-lib-y :=
169incdirs-y :=
Jens Wiklander36a06052016-06-02 13:52:12 +0200170gensrcs-y :=
171this-out-dir :=
Jerome Forissier070168e2018-03-12 14:45:16 +0100172asm-defines-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200173
174# Process subdirectories in current directory
175$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
176endef #process-subdir
177
178# Top subdirectories
179$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))