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# for each file found, oname is the name of the object file for corresponding 15# source file 16 17srcs := 18 19define process-subdir-srcs-y 20ifeq ($$(sub-dir),.) 21srcs += $1 22oname := $(out-dir)/$(base-prefix)$(basename $1).o 23else 24ifneq ($(filter /%,$(1)),) 25# $1 is an absolute path - start with "/" 26srcs += $1 27oname := $(out-dir)/$(base-prefix)$(basename $1).o 28else 29srcs += $(sub-dir)/$1 30oname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 31endif 32endif 33cflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 34cflags-remove-$$(oname) := $$(cflags-remove-y) \ 35 $$(cflags-remove-$(1)-y) 36cppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 37cppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 38 $$(cppflags-remove-$(1)-y) 39aflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 40aflags-remove-$$(oname) := $$(aflags-remove-y) \ 41 $$(aflags-remove-$(1)-y) 42incdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 43# Clear local filename specific variables to avoid accidental reuse 44# in another subdirectory 45cflags-$(1)-y := 46cflags-remove-$(1)-y := 47cppflags-$(1)-y := 48cppflags-remove-$(1)-y := 49cppflags-lib-y := 50aflags-$(1)-y := 51aflags-remove-$(1)-y := 52incdirs-$(1)-y := 53fname := 54oname := 55endef #process-subdir-srcs-y 56 57define process-subdir 58sub-dir := $1 59include $1/sub.mk 60sub-subdirs := $$(addprefix $1/,$$(subdirs-y)) 61incdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) 62thissubdir-incdirs := $$(addprefix $1/,$$(incdirs-y)) 63ifneq ($$(libname),) 64incdirs-lib$$(libname) := $$(incdirs-lib$$(libname)) $$(addprefix $1/,$$(incdirs-lib-y)) 65cppflags-lib$$(libname) := $$(cppflags-lib$$(libname)) $$(cppflags-lib-y) 66endif 67 68# Process files in current directory 69$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 70# Clear flags used when processing current directory 71srcs-y := 72cflags-y := 73cppflags-y := 74cppflags-lib-y := 75aflags-y := 76cflags-remove-y := 77subdirs-y := 78global-incdirs-y := 79incdirs-lib-y := 80incdirs-y := 81 82# Process subdirectories in current directory 83$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd)))) 84endef #process-subdir 85 86# Top subdirectories 87$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd)))) 88