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) 94010618fSJerome 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] 164010618fSJerome 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 24001524d4SJerome Forissieruniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1))) 25001524d4SJerome Forissier 26*2e480519SJens Wiklanderdefine process-file-vars-helper 27*2e480519SJens Wiklander# $1 is local source file name 2843d2c044SJens Wiklander# $2 is output file name 2943d2c044SJens Wiklandercflags-$(2) := $$(cflags-y) $$(cflags-$(1)-y) 3043d2c044SJens Wiklandercflags-remove-$(2) := $$(cflags-remove-y) $$(cflags-remove-$(1)-y) 3143d2c044SJens Wiklandercxxflags-$(2) := $$(cxxflags-y) $$(cxxflags-$(1)-y) 3243d2c044SJens Wiklandercxxflags-remove-$(2) := $$(cxxflags-remove-y) $$(cxxflags-remove-$(1)-y) 3343d2c044SJens Wiklandercppflags-$(2) := $$(cppflags-y) $$(cppflags-$(1)-y) 3443d2c044SJens Wiklandercppflags-remove-$(2) := $$(cppflags-remove-y) $$(cppflags-remove-$(1)-y) 3543d2c044SJens Wiklanderaflags-$(2) := $$(aflags-y) $$(aflags-$(1)-y) 3643d2c044SJens Wiklanderaflags-remove-$(2) := $$(aflags-remove-y) $$(aflags-remove-$(1)-y) 3743d2c044SJens Wiklanderincdirs-$(2) := $$(thissubdir-incdirs) $$(addprefix $(sub-dir)/,$$(incdirs-$(1)-y)) 38b0104773SPascal Brand# Clear local filename specific variables to avoid accidental reuse 39b0104773SPascal Brand# in another subdirectory 40b0104773SPascal Brandcflags-$(1)-y := 41b0104773SPascal Brandcflags-remove-$(1)-y := 423d34e125SJerome Forissiercflags-lib-y := 434010618fSJerome Forissiercxxflags-$(1)-y := 444010618fSJerome Forissiercxxflags-remove-$(1)-y := 454010618fSJerome Forissiercxxflags-lib-y := 46b0104773SPascal Brandcppflags-$(1)-y := 47b0104773SPascal Brandcppflags-remove-$(1)-y := 4873dc728dSJerome Forissiercppflags-lib-y := 49b0104773SPascal Brandaflags-$(1)-y := 50b0104773SPascal Brandaflags-remove-$(1)-y := 5173dc728dSJerome Forissierincdirs-$(1)-y := 52*2e480519SJens Wiklanderendef #process-file-vars-helper 53*2e480519SJens Wiklander 54*2e480519SJens Wiklanderdefine process-file-vars 55*2e480519SJens Wiklander# $1 is local source file name 56*2e480519SJens Wiklander# $2 is output file name 57*2e480519SJens Wiklander# $3 is tree source file name 58*2e480519SJens Wiklanderoname-$(sm)-$3 := $$(if $$(oname-$1-y),$(out-dir)/$(base-prefix)/$$(oname-$1-y),$2) 59*2e480519SJens Wiklander$$(eval $$(call process-file-vars-helper,$1,$$(oname-$(sm)-$3))) 60*2e480519SJens Wiklanderendef 6143d2c044SJens Wiklander 6243d2c044SJens Wiklanderdefine process-subdir-srcs-y 6343d2c044SJens Wiklanderifeq ($$(sub-dir),.) 6443d2c044SJens Wiklandersrcs += $1 65*2e480519SJens Wiklanderfname := $1 6643d2c044SJens Wiklanderoname := $(out-dir)/$(base-prefix)$(basename $1).o 6743d2c044SJens Wiklanderelse 6843d2c044SJens Wiklanderifneq ($(filter /%,$(1)),) 6943d2c044SJens Wiklander# $1 is an absolute path - start with "/" 7043d2c044SJens Wiklandersrcs += $1 71*2e480519SJens Wiklanderfname := $1 7243d2c044SJens Wiklanderoname := $(out-dir)/$(base-prefix)$(basename $1).o 7343d2c044SJens Wiklanderelse 7443d2c044SJens Wiklandersrcs += $(sub-dir)/$1 75*2e480519SJens Wiklanderfname := $(sub-dir)/$1 7643d2c044SJens Wiklanderoname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 7743d2c044SJens Wiklanderendif 7843d2c044SJens Wiklanderendif 79*2e480519SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname),$$(fname))) 80*2e480519SJens Wiklanderendef #process-subdir-srcs-y 81*2e480519SJens Wiklander 82*2e480519SJens Wiklanderdefine process-subdir-srcs_ext-y 83*2e480519SJens Wiklanderifneq ($(filter /%,$(1)),) 84*2e480519SJens Wiklander$$(error Absolute path not supported for srcs_ext-y: $(1)) 85*2e480519SJens Wiklanderendif 86*2e480519SJens Wiklandersrcs += $2/$1 87*2e480519SJens Wiklanderfname := $2/$1 88*2e480519SJens Wiklanderifeq ($$(sub-dir),.) 89*2e480519SJens Wiklanderoname := $(out-dir)/$(base-prefix)$(basename $1).o 90*2e480519SJens Wiklanderelse 91*2e480519SJens Wiklanderoname := $(out-dir)/$(base-prefix)$(basename $$(sub-dir)/$1).o 92*2e480519SJens Wiklanderendif 93*2e480519SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname),$$(fname))) 94b0104773SPascal Brandendef #process-subdir-srcs-y 95b0104773SPascal Brand 9636a06054SJens Wiklanderdefine process-subdir-gensrcs-helper 9736a06054SJens Wiklander# $1 gensrc-y element 9836a06054SJens Wiklander# $2 full path and name of generated source file 9936a06054SJens Wiklander# $3 full path and name of object file compiled from source file 10036a06054SJens Wiklander# $4 full path to out directory 101cba8ca1cSJerome Forissier# $5 y if $2 must be generated before $(sm) starts building (e.g., .h file) 10236a06054SJens Wiklander 103c95ce41fSJens Wiklandergen-srcs += $2 10427fd7c71SJerome Forissiercleanfiles += $2 10536a06054SJens Wiklanderoname := $3 10636a06054SJens Wiklander 107cba8ca1cSJerome ForissierFORCE-GENSRC$(sm): $(if $(filter y,$5),$2,) 10836a06054SJens Wiklander 10936a06054SJens Wiklander$$(addprefix $4,$$(produce-additional-$1)): $2 11036a06054SJens Wiklander 11136a06054SJens Wiklandersubdir-$2 := $$(sub-dir) 11236a06054SJens Wiklanderrecipe-$2 := $$(recipe-$1) 11336a06054SJens Wiklander$2: $$(depends-$1) 11436a06054SJens Wiklander @$(cmd-echo-silent) ' GEN $2' 11536a06054SJens Wiklander $(q)mkdir -p $4 11636a06054SJens Wiklander $(q)$$(recipe-$2) 11736a06054SJens Wiklander 11843d2c044SJens Wiklander$$(eval $$(call process-file-vars,$1,$$(oname))) 11936a06054SJens Wiklanderendef #process-subdir-gensrcs-helper 12036a06054SJens Wiklander 12136a06054SJens Wiklanderdefine process-subdir-gensrcs-y 122cba8ca1cSJerome 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))) 12336a06054SJens Wiklanderendef #process-subdir-gensrcs-y 12436a06054SJens Wiklander 125070168e2SJerome Forissierdefine process-subdir-asm-defines-y 126070168e2SJerome Forissierasm-defines-files += $(sub-dir)/$1 127070168e2SJerome Forissierendef #process-subdir-asm-defines-y 128070168e2SJerome Forissier 129b0104773SPascal Branddefine process-subdir 130b0104773SPascal Brandsub-dir := $1 13136a06054SJens Wiklanderifeq ($1,.) 1323e3182abSJerome Forissiersub-dir-out := $(patsubst %/,%,$(out-dir)/$(base-prefix)) 13336a06054SJens Wiklanderelse 13436a06054SJens Wiklandersub-dir-out := $(out-dir)/$(base-prefix)$1 13536a06054SJens Wiklanderendif 13636a06054SJens Wiklander 137b0104773SPascal Brandinclude $1/sub.mk 138d50ff941SJorge Ramirez-Ortizsub-subdirs := $$(addprefix $1/,$$(subdirs-y)) $$(subdirs_ext-y) 1395db2cbd7SJens Wiklanderincdirs$(sm) := $(incdirs$(sm)) $$(addprefix $1/,$$(global-incdirs-y)) $$(global-incdirs_ext-y) 140b7c039ebSJens Wiklandercppflags$(sm) := $$(cppflags$(sm)) $$(global-cppflags-y) 141d50ff941SJorge Ramirez-Ortizthissubdir-incdirs := $(out-dir)/$(base-prefix)$1 $$(addprefix $1/,$$(incdirs-y)) $$(incdirs_ext-y) 14273dc728dSJerome Forissierifneq ($$(libname),) 143606f378cSJerome Forissierincdirs-lib$$(libname)-$$(sm) := $$(incdirs-lib$$(libname)-$$(sm)) $$(addprefix $1/,$$(incdirs-lib-y)) 144606f378cSJerome Forissiercflags-lib$$(libname)-$$(sm) := $$(cflags-lib$$(libname)-$$(sm)) $$(cflags-lib-y) 1454010618fSJerome Forissiercxxflags-lib$$(libname)-$$(sm) := $$(cxxflags-lib$$(libname)-$$(sm)) $$(cxxflags-lib-y) 146606f378cSJerome Forissiercppflags-lib$$(libname)-$$(sm) := $$(cppflags-lib$$(libname)-$$(sm)) $$(cppflags-lib-y) 14773dc728dSJerome Forissierendif 148b0104773SPascal Brand 149b0104773SPascal Brand# Process files in current directory 15036a06054SJens Wiklander$$(foreach g, $$(gensrcs-y), $$(eval $$(call process-subdir-gensrcs-y,$$(g)))) 151b0104773SPascal Brand$$(foreach s, $$(srcs-y), $$(eval $$(call process-subdir-srcs-y,$$(s)))) 152*2e480519SJens Wiklander$$(foreach s, $$(srcs_ext-y), $$(eval $$(call \ 153*2e480519SJens Wiklander process-subdir-srcs_ext-y,$$(s),$$(firstword $$(srcs_ext_base-y))))) 154070168e2SJerome Forissier$$(foreach a, $$(asm-defines-y), $$(eval $$(call process-subdir-asm-defines-y,$$(a)))) 155b0104773SPascal Brand# Clear flags used when processing current directory 156b0104773SPascal Brandsrcs-y := 157*2e480519SJens Wiklandersrcs_ext-y := 158*2e480519SJens Wiklandersrcs_ext_base-y := 159b0104773SPascal Brandcflags-y := 1603d34e125SJerome Forissiercflags-lib-y := 1614010618fSJerome Forissiercxxflags-y := 1624010618fSJerome Forissiercxxflags-lib-y := 163b0104773SPascal Brandcppflags-y := 16473dc728dSJerome Forissiercppflags-lib-y := 165b0104773SPascal Brandaflags-y := 166b0104773SPascal Brandcflags-remove-y := 1674010618fSJerome Forissiercxxflags-remove-y := 168098883e8SJens Wiklanderaflags-remove-y := 169b0104773SPascal Brandsubdirs-y := 170d50ff941SJorge Ramirez-Ortizsubdirs_ext-y := 171b0104773SPascal Brandglobal-incdirs-y := 1725db2cbd7SJens Wiklanderglobal-incdirs_ext-y := 173b7c039ebSJens Wiklanderglobal-cppflags-y := 17473dc728dSJerome Forissierincdirs-lib-y := 17573dc728dSJerome Forissierincdirs-y := 176d50ff941SJorge Ramirez-Ortizincdirs_ext-y := 17736a06054SJens Wiklandergensrcs-y := 17836a06054SJens Wiklanderthis-out-dir := 179070168e2SJerome Forissierasm-defines-y := 180b0104773SPascal Brand 181b0104773SPascal Brand# Process subdirectories in current directory 182001524d4SJerome Forissier$$(foreach sd, $$(call uniq,$$(sub-subdirs)), $$(eval $$(call process-subdir,$$(sd)))) 183b0104773SPascal Brandendef #process-subdir 184b0104773SPascal Brand 185b0104773SPascal Brand# Top subdirectories 186001524d4SJerome Forissier$(foreach sd, $(call uniq,$(subdirs)), $(eval $(call process-subdir,$(sd)))) 187