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