1b0104773SPascal Brand# Input 2b0104773SPascal Brand# 3b0104773SPascal Brand# subdirs tells the subdirectories to descend 4b0104773SPascal Brand# 5b0104773SPascal Brand# Output 6b0104773SPascal Brand# 713301e12SJens Wiklander# set srcs gen-srcs 8b0104773SPascal Brand# set cflags-$(oname) cflags-remove-$(oname) 9*4010618fSJerome Forissier# cxxflags-$(oname) cxxflags-remove-$(oname) 10b0104773SPascal Brand# aflags-$(oname) aflags-remove-$(oname) 11b0104773SPascal Brand# cppflags-$(oname) cppflags-remove-$(oname) 1273dc728dSJerome Forissier# incdirs-$(oname) 13606f378cSJerome Forissier# incdirs-lib$(libname)-$(sm) [if libname is defined] 14606f378cSJerome Forissier# cppflags-lib$(libname)-$(sm) [if libname is defined] 15606f378cSJerome Forissier# cflags-lib$(libname)-$(sm) [if libname is defined] 16*4010618fSJerome Forissier# cxxflags-lib$(libname)-$(sm) [if libname is defined] 17b0104773SPascal Brand# for each file found, oname is the name of the object file for corresponding 18b0104773SPascal Brand# source file 19b0104773SPascal Brand 20b0104773SPascal Brandsrcs := 2113301e12SJens Wiklandergen-srcs := 22070168e2SJerome Forissierasm-defines-files := 23b0104773SPascal Brand 24b0104773SPascal Branddefine process-subdir-srcs-y 25b0104773SPascal Brandifeq ($$(sub-dir),.) 26565e42f9SPascal Brandsrcs += $1 274334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $1).o 28b0104773SPascal Brandelse 29565e42f9SPascal Brandifneq ($(filter /%,$(1)),) 30565e42f9SPascal Brand# $1 is an absolute path - start with "/" 31565e42f9SPascal Brandsrcs += $1 324334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $1).o 33565e42f9SPascal Brandelse 34565e42f9SPascal Brandsrcs += $(sub-dir)/$1 354334e8d7SJerome Forissieroname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 36b0104773SPascal Brandendif 37565e42f9SPascal Brandendif 38b0104773SPascal Brandcflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 39b0104773SPascal Brandcflags-remove-$$(oname) := $$(cflags-remove-y) \ 40b0104773SPascal Brand $$(cflags-remove-$(1)-y) 41*4010618fSJerome Forissiercxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y) 42*4010618fSJerome Forissiercxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \ 43*4010618fSJerome Forissier $$(cxxflags-remove-$(1)-y) 44b0104773SPascal Brandcppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 45b0104773SPascal Brandcppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 46b0104773SPascal Brand $$(cppflags-remove-$(1)-y) 47b0104773SPascal Brandaflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 48b0104773SPascal Brandaflags-remove-$$(oname) := $$(aflags-remove-y) \ 49b0104773SPascal Brand $$(aflags-remove-$(1)-y) 5073dc728dSJerome Forissierincdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 51b0104773SPascal Brand# Clear local filename specific variables to avoid accidental reuse 52b0104773SPascal Brand# in another subdirectory 53b0104773SPascal Brandcflags-$(1)-y := 54b0104773SPascal Brandcflags-remove-$(1)-y := 553d34e125SJerome Forissiercflags-lib-y := 56*4010618fSJerome Forissiercxxflags-$(1)-y := 57*4010618fSJerome Forissiercxxflags-remove-$(1)-y := 58*4010618fSJerome Forissiercxxflags-lib-y := 59b0104773SPascal Brandcppflags-$(1)-y := 60b0104773SPascal Brandcppflags-remove-$(1)-y := 6173dc728dSJerome Forissiercppflags-lib-y := 62b0104773SPascal Brandaflags-$(1)-y := 63b0104773SPascal Brandaflags-remove-$(1)-y := 6473dc728dSJerome Forissierincdirs-$(1)-y := 65b0104773SPascal Brandfname := 66b0104773SPascal Brandoname := 67b0104773SPascal Brandendef #process-subdir-srcs-y 68b0104773SPascal Brand 6936a06054SJens Wiklanderdefine process-subdir-gensrcs-helper 7036a06054SJens Wiklander# $1 gensrc-y element 7136a06054SJens Wiklander# $2 full path and name of generated source file 7236a06054SJens Wiklander# $3 full path and name of object file compiled from source file 7336a06054SJens Wiklander# $4 full path to out directory 74cba8ca1cSJerome Forissier# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file) 7536a06054SJens Wiklander 76c95ce41fSJens Wiklandergen-srcs += $2 7727fd7c71SJerome Forissiercleanfiles += $2 7836a06054SJens Wiklanderoname := $3 7936a06054SJens Wiklander 80cba8ca1cSJerome ForissierFORCE-GENSRC$(sm): $(if $(filter y,$5),$2,) 8136a06054SJens Wiklander 8236a06054SJens Wiklander$$(addprefix $4,$$(produce-additional-$1)): $2 8336a06054SJens Wiklander 8436a06054SJens Wiklandersubdir-$2 := $$(sub-dir) 8536a06054SJens Wiklanderrecipe-$2 := $$(recipe-$1) 8636a06054SJens Wiklander$2: $$(depends-$1) 8736a06054SJens Wiklander @$(cmd-echo-silent) ' GEN $2' 8836a06054SJens Wiklander $(q)mkdir -p $4 8936a06054SJens Wiklander $(q)$$(recipe-$2) 9036a06054SJens Wiklander 9136a06054SJens Wiklandercflags-$$(oname) := $$(cflags-y) $$(cflags-$(1)-y) 9236a06054SJens Wiklandercflags-remove-$$(oname) := $$(cflags-remove-y) \ 9336a06054SJens Wiklander $$(cflags-remove-$(1)-y) 94*4010618fSJerome Forissiercxxflags-$$(oname) := $$(cxxflags-y) $$(cxxflags-$(1)-y) 95*4010618fSJerome Forissiercxxflags-remove-$$(oname) := $$(cxxflags-remove-y) \ 96*4010618fSJerome Forissier $$(cxxflags-remove-$(1)-y) 9736a06054SJens Wiklandercppflags-$$(oname) := $$(cppflags-y) $$(cppflags-$(1)-y) 9836a06054SJens Wiklandercppflags-remove-$$(oname) := $$(cppflags-remove-y) \ 9936a06054SJens Wiklander $$(cppflags-remove-$(1)-y) 10036a06054SJens Wiklanderaflags-$$(oname) := $$(aflags-y) $$(aflags-$(1)-y) 10136a06054SJens Wiklanderaflags-remove-$$(oname) := $$(aflags-remove-y) \ 10236a06054SJens Wiklander $$(aflags-remove-$(1)-y) 10336a06054SJens Wiklanderincdirs-$$(oname) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 10436a06054SJens Wiklander# Clear local filename specific variables to avoid accidental reuse 10536a06054SJens Wiklander# in another subdirectory 10636a06054SJens Wiklandercflags-$(1)-y := 10736a06054SJens Wiklandercflags-remove-$(1)-y := 10836a06054SJens Wiklandercflags-lib-y := 109*4010618fSJerome Forissiercxxflags-$(1)-y := 110*4010618fSJerome Forissiercxxflags-remove-$(1)-y := 111*4010618fSJerome Forissiercxxflags-lib-y := 11236a06054SJens Wiklandercppflags-$(1)-y := 11336a06054SJens Wiklandercppflags-remove-$(1)-y := 11436a06054SJens Wiklandercppflags-lib-y := 11536a06054SJens Wiklanderaflags-$(1)-y := 11636a06054SJens Wiklanderaflags-remove-$(1)-y := 11736a06054SJens Wiklanderincdirs-$(1)-y := 11836a06054SJens Wiklanderfname := 11936a06054SJens Wiklanderoname := 12036a06054SJens Wiklander 12136a06054SJens Wiklanderendef #process-subdir-gensrcs-helper 12236a06054SJens Wiklander 12336a06054SJens Wiklanderdefine process-subdir-gensrcs-y 124cba8ca1cSJerome Forissier$$(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))) 12536a06054SJens Wiklanderendef #process-subdir-gensrcs-y 12636a06054SJens Wiklander 127070168e2SJerome Forissierdefine process-subdir-asm-defines-y 128070168e2SJerome Forissierasm-defines-files += $(sub-dir)/$1 129070168e2SJerome Forissierendef #process-subdir-asm-defines-y 130070168e2SJerome Forissier 131b0104773SPascal Branddefine process-subdir 132b0104773SPascal Brandsub-dir := $1 13336a06054SJens Wiklanderifeq ($1,.) 1343e3182abSJerome Forissiersub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix)) 13536a06054SJens Wiklanderelse 13636a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix)$1 13736a06054SJens Wiklanderendif 13836a06054SJens Wiklander 139b0104773SPascal Brandinclude $1/sub.mk 140b0104773SPascal Brandsub-subdirs := $$(addprefix $1/,$$(subdirs-y)) 141b0104773SPascal Brandincdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) 14236a06054SJens Wiklanderthissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) 14373dc728dSJerome Forissierifneq ($$(libname),) 144606f378cSJerome Forissierincdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y)) 145606f378cSJerome Forissiercflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y) 146*4010618fSJerome Forissiercxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y) 147606f378cSJerome Forissiercppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y) 14873dc728dSJerome Forissierendif 149b0104773SPascal Brand 150b0104773SPascal Brand# Process files in current directory 15136a06054SJens Wiklander$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g)))) 152b0104773SPascal Brand$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 153070168e2SJerome Forissier$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a)))) 154b0104773SPascal Brand# Clear flags used when processing current directory 155b0104773SPascal Brandsrcs-y := 156b0104773SPascal Brandcflags-y := 1573d34e125SJerome Forissiercflags-lib-y := 158*4010618fSJerome Forissiercxxflags-y := 159*4010618fSJerome Forissiercxxflags-lib-y := 160b0104773SPascal Brandcppflags-y := 16173dc728dSJerome Forissiercppflags-lib-y := 162b0104773SPascal Brandaflags-y := 163b0104773SPascal Brandcflags-remove-y := 164*4010618fSJerome Forissiercxxflags-remove-y := 165098883e8SJens Wiklanderaflags-remove-y := 166b0104773SPascal Brandsubdirs-y := 167b0104773SPascal Brandglobal-incdirs-y := 16873dc728dSJerome Forissierincdirs-lib-y := 16973dc728dSJerome Forissierincdirs-y := 17036a06054SJens Wiklandergensrcs-y := 17136a06054SJens Wiklanderthis-out-dir := 172070168e2SJerome Forissierasm-defines-y := 173b0104773SPascal Brand 174b0104773SPascal Brand# Process subdirectories in current directory 175b0104773SPascal Brand$$(foreach sd, $$(sub-subdirs), $$(eval $$(call process-subdir,$$(sd)))) 176b0104773SPascal Brandendef #process-subdir 177b0104773SPascal Brand 178b0104773SPascal Brand# Top subdirectories 179b0104773SPascal Brand$(foreach sd, $(subdirs), $(eval $(call process-subdir,$(sd)))) 180