blob: d280c309ecf54fefd31c8fa381e7d3f8468e77b1 [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
Jerome Forissier001524d2022-05-06 12:28:01 +020024uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
25
Pascal Brandb0104772014-06-12 15:56:20 +020026define process-subdir-srcs-y
27ifeq ($$(sub-dir),.)
Pascal Brand565e42f2014-08-07 13:42:57 +020028srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020029oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brandb0104772014-06-12 15:56:20 +020030else
Pascal Brand565e42f2014-08-07 13:42:57 +020031ifneq ($(filter /%,$(1)),)
32# $1 is an absolute path - start with "/"
33srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020034oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brand565e42f2014-08-07 13:42:57 +020035else
36srcs += $(sub-dir)/$1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020037oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
Pascal Brandb0104772014-06-12 15:56:20 +020038endif
Pascal Brand565e42f2014-08-07 13:42:57 +020039endif
Pascal Brandb0104772014-06-12 15:56:20 +020040cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
41cflags-remove-$$(oname) := $$(cflags-remove-y) \
42 $$(cflags-remove-$(1)-y)
Jerome Forissier40106182020-08-14 09:53:03 +020043cxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y)
44cxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \
45 $$(cxxflags-remove-$(1)-y)
Pascal Brandb0104772014-06-12 15:56:20 +020046cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
47cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
48 $$(cppflags-remove-$(1)-y)
49aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
50aflags-remove-$$(oname) := $$(aflags-remove-y) \
51 $$(aflags-remove-$(1)-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +020052incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
Pascal Brandb0104772014-06-12 15:56:20 +020053# Clear local filename specific variables to avoid accidental reuse
54# in another subdirectory
55cflags-$(1)-y :=
56cflags-remove-$(1)-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +010057cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +020058cxxflags-$(1)-y :=
59cxxflags-remove-$(1)-y :=
60cxxflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020061cppflags-$(1)-y :=
62cppflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020063cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020064aflags-$(1)-y :=
65aflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020066incdirs-$(1)-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020067fname :=
68oname :=
69endef #process-subdir-srcs-y
70
Jens Wiklander36a06052016-06-02 13:52:12 +020071define process-subdir-gensrcs-helper
72# $1 gensrc-y element
73# $2 full path and name of generated source file
74# $3 full path and name of object file compiled from source file
75# $4 full path to out directory
Jerome Forissiercba8ca12019-09-13 18:01:48 +020076# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file)
Jens Wiklander36a06052016-06-02 13:52:12 +020077
Jens Wiklanderc95ce412016-05-30 16:06:35 +020078gen-srcs += $2
Jerome Forissier27fd7c72019-10-23 17:59:07 +020079cleanfiles += $2
Jens Wiklander36a06052016-06-02 13:52:12 +020080oname := $3
81
Jerome Forissiercba8ca12019-09-13 18:01:48 +020082FORCE-GENSRC$(sm): $(if $(filter y,$5),$2,)
Jens Wiklander36a06052016-06-02 13:52:12 +020083
84$$(addprefix $4,$$(produce-additional-$1)): $2
85
86subdir-$2 := $$(sub-dir)
87recipe-$2 := $$(recipe-$1)
88$2: $$(depends-$1)
89 @$(cmd-echo-silent) ' GEN $2'
90 $(q)mkdir -p $4
91 $(q)$$(recipe-$2)
92
93cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
94cflags-remove-$$(oname) := $$(cflags-remove-y) \
95 $$(cflags-remove-$(1)-y)
Jerome Forissier40106182020-08-14 09:53:03 +020096cxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y)
97cxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \
98 $$(cxxflags-remove-$(1)-y)
Jens Wiklander36a06052016-06-02 13:52:12 +020099cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
100cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
101 $$(cppflags-remove-$(1)-y)
102aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
103aflags-remove-$$(oname) := $$(aflags-remove-y) \
104 $$(aflags-remove-$(1)-y)
105incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
106# Clear local filename specific variables to avoid accidental reuse
107# in another subdirectory
108cflags-$(1)-y :=
109cflags-remove-$(1)-y :=
110cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200111cxxflags-$(1)-y :=
112cxxflags-remove-$(1)-y :=
113cxxflags-lib-y :=
Jens Wiklander36a06052016-06-02 13:52:12 +0200114cppflags-$(1)-y :=
115cppflags-remove-$(1)-y :=
116cppflags-lib-y :=
117aflags-$(1)-y :=
118aflags-remove-$(1)-y :=
119incdirs-$(1)-y :=
120fname :=
121oname :=
122
123endef #process-subdir-gensrcs-helper
124
125define process-subdir-gensrcs-y
Jerome Forissiercba8ca12019-09-13 18:01:48 +0200126$$(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 +0200127endef #process-subdir-gensrcs-y
128
Jerome Forissier070168e2018-03-12 14:45:16 +0100129define process-subdir-asm-defines-y
130asm-defines-files += $(sub-dir)/$1
131endef #process-subdir-asm-defines-y
132
Pascal Brandb0104772014-06-12 15:56:20 +0200133define process-subdir
134sub-dir := $1
Jens Wiklander36a06052016-06-02 13:52:12 +0200135ifeq ($1,.)
Jerome Forissier3e3182a2020-05-13 13:16:02 +0200136sub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix))
Jens Wiklander36a06052016-06-02 13:52:12 +0200137else
138sub-dir-out := $(out-dir)/$(base-prefix)$1
139endif
140
Pascal Brandb0104772014-06-12 15:56:20 +0200141include $1/sub.mk
Jorge Ramirez-Ortizd50ff942022-01-19 15:47:54 +0100142sub-subdirs := $$(addprefix $1/,$$(subdirs-y)) $$(subdirs_ext-y)
Pascal Brandb0104772014-06-12 15:56:20 +0200143incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
Jorge Ramirez-Ortizd50ff942022-01-19 15:47:54 +0100144thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) $$(incdirs_ext-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +0200145ifneq ($$(libname),)
Jerome Forissier606f3782016-10-13 14:26:54 +0200146incdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y))
147cflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y)
Jerome Forissier40106182020-08-14 09:53:03 +0200148cxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y)
Jerome Forissier606f3782016-10-13 14:26:54 +0200149cppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +0200150endif
Pascal Brandb0104772014-06-12 15:56:20 +0200151
152# Process files in current directory
Jens Wiklander36a06052016-06-02 13:52:12 +0200153$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
Pascal Brandb0104772014-06-12 15:56:20 +0200154$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
Jerome Forissier070168e2018-03-12 14:45:16 +0100155$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a))))
Pascal Brandb0104772014-06-12 15:56:20 +0200156# Clear flags used when processing current directory
157srcs-y :=
158cflags-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +0100159cflags-lib-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200160cxxflags-y :=
161cxxflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200162cppflags-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200163cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200164aflags-y :=
165cflags-remove-y :=
Jerome Forissier40106182020-08-14 09:53:03 +0200166cxxflags-remove-y :=
Jens Wiklander098883e2020-07-17 09:32:45 +0200167aflags-remove-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200168subdirs-y :=
Jorge Ramirez-Ortizd50ff942022-01-19 15:47:54 +0100169subdirs_ext-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200170global-incdirs-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200171incdirs-lib-y :=
172incdirs-y :=
Jorge Ramirez-Ortizd50ff942022-01-19 15:47:54 +0100173incdirs_ext-y :=
Jens Wiklander36a06052016-06-02 13:52:12 +0200174gensrcs-y :=
175this-out-dir :=
Jerome Forissier070168e2018-03-12 14:45:16 +0100176asm-defines-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200177
178# Process subdirectories in current directory
Jerome Forissier001524d2022-05-06 12:28:01 +0200179$$(foreach sd, $$(call uniq,$$(sub-subdirs)), $$(eval $$(call process-subdir,$$(sd))))
Pascal Brandb0104772014-06-12 15:56:20 +0200180endef #process-subdir
181
182# Top subdirectories
Jerome Forissier001524d2022-05-06 12:28:01 +0200183$(foreach sd, $(call uniq,$(subdirs)), $(eval $(call process-subdir,$(sd))))