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 := 20 21define process-subdir-srcs-y 22ifeq ($$(sub-dir),.) 23srcs += $1 24oname := $(out-dir)/$(base-prefix)$(basename $1).o 25else 26ifneq ($(filter /%,$(1)),) 27# $1 is an absolute path - start with "/" 28srcs += $1 29oname := $(out-dir)/$(base-prefix)$(basename $1).o 30else 31srcs += $(sub-dir)/$1 32oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 33endif 34endif 35cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 36cflags-remove-$$(oname) := $$(cflags-remove-y) \ 37 $$(cflags-remove-$(1)-y) 38cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 39cppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 40 $$(cppflags-remove-$(1)-y) 41aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 42aflags-remove-$$(oname) := $$(aflags-remove-y) \ 43 $$(aflags-remove-$(1)-y) 44incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 45# Clear local filename specific variables to avoid accidental reuse 46# in another subdirectory 47cflags-$(1)-y := 48cflags-remove-$(1)-y := 49cflags-lib-y := 50cppflags-$(1)-y := 51cppflags-remove-$(1)-y := 52cppflags-lib-y := 53aflags-$(1)-y := 54aflags-remove-$(1)-y := 55incdirs-$(1)-y := 56fname := 57oname := 58endef #process-subdir-srcs-y 59 60define process-subdir-gensrcs-helper 61# $1 gensrc-y element 62# $2 full path and name of generated source file 63# $3 full path and name of object file compiled from source file 64# $4 full path to out directory 65 66gen-srcs += $2 67oname := $3 68 69FORCE-GENSRC: $2 70 71$$(addprefix $4,$$(produce-additional-$1)): $2 72 73subdir-$2 := $$(sub-dir) 74recipe-$2 := $$(recipe-$1) 75$2: $$(depends-$1) 76 @$(cmd-echo-silent) ' GEN $2' 77 $(q)mkdir -p $4 78 $(q)$$(recipe-$2) 79 80cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 81cflags-remove-$$(oname) := $$(cflags-remove-y) \ 82 $$(cflags-remove-$(1)-y) 83cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 84cppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 85 $$(cppflags-remove-$(1)-y) 86aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 87aflags-remove-$$(oname) := $$(aflags-remove-y) \ 88 $$(aflags-remove-$(1)-y) 89incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 90# Clear local filename specific variables to avoid accidental reuse 91# in another subdirectory 92cflags-$(1)-y := 93cflags-remove-$(1)-y := 94cflags-lib-y := 95cppflags-$(1)-y := 96cppflags-remove-$(1)-y := 97cppflags-lib-y := 98aflags-$(1)-y := 99aflags-remove-$(1)-y := 100incdirs-$(1)-y := 101fname := 102oname := 103 104endef #process-subdir-gensrcs-helper 105 106define process-subdir-gensrcs-y 107$$(eval $$(call process-subdir-gensrcs-helper,$1,$(sub-dir-out)/$$(produce-$1),$(sub-dir-out)/$(basename $(produce-$1)).o,$(sub-dir-out))) 108endef #process-subdir-gensrcs-y 109 110define process-subdir 111sub-dir := $1 112ifeq ($1,.) 113sub-dir-out := $(out-dir)/$(base-prefix) 114else 115sub-dir-out := $(out-dir)/$(base-prefix)$1 116endif 117 118include $1/sub.mk 119sub-subdirs := $$(addprefix $1/,$$(subdirs-y)) 120incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) 121thissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) 122ifneq ($$(libname),) 123incdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y)) 124cflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y) 125cppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y) 126endif 127 128# Process files in current directory 129$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g)))) 130$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 131# Clear flags used when processing current directory 132srcs-y := 133cflags-y := 134cflags-lib-y := 135cppflags-y := 136cppflags-lib-y := 137aflags-y := 138cflags-remove-y := 139subdirs-y := 140global-incdirs-y := 141incdirs-lib-y := 142incdirs-y := 143gensrcs-y := 144this-out-dir := 145 146# Process subdirectories in current directory 147$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd)))) 148endef #process-subdir 149 150# Top subdirectories 151$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd)))) 152