blob: ff9e972804a56fa22bb5aec4d51ed23a1ca2c975 [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)
9# aflags-$(oname) aflags-remove-$(oname)
10# cppflags-$(oname) cppflags-remove-$(oname)
Jerome Forissier73dc7282014-09-25 16:04:03 +020011# incdirs-$(oname)
Jerome Forissier606f3782016-10-13 14:26:54 +020012# incdirs-lib$(libname)-$(sm) [if libname is defined]
13# cppflags-lib$(libname)-$(sm) [if libname is defined]
14# cflags-lib$(libname)-$(sm) [if libname is defined]
Pascal Brandb0104772014-06-12 15:56:20 +020015# for each file found, oname is the name of the object file for corresponding
16# source file
17
18srcs :=
Jens Wiklander13301e12017-04-06 09:07:08 +020019gen-srcs :=
Jerome Forissier070168e2018-03-12 14:45:16 +010020asm-defines-files :=
Pascal Brandb0104772014-06-12 15:56:20 +020021
22define process-subdir-srcs-y
23ifeq ($$(sub-dir),.)
Pascal Brand565e42f2014-08-07 13:42:57 +020024srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020025oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brandb0104772014-06-12 15:56:20 +020026else
Pascal Brand565e42f2014-08-07 13:42:57 +020027ifneq ($(filter /%,$(1)),)
28# $1 is an absolute path - start with "/"
29srcs += $1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020030oname := $(out-dir)/$(base-prefix)$(basename $1).o
Pascal Brand565e42f2014-08-07 13:42:57 +020031else
32srcs += $(sub-dir)/$1
Jerome Forissier4334e8d2014-09-08 10:53:42 +020033oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o
Pascal Brandb0104772014-06-12 15:56:20 +020034endif
Pascal Brand565e42f2014-08-07 13:42:57 +020035endif
Pascal Brandb0104772014-06-12 15:56:20 +020036cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
37cflags-remove-$$(oname) := $$(cflags-remove-y) \
38 $$(cflags-remove-$(1)-y)
39cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
40cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
41 $$(cppflags-remove-$(1)-y)
42aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
43aflags-remove-$$(oname) := $$(aflags-remove-y) \
44 $$(aflags-remove-$(1)-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +020045incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
Pascal Brandb0104772014-06-12 15:56:20 +020046# Clear local filename specific variables to avoid accidental reuse
47# in another subdirectory
48cflags-$(1)-y :=
49cflags-remove-$(1)-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +010050cflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020051cppflags-$(1)-y :=
52cppflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020053cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020054aflags-$(1)-y :=
55aflags-remove-$(1)-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +020056incdirs-$(1)-y :=
Pascal Brandb0104772014-06-12 15:56:20 +020057fname :=
58oname :=
59endef #process-subdir-srcs-y
60
Jens Wiklander36a06052016-06-02 13:52:12 +020061define process-subdir-gensrcs-helper
62# $1 gensrc-y element
63# $2 full path and name of generated source file
64# $3 full path and name of object file compiled from source file
65# $4 full path to out directory
Jerome Forissiercba8ca12019-09-13 18:01:48 +020066# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file)
Jens Wiklander36a06052016-06-02 13:52:12 +020067
Jens Wiklanderc95ce412016-05-30 16:06:35 +020068gen-srcs += $2
Jerome Forissier27fd7c72019-10-23 17:59:07 +020069cleanfiles += $2
Jens Wiklander36a06052016-06-02 13:52:12 +020070oname := $3
71
Jerome Forissiercba8ca12019-09-13 18:01:48 +020072FORCE-GENSRC$(sm): $(if $(filter y,$5),$2,)
Jens Wiklander36a06052016-06-02 13:52:12 +020073
74$$(addprefix $4,$$(produce-additional-$1)): $2
75
76subdir-$2 := $$(sub-dir)
77recipe-$2 := $$(recipe-$1)
78$2: $$(depends-$1)
79 @$(cmd-echo-silent) ' GEN $2'
80 $(q)mkdir -p $4
81 $(q)$$(recipe-$2)
82
83cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y)
84cflags-remove-$$(oname) := $$(cflags-remove-y) \
85 $$(cflags-remove-$(1)-y)
86cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y)
87cppflags-remove-$$(oname) := $$(cppflags-remove-y) \
88 $$(cppflags-remove-$(1)-y)
89aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y)
90aflags-remove-$$(oname) := $$(aflags-remove-y) \
91 $$(aflags-remove-$(1)-y)
92incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y))
93# Clear local filename specific variables to avoid accidental reuse
94# in another subdirectory
95cflags-$(1)-y :=
96cflags-remove-$(1)-y :=
97cflags-lib-y :=
98cppflags-$(1)-y :=
99cppflags-remove-$(1)-y :=
100cppflags-lib-y :=
101aflags-$(1)-y :=
102aflags-remove-$(1)-y :=
103incdirs-$(1)-y :=
104fname :=
105oname :=
106
107endef #process-subdir-gensrcs-helper
108
109define process-subdir-gensrcs-y
Jerome Forissiercba8ca12019-09-13 18:01:48 +0200110$$(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 +0200111endef #process-subdir-gensrcs-y
112
Jerome Forissier070168e2018-03-12 14:45:16 +0100113define process-subdir-asm-defines-y
114asm-defines-files += $(sub-dir)/$1
115endef #process-subdir-asm-defines-y
116
Pascal Brandb0104772014-06-12 15:56:20 +0200117define process-subdir
118sub-dir := $1
Jens Wiklander36a06052016-06-02 13:52:12 +0200119ifeq ($1,.)
120sub-dir-out := $(out-dir)/$(base-prefix)
121else
122sub-dir-out := $(out-dir)/$(base-prefix)$1
123endif
124
Pascal Brandb0104772014-06-12 15:56:20 +0200125include $1/sub.mk
126sub-subdirs := $$(addprefix $1/,$$(subdirs-y))
127incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y))
Jens Wiklander36a06052016-06-02 13:52:12 +0200128thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y))
Jerome Forissier73dc7282014-09-25 16:04:03 +0200129ifneq ($$(libname),)
Jerome Forissier606f3782016-10-13 14:26:54 +0200130incdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y))
131cflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y)
132cppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y)
Jerome Forissier73dc7282014-09-25 16:04:03 +0200133endif
Pascal Brandb0104772014-06-12 15:56:20 +0200134
135# Process files in current directory
Jens Wiklander36a06052016-06-02 13:52:12 +0200136$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g))))
Pascal Brandb0104772014-06-12 15:56:20 +0200137$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s))))
Jerome Forissier070168e2018-03-12 14:45:16 +0100138$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a))))
Pascal Brandb0104772014-06-12 15:56:20 +0200139# Clear flags used when processing current directory
140srcs-y :=
141cflags-y :=
Jerome Forissier3d34e122014-10-30 17:37:42 +0100142cflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200143cppflags-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200144cppflags-lib-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200145aflags-y :=
146cflags-remove-y :=
147subdirs-y :=
148global-incdirs-y :=
Jerome Forissier73dc7282014-09-25 16:04:03 +0200149incdirs-lib-y :=
150incdirs-y :=
Jens Wiklander36a06052016-06-02 13:52:12 +0200151gensrcs-y :=
152this-out-dir :=
Jerome Forissier070168e2018-03-12 14:45:16 +0100153asm-defines-y :=
Pascal Brandb0104772014-06-12 15:56:20 +0200154
155# Process subdirectories in current directory
156$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd))))
157endef #process-subdir
158
159# Top subdirectories
160$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd))))