1# Input 2# 3# subdirs tells the subdirectories to descend 4# 5# Output 6# 7# set srcs gen-srcs 8# set cflags-$(oname) cflags-remove-$(oname) 9# aflags-$(oname) aflags-remove-$(oname) 10# cppflags-$(oname) cppflags-remove-$(oname) 11# incdirs-$(oname) 12# 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] 15# for each file found, oname is the name of the object file for corresponding 16# source file 17 18srcs := 19gen-srcs := 20asm-defines-files := 21 22define process-subdir-srcs-y 23ifeq ($$(sub-dir),.) 24srcs += $1 25oname := $(out-dir)/$(base-prefix)$(basename $1).o 26else 27ifneq ($(filter /%,$(1)),) 28# $1 is an absolute path - start with "/" 29srcs += $1 30oname := $(out-dir)/$(base-prefix)$(basename $1).o 31else 32srcs += $(sub-dir)/$1 33oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 34endif 35endif 36cflags-$$(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) 45incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 46# Clear local filename specific variables to avoid accidental reuse 47# in another subdirectory 48cflags-$(1)-y := 49cflags-remove-$(1)-y := 50cflags-lib-y := 51cppflags-$(1)-y := 52cppflags-remove-$(1)-y := 53cppflags-lib-y := 54aflags-$(1)-y := 55aflags-remove-$(1)-y := 56incdirs-$(1)-y := 57fname := 58oname := 59endef #process-subdir-srcs-y 60 61define 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 66# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file) 67 68gen-srcs += $2 69cleanfiles += $2 70oname := $3 71 72FORCE-GENSRC$(sm): $(if $(filter y,$5),$2,) 73 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 110$$(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))) 111endef #process-subdir-gensrcs-y 112 113define process-subdir-asm-defines-y 114asm-defines-files += $(sub-dir)/$1 115endef #process-subdir-asm-defines-y 116 117define process-subdir 118sub-dir := $1 119ifeq ($1,.) 120sub-dir-out := $(out-dir)/$(base-prefix) 121else 122sub-dir-out := $(out-dir)/$(base-prefix)$1 123endif 124 125include $1/sub.mk 126sub-subdirs := $$(addprefix $1/,$$(subdirs-y)) 127incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) 128thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) 129ifneq ($$(libname),) 130incdirs-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) 133endif 134 135# Process files in current directory 136$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g)))) 137$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 138$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a)))) 139# Clear flags used when processing current directory 140srcs-y := 141cflags-y := 142cflags-lib-y := 143cppflags-y := 144cppflags-lib-y := 145aflags-y := 146cflags-remove-y := 147subdirs-y := 148global-incdirs-y := 149incdirs-lib-y := 150incdirs-y := 151gensrcs-y := 152this-out-dir := 153asm-defines-y := 154 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)))) 161