1b0104773SPascal Brand# Input 2b0104773SPascal Brand# 3b0104773SPascal Brand# subdirs tells the subdirectories to descend 4b0104773SPascal Brand# 5b0104773SPascal Brand# Output 6b0104773SPascal Brand# 7b0104773SPascal Brand# set srcs 8b0104773SPascal Brand# set cflags-$(oname) cflags-remove-$(oname) 9b0104773SPascal Brand# aflags-$(oname) aflags-remove-$(oname) 10b0104773SPascal Brand# cppflags-$(oname) cppflags-remove-$(oname) 1173dc728dSJerome Forissier# incdirs-$(oname) 1273dc728dSJerome Forissier# incdirs-lib$(libname) [if libname is defined] 1373dc728dSJerome Forissier# cppflags-lib$(libname) [if libname is defined] 143d34e125SJerome Forissier# cflags-lib$(libname) [if libname is defined] 15b0104773SPascal Brand# for each file found, oname is the name of the object file for corresponding 16b0104773SPascal Brand# source file 17b0104773SPascal Brand 18b0104773SPascal Brandsrcs := 19b0104773SPascal Brand 20b0104773SPascal Branddefine process-subdir-srcs-y 21b0104773SPascal Brandifeq ($$(sub-dir),.) 22565e42f9SPascal Brandsrcs += $1 234334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $1).o 24b0104773SPascal Brandelse 25565e42f9SPascal Brandifneq ($(filter /%,$(1)),) 26565e42f9SPascal Brand# $1 is an absolute path - start with "/" 27565e42f9SPascal Brandsrcs += $1 284334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $1).o 29565e42f9SPascal Brandelse 30565e42f9SPascal Brandsrcs += $(sub-dir)/$1 314334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 32b0104773SPascal Brandendif 33565e42f9SPascal Brandendif 34b0104773SPascal Brandcflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 35b0104773SPascal Brandcflags-remove-$$(oname) := $$(cflags-remove-y) \ 36b0104773SPascal Brand $$(cflags-remove-$(1)-y) 37b0104773SPascal Brandcppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 38b0104773SPascal Brandcppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 39b0104773SPascal Brand $$(cppflags-remove-$(1)-y) 40b0104773SPascal Brandaflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 41b0104773SPascal Brandaflags-remove-$$(oname) := $$(aflags-remove-y) \ 42b0104773SPascal Brand $$(aflags-remove-$(1)-y) 4373dc728dSJerome Forissierincdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 44b0104773SPascal Brand# Clear local filename specific variables to avoid accidental reuse 45b0104773SPascal Brand# in another subdirectory 46b0104773SPascal Brandcflags-$(1)-y := 47b0104773SPascal Brandcflags-remove-$(1)-y := 483d34e125SJerome Forissiercflags-lib-y := 49b0104773SPascal Brandcppflags-$(1)-y := 50b0104773SPascal Brandcppflags-remove-$(1)-y := 5173dc728dSJerome Forissiercppflags-lib-y := 52b0104773SPascal Brandaflags-$(1)-y := 53b0104773SPascal Brandaflags-remove-$(1)-y := 5473dc728dSJerome Forissierincdirs-$(1)-y := 55b0104773SPascal Brandfname := 56b0104773SPascal Brandoname := 57b0104773SPascal Brandendef #process-subdir-srcs-y 58b0104773SPascal Brand 59*36a06054SJens Wiklanderdefine process-subdir-gensrcs-helper 60*36a06054SJens Wiklander# $1 gensrc-y element 61*36a06054SJens Wiklander# $2 full path and name of generated source file 62*36a06054SJens Wiklander# $3 full path and name of object file compiled from source file 63*36a06054SJens Wiklander# $4 full path to out directory 64*36a06054SJens Wiklander 65*36a06054SJens Wiklandergen-srcs2 += $2 66*36a06054SJens Wiklanderoname := $3 67*36a06054SJens Wiklander 68*36a06054SJens WiklanderFORCE-GENSRC: $2 69*36a06054SJens Wiklander 70*36a06054SJens Wiklander$$(addprefix $4,$$(produce-additional-$1)): $2 71*36a06054SJens Wiklander 72*36a06054SJens Wiklandersubdir-$2 := $$(sub-dir) 73*36a06054SJens Wiklanderrecipe-$2 := $$(recipe-$1) 74*36a06054SJens Wiklander$2: $$(depends-$1) 75*36a06054SJens Wiklander @$(cmd-echo-silent) ' GEN $2' 76*36a06054SJens Wiklander $(q)mkdir -p $4 77*36a06054SJens Wiklander $(q)$$(recipe-$2) 78*36a06054SJens Wiklander 79*36a06054SJens Wiklandercflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 80*36a06054SJens Wiklandercflags-remove-$$(oname) := $$(cflags-remove-y) \ 81*36a06054SJens Wiklander $$(cflags-remove-$(1)-y) 82*36a06054SJens Wiklandercppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 83*36a06054SJens Wiklandercppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 84*36a06054SJens Wiklander $$(cppflags-remove-$(1)-y) 85*36a06054SJens Wiklanderaflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 86*36a06054SJens Wiklanderaflags-remove-$$(oname) := $$(aflags-remove-y) \ 87*36a06054SJens Wiklander $$(aflags-remove-$(1)-y) 88*36a06054SJens Wiklanderincdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 89*36a06054SJens Wiklander# Clear local filename specific variables to avoid accidental reuse 90*36a06054SJens Wiklander# in another subdirectory 91*36a06054SJens Wiklandercflags-$(1)-y := 92*36a06054SJens Wiklandercflags-remove-$(1)-y := 93*36a06054SJens Wiklandercflags-lib-y := 94*36a06054SJens Wiklandercppflags-$(1)-y := 95*36a06054SJens Wiklandercppflags-remove-$(1)-y := 96*36a06054SJens Wiklandercppflags-lib-y := 97*36a06054SJens Wiklanderaflags-$(1)-y := 98*36a06054SJens Wiklanderaflags-remove-$(1)-y := 99*36a06054SJens Wiklanderincdirs-$(1)-y := 100*36a06054SJens Wiklanderfname := 101*36a06054SJens Wiklanderoname := 102*36a06054SJens Wiklander 103*36a06054SJens Wiklanderendef #process-subdir-gensrcs-helper 104*36a06054SJens Wiklander 105*36a06054SJens Wiklanderdefine process-subdir-gensrcs-y 106*36a06054SJens Wiklander$$(eval $$(call process-subdir-gensrcs-helper,$1,$(sub-dir-out)/$$(produce-$1),$(sub-dir-out)/$(basename $(produce-$1)).o,$(sub-dir-out))) 107*36a06054SJens Wiklanderendef #process-subdir-gensrcs-y 108*36a06054SJens Wiklander 109b0104773SPascal Branddefine process-subdir 110b0104773SPascal Brandsub-dir := $1 111*36a06054SJens Wiklanderifeq ($1,.) 112*36a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix) 113*36a06054SJens Wiklanderelse 114*36a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix)$1 115*36a06054SJens Wiklanderendif 116*36a06054SJens Wiklander 117b0104773SPascal Brandinclude $1/sub.mk 118b0104773SPascal Brandsub-subdirs := $$(addprefix $1/,$$(subdirs-y)) 119b0104773SPascal Brandincdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) 120*36a06054SJens Wiklanderthissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) 12173dc728dSJerome Forissierifneq ($$(libname),) 12273dc728dSJerome Forissierincdirs-lib$$(libname) := $$(incdirs-lib$$(libname)) $$(addprefix $1/,$$(incdirs-lib-y)) 1233d34e125SJerome Forissiercflags-lib$$(libname) := $$(cflags-lib$$(libname)) $$(cflags-lib-y) 12473dc728dSJerome Forissiercppflags-lib$$(libname) := $$(cppflags-lib$$(libname)) $$(cppflags-lib-y) 12573dc728dSJerome Forissierendif 126b0104773SPascal Brand 127b0104773SPascal Brand# Process files in current directory 128*36a06054SJens Wiklander$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g)))) 129b0104773SPascal Brand$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 130b0104773SPascal Brand# Clear flags used when processing current directory 131b0104773SPascal Brandsrcs-y := 132b0104773SPascal Brandcflags-y := 1333d34e125SJerome Forissiercflags-lib-y := 134b0104773SPascal Brandcppflags-y := 13573dc728dSJerome Forissiercppflags-lib-y := 136b0104773SPascal Brandaflags-y := 137b0104773SPascal Brandcflags-remove-y := 138b0104773SPascal Brandsubdirs-y := 139b0104773SPascal Brandglobal-incdirs-y := 14073dc728dSJerome Forissierincdirs-lib-y := 14173dc728dSJerome Forissierincdirs-y := 142*36a06054SJens Wiklandergensrcs-y := 143*36a06054SJens Wiklanderthis-out-dir := 144b0104773SPascal Brand 145b0104773SPascal Brand# Process subdirectories in current directory 146b0104773SPascal Brand$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd)))) 147b0104773SPascal Brandendef #process-subdir 148b0104773SPascal Brand 149b0104773SPascal Brand# Top subdirectories 150b0104773SPascal Brand$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd)))) 151